Movie list: add dialogs to filter by year and by rating
authorPhilipp Zabel <philipp.zabel@gmail.com>
Mon, 9 Nov 2009 17:55:24 +0000 (18:55 +0100)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Thu, 19 Nov 2009 10:43:04 +0000 (11:43 +0100)
Also adds a filter-changed signal and connects it to start_search in
the movie list window.

src/movie-list-menu.vala
src/movie-list-window.vala

index 94fc795..1f0d6f1 100644 (file)
@@ -22,9 +22,13 @@ using Hildon;
 public class MovieListMenu : AppMenu {
        public TreeSortable sortable;
        private MovieListWindow movie_list_window;
+       private Hildon.Button filter_year;
+       private Hildon.Button filter_rating;
        private Hildon.Button select_source;
        private Gtk.Button delete_movies;
 
+       public signal void filter_changed ();
+
        public MovieListMenu (MovieListWindow window) {
                movie_list_window = window;
        }
@@ -62,17 +66,25 @@ public class MovieListMenu : AppMenu {
                add_filter (sort_by_rating);
 
                // Add view menu buttons
+               filter_year = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by year"), _("Off"));
+               filter_rating = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by rating"), _("Off"));
                select_source = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Source"), _("None"));
                delete_movies = new Gtk.Button.with_label (_("Delete movies"));
                var settings = new Gtk.Button.with_label (_("Settings"));
 
+               filter_year.set_style (ButtonStyle.PICKER);
+               filter_rating.set_style (ButtonStyle.PICKER);
                select_source.set_style (ButtonStyle.PICKER);
 
                // Connect signals
+               filter_year.clicked.connect (on_filter_year_clicked);
+               filter_rating.clicked.connect (on_filter_rating_clicked);
                select_source.clicked.connect (on_select_source_clicked);
                delete_movies.clicked.connect (() => { movie_list_window.on_delete_movies_clicked (); });
                settings.clicked.connect (on_settings_clicked);
 
+               append (filter_year);
+               append (filter_rating);
                append (select_source);
                append (delete_movies);
                append (settings);
@@ -80,6 +92,7 @@ public class MovieListMenu : AppMenu {
                show_all ();
        }
 
+
        public MovieSource source {
                set {
                        select_source.value = value.get_name ();
@@ -91,6 +104,80 @@ public class MovieListMenu : AppMenu {
                }
        }
 
+       public void on_filter_year_clicked () {
+               var dialog = new PickerDialog (movie_list_window);
+               dialog.set_title (_("Filter by year"));
+
+               var year_store = new ListStore (1, typeof (string));
+               TreeIter iter;
+               for (int i = 0; i < 128; i++) {
+                       year_store.append (out iter);
+                       year_store.set_value (iter, 0, "%d".printf (1888 + i));
+               }
+
+               var selector = new TouchSelector ();
+               selector.append_text_column (year_store, true);
+               selector.append_text_column (year_store, true);
+               if (filter.year_min > 1888 && filter.year_min < 2015) {
+                       selector.set_active (0, filter.year_min - 1888);
+               } else {
+                       selector.set_active (0, 0);
+               }
+               if (filter.year_max > 1888 && filter.year_max < 2015) {
+                       selector.set_active (1, filter.year_max - 1888);
+               } else {
+                       selector.set_active (1, 127);
+               }
+               dialog.set_selector (selector);
+
+               var res = dialog.run ();
+               if (res == ResponseType.OK) {
+                       filter.year_min = 1888 + selector.get_active (0);
+                       if (filter.year_min <= 1888)
+                               filter.year_min = 0;
+                       filter.year_max = 1888 + selector.get_active (1);
+                       if (filter.year_max >= 2015)
+                               filter.year_max = 0;
+
+                       if (filter.year_min == 0 && filter.year_max == 0)
+                               filter_year.set_value (_("Off"));
+                       else if (filter.year_min == 0)
+                               filter_year.set_value (_("Until %d").printf (filter.year_max));
+                       else if (filter.year_max == 0)
+                               filter_year.set_value (_("Since %d").printf (filter.year_min));
+                       else
+                               filter_year.set_value ("%d - %d".printf (filter.year_min, filter.year_max));
+
+                       filter_changed ();
+               }
+               dialog.destroy ();
+       }
+
+       public void on_filter_rating_clicked () {
+               var dialog = new PickerDialog (movie_list_window);
+               dialog.set_title (_("Filter by rating"));
+
+               var selector = new TouchSelector.text ();
+               for (int i = 0; i < 10; i++) {
+                       selector.append_text ("%d.0".printf (9 - i));
+               }
+               selector.set_active (0, 9 - (filter.rating_min / 10));
+               dialog.set_selector (selector);
+
+               var res = dialog.run ();
+               if (res == ResponseType.OK) {
+                       filter.rating_min = (9 - selector.get_active (0)) * 10;
+
+                       if (filter.rating_min == 0)
+                               filter_rating.set_value (_("Off"));
+                       else
+                               filter_rating.set_value (_("At least %d.0").printf (filter.rating_min / 10));
+
+                       filter_changed ();
+               }
+               dialog.destroy ();
+       }
+
        public void on_select_source_clicked (Gtk.Button button) {
                Hildon.Button select_source = (Hildon.Button) button;
                var dialog = new SourceDialog (movie_list_window);
index c77cb60..12339dd 100644 (file)
@@ -74,6 +74,7 @@ public class MovieListWindow : StackableWindow {
                set_edit_toolbar (edit_toolbar);
 
                // Connect signals
+               menu.filter_changed.connect (() => { start_search (); });
                edit_toolbar.button_clicked.connect (on_delete_button_clicked);
                edit_toolbar.arrow_clicked.connect (leave_edit_mode); 
                search_field.changed.connect (on_search_field_changed);