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;
33 public signal void filter_changed ();
35 public MovieListMenu (MovieListWindow window) {
36 movie_list_window = window;
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"));
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);
50 // TODO - get this from GConf
51 sort_by_title.set_active (true);
54 sort_by_title.toggled.connect (button => {
55 if (button.get_active ())
56 store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
58 sort_by_year.toggled.connect (button => {
59 if (button.get_active ())
60 store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
62 sort_by_rating.toggled.connect (button => {
63 if (button.get_active ())
64 store.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
67 add_filter (sort_by_title);
68 add_filter (sort_by_year);
69 add_filter (sort_by_rating);
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"));
80 filter_year.set_style (ButtonStyle.PICKER);
81 filter_rating.set_style (ButtonStyle.PICKER);
82 filter_genres.set_style (ButtonStyle.PICKER);
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);
94 append (filter_rating);
95 append (filter_genres);
97 append (import_movies);
98 append (delete_movies);
104 private MovieSource source_;
105 public MovieSource source {
108 if (source_ != null && SourceFlags.EDITABLE in source_.get_flags ()) {
109 delete_movies.show ();
110 import_movies.show ();
112 delete_movies.hide ();
113 import_movies.hide ();
118 public void on_filter_year_clicked () {
119 var dialog = new PickerDialog (movie_list_window);
120 dialog.set_title (_("Filter by year"));
122 var year_store = new ListStore (1, typeof (string));
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));
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);
135 selector.set_active (0, 0);
137 if (filter.year_max > 1888 && filter.year_max < 2015) {
138 selector.set_active (1, filter.year_max - 1888);
140 selector.set_active (1, 127);
142 selector.center_on_selected ();
143 dialog.set_selector (selector);
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)
150 filter.year_max = 1888 + selector.get_active (1);
151 if (filter.year_max >= 2015)
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));
163 filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
170 public void on_filter_rating_clicked () {
171 var dialog = new PickerDialog (movie_list_window);
172 dialog.set_title (_("Filter by rating"));
174 var selector = new TouchSelector.text ();
175 for (int i = 0; i < 10; i++) {
176 selector.append_text ("%d.0".printf (9 - i));
178 selector.set_active (0, 9 - (filter.rating_min / 10));
179 dialog.set_selector (selector);
181 var res = dialog.run ();
182 if (res == ResponseType.OK) {
183 filter.rating_min = (9 - selector.get_active (0)) * 10;
185 if (filter.rating_min == 0)
186 filter_rating.set_value (_("Off"));
188 filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
195 public void on_filter_genres_clicked () {
196 var dialog = new GenreFilterDialog (movie_list_window);
199 var res = dialog.run (filter);
201 if (res == ResponseType.OK) {
202 s = filter.genres.to_string ();
204 filter_genres.set_value (s);
206 filter_genres.set_value (_("Off"));
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"));
218 Hildon.FileChooserDialog file_chooser;
219 public void on_import_movies_clicked (Gtk.Button button) {
220 file_chooser = new Hildon.FileChooserDialog (movie_list_window, FileChooserAction.OPEN);
221 file_chooser.set_title (_("Select file to import movies from"));
223 var filter = new Gtk.FileFilter ();
224 filter.add_pattern ("*.xml");
225 file_chooser.set_filter (filter);
227 file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
229 var res = file_chooser.run ();
230 if (res == ResponseType.OK) {
231 print ("FILE: %s\n", file_chooser.get_filename ());
235 // import movies or ratings from some source
236 for (var Plugin in CinaestProgram.plugins) {
237 if (plugin.can_export_ratings ()) {
242 exporter = run_exporter_selection_dialog
244 file_chooser.destroy ();
247 public void on_settings_clicked (Gtk.Button button) {
248 var dialog = new SettingsDialog (movie_list_window);