Czech translation update (via transifex.net)
[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         private Gtk.Button export_movies;
33
34         public signal void filter_changed ();
35
36         public MovieListMenu (MovieListWindow window) {
37                 movie_list_window = window;
38         }
39
40         construct {
41                 // Add sort buttons as view menu filters
42                 var sort_by_title = new RadioButton.with_label (null, _("ABC"));
43                 var sort_by_year = new RadioButton.with_label_from_widget (sort_by_title, _("Year"));
44                 var sort_by_rating = new RadioButton.with_label_from_widget (sort_by_title, _("Rating"));
45
46                 // Draw them as toggle buttons, not as radio buttons
47                 sort_by_title.set_mode (false);
48                 sort_by_year.set_mode (false);
49                 sort_by_rating.set_mode (false);
50
51                 // TODO - get this from GConf
52                 sort_by_title.set_active (true);
53
54                 // Connect signals
55                 sort_by_title.toggled.connect (button => {
56                         if (button.get_active ())
57                                 store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
58                 });
59                 sort_by_year.toggled.connect (button => {
60                         if (button.get_active ())
61                                 store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
62                 });
63                 sort_by_rating.toggled.connect (button => {
64                         if (button.get_active ())
65                                 store.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
66                 });
67
68                 add_filter (sort_by_title);
69                 add_filter (sort_by_year);
70                 add_filter (sort_by_rating);
71
72                 // Add view menu buttons
73                 filter_year = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by year"), _("Off"));
74                 filter_rating = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by rating"), _("Off"));
75                 filter_genres = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by genres"), _("Off"));
76                 poster_view = new Gtk.Button.with_label (_("Poster view"));
77                 delete_movies = new Gtk.Button.with_label (_("Delete movies"));
78                 import_movies = new Gtk.Button.with_label (_("Import movies"));
79                 export_movies = new Gtk.Button.with_label (_("Export movies"));
80                 var settings = new Gtk.Button.with_label (_("Settings"));
81
82                 filter_year.set_style (ButtonStyle.PICKER);
83                 filter_rating.set_style (ButtonStyle.PICKER);
84                 filter_genres.set_style (ButtonStyle.PICKER);
85
86                 // Connect signals
87                 filter_year.clicked.connect (on_filter_year_clicked);
88                 filter_rating.clicked.connect (on_filter_rating_clicked);
89                 filter_genres.clicked.connect (on_filter_genres_clicked);
90                 poster_view.clicked.connect (on_poster_view_clicked);
91                 delete_movies.clicked.connect (() => { movie_list_window.on_delete_movies_clicked (); });
92                 import_movies.clicked.connect (on_import_movies_clicked);
93                 export_movies.clicked.connect (on_export_movies_clicked);
94                 settings.clicked.connect (on_settings_clicked);
95
96                 append (filter_year);
97                 append (filter_rating);
98                 append (filter_genres);
99                 append (poster_view);
100                 append (import_movies);
101                 append (export_movies);
102                 append (delete_movies);
103                 append (settings);
104
105                 show_all ();
106         }
107
108         private MovieSource source_;
109         public MovieSource source {
110                 set {
111                         source_ = value;
112                         if (source_ != null && SourceFlags.EDITABLE in source_.get_flags ()) {
113                                 delete_movies.show ();
114                                 import_movies.show ();
115                                 export_movies.show ();
116                         } else {
117                                 delete_movies.hide ();
118                                 import_movies.hide ();
119                                 export_movies.hide ();
120                         }
121                 }
122         }
123
124         public void on_filter_year_clicked () {
125                 var dialog = new PickerDialog (movie_list_window);
126                 dialog.set_title (_("Filter by year"));
127
128                 var year_store = new ListStore (1, typeof (string));
129                 TreeIter iter;
130                 for (int i = 0; i < 128; i++) {
131                         year_store.append (out iter);
132                         year_store.set_value (iter, 0, "%d".printf (1888 + i));
133                 }
134
135                 var selector = new TouchSelector ();
136                 selector.append_text_column (year_store, true);
137                 selector.append_text_column (year_store, true);
138                 if (filter.year_min > 1888 && filter.year_min < 2015) {
139                         selector.set_active (0, filter.year_min - 1888);
140                 } else {
141                         selector.set_active (0, 0);
142                 }
143                 if (filter.year_max > 1888 && filter.year_max < 2015) {
144                         selector.set_active (1, filter.year_max - 1888);
145                 } else {
146                         selector.set_active (1, 127);
147                 }
148                 selector.center_on_selected ();
149                 dialog.set_selector (selector);
150
151                 var res = dialog.run ();
152                 if (res == ResponseType.OK) {
153                         filter.year_min = 1888 + selector.get_active (0);
154                         if (filter.year_min <= 1888)
155                                 filter.year_min = 0;
156                         filter.year_max = 1888 + selector.get_active (1);
157                         if (filter.year_max >= 2015)
158                                 filter.year_max = 0;
159
160                         if (filter.year_min == 0 && filter.year_max == 0)
161                                 filter_year.set_value (_("Off"));
162                         else if (filter.year_min == 0)
163                                 filter_year.set_value (_("Until %d").printf (filter.year_max));
164                         else if (filter.year_max == 0)
165                                 filter_year.set_value (_("Since %d").printf (filter.year_min));
166                         else if (filter.year_min == filter.year_max)
167                                 filter_year.set_value ("%d".printf (filter.year_min));
168                         else
169                                 filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
170
171                         filter_changed ();
172                 }
173                 dialog.destroy ();
174         }
175
176         public void on_filter_rating_clicked () {
177                 var dialog = new PickerDialog (movie_list_window);
178                 dialog.set_title (_("Filter by rating"));
179
180                 var selector = new TouchSelector.text ();
181                 for (int i = 0; i < 10; i++) {
182                         selector.append_text ("%d.0".printf (9 - i));
183                 }
184                 selector.set_active (0, 9 - (filter.rating_min / 10));
185                 dialog.set_selector (selector);
186
187                 var res = dialog.run ();
188                 if (res == ResponseType.OK) {
189                         filter.rating_min = (9 - selector.get_active (0)) * 10;
190
191                         if (filter.rating_min == 0)
192                                 filter_rating.set_value (_("Off"));
193                         else
194                                 filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
195
196                         filter_changed ();
197                 }
198                 dialog.destroy ();
199         }
200
201         public void on_filter_genres_clicked () {
202                 var dialog = new GenreFilterDialog (movie_list_window);
203                 string s;
204
205                 var res = dialog.run (filter);
206
207                 if (res == ResponseType.OK) {
208                         s = filter.genres.to_string ();
209                         if (s != null)
210                                 filter_genres.set_value (s);
211                         else
212                                 filter_genres.set_value (_("Off"));
213
214                         filter_changed ();
215                 }
216         }
217
218         public void on_poster_view_clicked (Gtk.Button button) {
219                 var poster_mode = movie_list_window.get_movie_list_view ().poster_mode;
220                 movie_list_window.get_movie_list_view ().poster_mode = !poster_mode;
221                 poster_view.set_label (poster_mode ? _("Poster view") : _("List view"));
222         }
223
224         Hildon.FileChooserDialog file_chooser;
225         int imported_movies = 0;
226         public void on_import_movies_clicked (Gtk.Button button) {
227                 file_chooser = new Hildon.FileChooserDialog (movie_list_window, FileChooserAction.OPEN);
228                 file_chooser.set_title (_("Select file to import movies from"));
229
230                 var filter = new Gtk.FileFilter ();
231                 filter.add_pattern ("*.xml");
232                 file_chooser.set_filter (filter);
233
234                 file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
235
236                 var res = file_chooser.run ();
237                 if (res == ResponseType.OK) {
238                         print ("FILE: %s\n", file_chooser.get_filename ());
239                 }
240
241                 var importer = new AMCImporter ();
242                 importer.movie_available.connect (on_movie_available);
243                 importer.parse_file (file_chooser.get_filename ());
244
245                 file_chooser.destroy ();
246                 file_chooser = null;
247
248                 Banner.show_information (movie_list_window, null, 
249                                          ngettext("%d movie imported",
250                                                   "%d movies imported",
251                                                   imported_movies).printf (imported_movies));
252                 imported_movies = 0;
253         }
254
255         private void on_movie_available (Movie movie) {
256                 // if filter.matches (movie)
257                         source_.add_movie (movie);
258                 TreeIter iter;
259                 store.add (movie, out iter);
260                 imported_movies++;
261         }
262
263         public void on_export_movies_clicked (Gtk.Button button) {
264                 file_chooser = new Hildon.FileChooserDialog (movie_list_window, FileChooserAction.SAVE);
265                 file_chooser.set_title (_("Select file to export movies to"));
266
267                 var filter = new Gtk.FileFilter ();
268                 filter.add_pattern ("*.xml");
269                 file_chooser.set_filter (filter);
270
271                 file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
272
273                 var res = file_chooser.run ();
274                 if (res == ResponseType.OK) {
275                         print ("FILE: %s\n", file_chooser.get_filename ());
276                 }
277
278                 var movies = new List<Movie> ();
279                 // TODO: append from store
280
281                 var exporter = new AMCExporter ();
282                 exporter.write_file (file_chooser.get_filename (), movies);
283
284                 file_chooser.destroy ();
285                 file_chooser = null;
286         }
287
288         public void on_settings_clicked (Gtk.Button button) {
289                 var dialog = new SettingsDialog (movie_list_window);
290
291                 dialog.run ();
292         }
293 }