b5c8aef32f08c775b9a89f2f577e9a31fc30dd49
[cinaest] / src / genre-filter-dialog.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 Hildon;
20 using Gtk;
21
22 class GenreFilterDialog : Gtk.Dialog {
23         private enum Response {
24                 CLEAR = 1,
25         }
26         private static const GenreType[] _genre_order = {
27                 GenreType.SHORT, GenreType.DRAMA, GenreType.COMEDY, GenreType.DOCUMENTARY,
28                 GenreType.ROMANCE, GenreType.ANIMATION, GenreType.ACTION, GenreType.CRIME,
29                 GenreType.THRILLER, GenreType.FAMILY, GenreType.ADVENTURE, GenreType.MUSIC,
30                 GenreType.HORROR, GenreType.FANTASY, GenreType.WESTERN, GenreType.MYSTERY,
31                 GenreType.SCIFI, GenreType.MUSICAL, GenreType.WAR, GenreType.SPORT,
32                 GenreType.BIOGRAPHY, GenreType.HISTORY, GenreType.FILMNOIR, GenreType.REALITYTV,
33                 GenreType.TALKSHOW, GenreType.GAMESHOW, GenreType.NEWS, GenreType.ADULT
34         };
35
36         private PannableArea pannable;
37         private Gtk.Button button_clear;
38         private ToggleButton[] button_genre;
39         private Genres genres;
40
41         public GenreFilterDialog (Gtk.Window window) {
42                 set_transient_for (window);
43                 set_title (_("Filter by genres"));
44         }
45
46         construct {
47                 var vbox = new VBox (true, 0);
48
49                 pannable = new PannableArea ();
50                 pannable.add_with_viewport (vbox);
51
52                 var content_area = (VBox) get_content_area ();
53                 content_area.set_size_request (-1, 5*70);
54                 content_area.pack_start (pannable, true, true, 0);
55
56                 HBox hbox;
57
58                 button_genre = new ToggleButton[28];
59                 int i;
60                 for (i = 0; i < 28; i++) {
61                         if ((i % 4) == 0) {
62                                 hbox = new HBox (false, 0);
63                                 vbox.pack_start (hbox, true, true, 0);
64                         }
65                         button_genre[i] = new ToggleButton.with_label (Genres.genre_string (_genre_order[i]));
66                         hbox.pack_start (button_genre[i], true, true, 0);
67                         Hildon.gtk_widget_set_theme_size (button_genre[i], SizeType.FINGER_HEIGHT);
68                         button_genre[i].toggled.connect (on_genre_toggled);
69                 }
70
71                 button_clear = new Gtk.Button.with_label (_("Clear"));
72                 Hildon.gtk_widget_set_theme_size (button_clear, SizeType.FINGER_HEIGHT);
73
74                 add_action_widget (button_clear, Response.CLEAR);
75
76                 add_button(_("Done"), ResponseType.OK);
77         }
78
79         public new int run (MovieFilter filter) {
80                 int res = 0;
81                 int i;
82
83                 genres = filter.genres;
84                 for (i = 0; i < 28; i++) {
85                         if ((1 << _genre_order[i]) in genres.field)
86                                 button_genre[i].set_active (true);
87                 }
88
89                 show_all ();
90
91                 do {
92                         res = base.run ();
93                         switch (res) {
94                         case Response.CLEAR:
95                                 for (i = 0; i < 28; i++) {
96                                         button_genre[i].set_active (false);
97                                 }
98                                 break;
99                         }
100                 } while (res > 0);
101                 if (res == ResponseType.OK) {
102                         if (filter.genres.field == genres.field)
103                                 res = ResponseType.CANCEL;
104                         else
105                                 filter.genres = genres;
106                 }
107                 destroy ();
108                 return res;
109         }
110
111         void on_genre_toggled (ToggleButton button) {
112                 int i;
113
114                 for (i = 0; i < 28; i++) {
115                         if (button_genre[i] == button)
116                                 break;
117                 }
118                 genres.set_bit (_genre_order[i], button.get_active ());
119                 if (genres.field != 0)
120                         button_clear.show ();
121                 else
122                         button_clear.hide ();
123
124                 update_title ();
125         }
126
127         private void update_title () {
128                 string s = _("Filter by genres");
129
130                 if (genres.field != 0) {
131                         s += " - " + genres.to_string ();
132                 }
133
134                 set_title (s);
135         }
136 }
137