daea9e481baa4a4f22d19293a92f688e8c622020
[cinaest] / src / movie-list-menu.vala
1 /* This file is part of Cinaest.
2  *
3  * Copyright (C) 2009 Philipp Zabel
4  *
5  * Cinaest is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * Cinaest is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with Cinaest. If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 using Gtk;
20 using Hildon;
21
22 public class MovieListMenu : AppMenu {
23         public MovieListStore store;
24         public MovieFilter filter;
25         private weak MovieListWindow movie_list_window;
26         private Hildon.Button filter_year;
27         private Hildon.Button filter_rating;
28         private Hildon.Button filter_genres;
29         private Gtk.Button poster_view;
30         private Gtk.Button delete_movies;
31         private Gtk.Button import_movies;
32
33         public signal void filter_changed ();
34
35         public MovieListMenu (MovieListWindow window) {
36                 movie_list_window = window;
37         }
38
39         construct {
40                 // Add sort buttons as view menu filters
41                 var sort_by_title = new RadioButton.with_label (null, _("ABC"));
42                 var sort_by_year = new RadioButton.with_label_from_widget (sort_by_title, _("Year"));
43                 var sort_by_rating = new RadioButton.with_label_from_widget (sort_by_title, _("Rating"));
44
45                 // Draw them as toggle buttons, not as radio buttons
46                 sort_by_title.set_mode (false);
47                 sort_by_year.set_mode (false);
48                 sort_by_rating.set_mode (false);
49
50                 // TODO - get this from GConf
51                 sort_by_title.set_active (true);
52
53                 // Connect signals
54                 sort_by_title.toggled.connect (button => {
55                         if (button.get_active ())
56                                 store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
57                 });
58                 sort_by_year.toggled.connect (button => {
59                         if (button.get_active ())
60                                 store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
61                 });
62                 sort_by_rating.toggled.connect (button => {
63                         if (button.get_active ())
64                                 store.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
65                 });
66
67                 add_filter (sort_by_title);
68                 add_filter (sort_by_year);
69                 add_filter (sort_by_rating);
70
71                 // Add view menu buttons
72                 filter_year = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by year"), _("Off"));
73                 filter_rating = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by rating"), _("Off"));
74                 filter_genres = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by genres"), _("Off"));
75                 poster_view = new Gtk.Button.with_label (_("Poster view"));
76                 delete_movies = new Gtk.Button.with_label (_("Delete movies"));
77                 import_movies = new Gtk.Button.with_label (_("Import movies"));
78                 var settings = new Gtk.Button.with_label (_("Settings"));
79
80                 filter_year.set_style (ButtonStyle.PICKER);
81                 filter_rating.set_style (ButtonStyle.PICKER);
82                 filter_genres.set_style (ButtonStyle.PICKER);
83
84                 // Connect signals
85                 filter_year.clicked.connect (on_filter_year_clicked);
86                 filter_rating.clicked.connect (on_filter_rating_clicked);
87                 filter_genres.clicked.connect (on_filter_genres_clicked);
88                 poster_view.clicked.connect (on_poster_view_clicked);
89                 delete_movies.clicked.connect (() => { movie_list_window.on_delete_movies_clicked (); });
90                 import_movies.clicked.connect (on_import_movies_clicked);
91                 settings.clicked.connect (on_settings_clicked);
92
93                 append (filter_year);
94                 append (filter_rating);
95                 append (filter_genres);
96                 append (poster_view);
97                 append (import_movies);
98                 append (delete_movies);
99                 append (settings);
100
101                 show_all ();
102         }
103
104         private MovieSource source_;
105         public MovieSource source {
106                 set {
107                         source_ = value;
108                         if (source_ != null && SourceFlags.EDITABLE in source_.get_flags ()) {
109                                 delete_movies.show ();
110                                 import_movies.show ();
111                         } else {
112                                 delete_movies.hide ();
113                                 import_movies.hide ();
114                         }
115                 }
116         }
117
118         public void on_filter_year_clicked () {
119                 var dialog = new PickerDialog (movie_list_window);
120                 dialog.set_title (_("Filter by year"));
121
122                 var year_store = new ListStore (1, typeof (string));
123                 TreeIter iter;
124                 for (int i = 0; i < 128; i++) {
125                         year_store.append (out iter);
126                         year_store.set_value (iter, 0, "%d".printf (1888 + i));
127                 }
128
129                 var selector = new TouchSelector ();
130                 selector.append_text_column (year_store, true);
131                 selector.append_text_column (year_store, true);
132                 if (filter.year_min > 1888 && filter.year_min < 2015) {
133                         selector.set_active (0, filter.year_min - 1888);
134                 } else {
135                         selector.set_active (0, 0);
136                 }
137                 if (filter.year_max > 1888 && filter.year_max < 2015) {
138                         selector.set_active (1, filter.year_max - 1888);
139                 } else {
140                         selector.set_active (1, 127);
141                 }
142                 selector.center_on_selected ();
143                 dialog.set_selector (selector);
144
145                 var res = dialog.run ();
146                 if (res == ResponseType.OK) {
147                         filter.year_min = 1888 + selector.get_active (0);
148                         if (filter.year_min <= 1888)
149                                 filter.year_min = 0;
150                         filter.year_max = 1888 + selector.get_active (1);
151                         if (filter.year_max >= 2015)
152                                 filter.year_max = 0;
153
154                         if (filter.year_min == 0 && filter.year_max == 0)
155                                 filter_year.set_value (_("Off"));
156                         else if (filter.year_min == 0)
157                                 filter_year.set_value (_("Until %d").printf (filter.year_max));
158                         else if (filter.year_max == 0)
159                                 filter_year.set_value (_("Since %d").printf (filter.year_min));
160                         else if (filter.year_min == filter.year_max)
161                                 filter_year.set_value ("%d".printf (filter.year_min));
162                         else
163                                 filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
164
165                         filter_changed ();
166                 }
167                 dialog.destroy ();
168         }
169
170         public void on_filter_rating_clicked () {
171                 var dialog = new PickerDialog (movie_list_window);
172                 dialog.set_title (_("Filter by rating"));
173
174                 var selector = new TouchSelector.text ();
175                 for (int i = 0; i < 10; i++) {
176                         selector.append_text ("%d.0".printf (9 - i));
177                 }
178                 selector.set_active (0, 9 - (filter.rating_min / 10));
179                 dialog.set_selector (selector);
180
181                 var res = dialog.run ();
182                 if (res == ResponseType.OK) {
183                         filter.rating_min = (9 - selector.get_active (0)) * 10;
184
185                         if (filter.rating_min == 0)
186                                 filter_rating.set_value (_("Off"));
187                         else
188                                 filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
189
190                         filter_changed ();
191                 }
192                 dialog.destroy ();
193         }
194
195         public void on_filter_genres_clicked () {
196                 var dialog = new GenreFilterDialog (movie_list_window);
197                 string s;
198
199                 var res = dialog.run (filter);
200
201                 if (res == ResponseType.OK) {
202                         s = filter.genres.to_string ();
203                         if (s != null)
204                                 filter_genres.set_value (s);
205                         else
206                                 filter_genres.set_value (_("Off"));
207
208                         filter_changed ();
209                 }
210         }
211
212         public void on_poster_view_clicked (Gtk.Button button) {
213                 var poster_mode = movie_list_window.get_movie_list_view ().poster_mode;
214                 movie_list_window.get_movie_list_view ().poster_mode = !poster_mode;
215                 poster_view.set_label (poster_mode ? _("Poster view") : _("List view"));
216         }
217
218         public void on_import_movies_clicked (Gtk.Button button) {
219                 var dialog = new Gtk.Dialog ();
220                 dialog.set_transient_for (movie_list_window);
221                 dialog.set_title (_("Import movies"));
222 /*
223                 // import movies or ratings from some source
224                 for (var Plugin in CinaestProgram.plugins) {
225                         if (plugin.can_export_ratings ()) {
226                                 exporters++;
227                         }
228                 }
229                 if (exporters > 1)
230                         exporter = run_exporter_selection_dialog
231 */
232                 dialog.run ();
233         }
234
235         public void on_settings_clicked (Gtk.Button button) {
236                 var dialog = new SettingsDialog (movie_list_window);
237
238                 dialog.run ();
239         }
240 }