1 /* This file is part of Cinaest.
3 * Copyright (C) 2009 Philipp Zabel
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.
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.
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/>.
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;
34 public signal void filter_changed ();
36 public MovieListMenu (MovieListWindow window) {
37 movie_list_window = window;
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"));
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);
51 // TODO - get this from GConf
52 sort_by_title.set_active (true);
55 sort_by_title.toggled.connect (button => {
56 if (button.get_active ())
57 store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
59 sort_by_year.toggled.connect (button => {
60 if (button.get_active ())
61 store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
63 sort_by_rating.toggled.connect (button => {
64 if (button.get_active ())
65 store.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
68 add_filter (sort_by_title);
69 add_filter (sort_by_year);
70 add_filter (sort_by_rating);
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"));
82 filter_year.set_style (ButtonStyle.PICKER);
83 filter_rating.set_style (ButtonStyle.PICKER);
84 filter_genres.set_style (ButtonStyle.PICKER);
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);
97 append (filter_rating);
98 append (filter_genres);
100 append (import_movies);
101 append (export_movies);
102 append (delete_movies);
108 private MovieSource source_;
109 public MovieSource source {
112 if (source_ != null && SourceFlags.EDITABLE in source_.get_flags ()) {
113 delete_movies.show ();
114 import_movies.show ();
115 export_movies.show ();
117 delete_movies.hide ();
118 import_movies.hide ();
119 export_movies.show ();
124 public void on_filter_year_clicked () {
125 var dialog = new PickerDialog (movie_list_window);
126 dialog.set_title (_("Filter by year"));
128 var year_store = new ListStore (1, typeof (string));
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));
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);
141 selector.set_active (0, 0);
143 if (filter.year_max > 1888 && filter.year_max < 2015) {
144 selector.set_active (1, filter.year_max - 1888);
146 selector.set_active (1, 127);
148 selector.center_on_selected ();
149 dialog.set_selector (selector);
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)
156 filter.year_max = 1888 + selector.get_active (1);
157 if (filter.year_max >= 2015)
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));
169 filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
176 public void on_filter_rating_clicked () {
177 var dialog = new PickerDialog (movie_list_window);
178 dialog.set_title (_("Filter by rating"));
180 var selector = new TouchSelector.text ();
181 for (int i = 0; i < 10; i++) {
182 selector.append_text ("%d.0".printf (9 - i));
184 selector.set_active (0, 9 - (filter.rating_min / 10));
185 dialog.set_selector (selector);
187 var res = dialog.run ();
188 if (res == ResponseType.OK) {
189 filter.rating_min = (9 - selector.get_active (0)) * 10;
191 if (filter.rating_min == 0)
192 filter_rating.set_value (_("Off"));
194 filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
201 public void on_filter_genres_clicked () {
202 var dialog = new GenreFilterDialog (movie_list_window);
205 var res = dialog.run (filter);
207 if (res == ResponseType.OK) {
208 s = filter.genres.to_string ();
210 filter_genres.set_value (s);
212 filter_genres.set_value (_("Off"));
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"));
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"));
230 var filter = new Gtk.FileFilter ();
231 filter.add_pattern ("*.xml");
232 file_chooser.set_filter (filter);
234 file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
236 var res = file_chooser.run ();
237 if (res == ResponseType.OK) {
238 print ("FILE: %s\n", file_chooser.get_filename ());
241 var importer = new AMCImporter ();
242 importer.movie_available.connect (on_movie_available);
243 importer.parse_file (file_chooser.get_filename ());
245 file_chooser.destroy ();
248 Banner.show_information (movie_list_window, null,
249 ngettext("%d movie imported",
250 "%d movies imported",
251 imported_movies).printf (imported_movies));
255 private void on_movie_available (Movie movie) {
256 // if filter.matches (movie)
257 source_.add_movie (movie);
259 store.add (movie, out iter);
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"));
267 var filter = new Gtk.FileFilter ();
268 filter.add_pattern ("*.xml");
269 file_chooser.set_filter (filter);
271 file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
273 var res = file_chooser.run ();
274 if (res == ResponseType.OK) {
275 print ("FILE: %s\n", file_chooser.get_filename ());
278 var movies = new List<Movie> ();
279 // TODO: append from store
281 var exporter = new AMCExporter ();
282 exporter.write_file (file_chooser.get_filename (), movies);
284 file_chooser.destroy ();
288 public void on_settings_clicked (Gtk.Button button) {
289 var dialog = new SettingsDialog (movie_list_window);