Movie list: add dialogs to filter by year and by rating
[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 TreeSortable sortable;
24         private MovieListWindow movie_list_window;
25         private Hildon.Button filter_year;
26         private Hildon.Button filter_rating;
27         private Hildon.Button select_source;
28         private Gtk.Button delete_movies;
29
30         public signal void filter_changed ();
31
32         public MovieListMenu (MovieListWindow window) {
33                 movie_list_window = window;
34         }
35
36         construct {
37                 // Add sort buttons as view menu filters
38                 var sort_by_title = new RadioButton.with_label (null, _("ABC"));
39                 var sort_by_year = new RadioButton.with_label_from_widget (sort_by_title, _("Year"));
40                 var sort_by_rating = new RadioButton.with_label_from_widget (sort_by_title, _("Rating"));
41
42                 // Draw them as toggle buttons, not as radio buttons
43                 sort_by_title.set_mode (false);
44                 sort_by_year.set_mode (false);
45                 sort_by_rating.set_mode (false);
46
47                 // TODO - get this from GConf
48                 sort_by_title.set_active (true);
49
50                 // Connect signals
51                 sort_by_title.toggled.connect (button => {
52                         if (button.get_active ())
53                                 sortable.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
54                 });
55                 sort_by_year.toggled.connect (button => {
56                         if (button.get_active ())
57                                 sortable.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
58                 });
59                 sort_by_rating.toggled.connect (button => {
60                         if (button.get_active ())
61                                 sortable.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
62                 });
63
64                 add_filter (sort_by_title);
65                 add_filter (sort_by_year);
66                 add_filter (sort_by_rating);
67
68                 // Add view menu buttons
69                 filter_year = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by year"), _("Off"));
70                 filter_rating = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by rating"), _("Off"));
71                 select_source = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Source"), _("None"));
72                 delete_movies = new Gtk.Button.with_label (_("Delete movies"));
73                 var settings = new Gtk.Button.with_label (_("Settings"));
74
75                 filter_year.set_style (ButtonStyle.PICKER);
76                 filter_rating.set_style (ButtonStyle.PICKER);
77                 select_source.set_style (ButtonStyle.PICKER);
78
79                 // Connect signals
80                 filter_year.clicked.connect (on_filter_year_clicked);
81                 filter_rating.clicked.connect (on_filter_rating_clicked);
82                 select_source.clicked.connect (on_select_source_clicked);
83                 delete_movies.clicked.connect (() => { movie_list_window.on_delete_movies_clicked (); });
84                 settings.clicked.connect (on_settings_clicked);
85
86                 append (filter_year);
87                 append (filter_rating);
88                 append (select_source);
89                 append (delete_movies);
90                 append (settings);
91
92                 show_all ();
93         }
94
95
96         public MovieSource source {
97                 set {
98                         select_source.value = value.get_name ();
99                         if (value.get_editable ()) {
100                                 delete_movies.show ();
101                         } else {
102                                 delete_movies.hide ();
103                         }
104                 }
105         }
106
107         public void on_filter_year_clicked () {
108                 var dialog = new PickerDialog (movie_list_window);
109                 dialog.set_title (_("Filter by year"));
110
111                 var year_store = new ListStore (1, typeof (string));
112                 TreeIter iter;
113                 for (int i = 0; i < 128; i++) {
114                         year_store.append (out iter);
115                         year_store.set_value (iter, 0, "%d".printf (1888 + i));
116                 }
117
118                 var selector = new TouchSelector ();
119                 selector.append_text_column (year_store, true);
120                 selector.append_text_column (year_store, true);
121                 if (filter.year_min > 1888 && filter.year_min < 2015) {
122                         selector.set_active (0, filter.year_min - 1888);
123                 } else {
124                         selector.set_active (0, 0);
125                 }
126                 if (filter.year_max > 1888 && filter.year_max < 2015) {
127                         selector.set_active (1, filter.year_max - 1888);
128                 } else {
129                         selector.set_active (1, 127);
130                 }
131                 dialog.set_selector (selector);
132
133                 var res = dialog.run ();
134                 if (res == ResponseType.OK) {
135                         filter.year_min = 1888 + selector.get_active (0);
136                         if (filter.year_min <= 1888)
137                                 filter.year_min = 0;
138                         filter.year_max = 1888 + selector.get_active (1);
139                         if (filter.year_max >= 2015)
140                                 filter.year_max = 0;
141
142                         if (filter.year_min == 0 && filter.year_max == 0)
143                                 filter_year.set_value (_("Off"));
144                         else if (filter.year_min == 0)
145                                 filter_year.set_value (_("Until %d").printf (filter.year_max));
146                         else if (filter.year_max == 0)
147                                 filter_year.set_value (_("Since %d").printf (filter.year_min));
148                         else
149                                 filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
150
151                         filter_changed ();
152                 }
153                 dialog.destroy ();
154         }
155
156         public void on_filter_rating_clicked () {
157                 var dialog = new PickerDialog (movie_list_window);
158                 dialog.set_title (_("Filter by rating"));
159
160                 var selector = new TouchSelector.text ();
161                 for (int i = 0; i < 10; i++) {
162                         selector.append_text ("%d.0".printf (9 - i));
163                 }
164                 selector.set_active (0, 9 - (filter.rating_min / 10));
165                 dialog.set_selector (selector);
166
167                 var res = dialog.run ();
168                 if (res == ResponseType.OK) {
169                         filter.rating_min = (9 - selector.get_active (0)) * 10;
170
171                         if (filter.rating_min == 0)
172                                 filter_rating.set_value (_("Off"));
173                         else
174                                 filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
175
176                         filter_changed ();
177                 }
178                 dialog.destroy ();
179         }
180
181         public void on_select_source_clicked (Gtk.Button button) {
182                 Hildon.Button select_source = (Hildon.Button) button;
183                 var dialog = new SourceDialog (movie_list_window);
184
185                 var source = movie_list_window.source;
186                 dialog.run (ref source);
187                 movie_list_window.source = source;
188
189                 select_source.value = source.get_name ();
190         }
191
192         public void on_settings_clicked (Gtk.Button button) {
193                 var dialog = new SettingsDialog (movie_list_window);
194
195                 dialog.run ();
196         }
197 }