Movie list menu: store the movie source
[cinaest] / src / movie-list-menu.vala
index 31602d9..daea9e4 100644 (file)
@@ -20,13 +20,27 @@ using Gtk;
 using Hildon;
 
 public class MovieListMenu : AppMenu {
-       public TreeSortable sortable;
+       public MovieListStore store;
+       public MovieFilter filter;
+       private weak MovieListWindow movie_list_window;
+       private Hildon.Button filter_year;
+       private Hildon.Button filter_rating;
+       private Hildon.Button filter_genres;
+       private Gtk.Button poster_view;
+       private Gtk.Button delete_movies;
+       private Gtk.Button import_movies;
+
+       public signal void filter_changed ();
+
+       public MovieListMenu (MovieListWindow window) {
+               movie_list_window = window;
+       }
 
        construct {
                // Add sort buttons as view menu filters
-               var sort_by_title = new RadioButton.with_label (null, "ABC");
-               var sort_by_year = new RadioButton.with_label_from_widget (sort_by_title, "Year");
-               var sort_by_rating = new RadioButton.with_label_from_widget (sort_by_title, "Rating");
+               var sort_by_title = new RadioButton.with_label (null, _("ABC"));
+               var sort_by_year = new RadioButton.with_label_from_widget (sort_by_title, _("Year"));
+               var sort_by_rating = new RadioButton.with_label_from_widget (sort_by_title, _("Rating"));
 
                // Draw them as toggle buttons, not as radio buttons
                sort_by_title.set_mode (false);
@@ -39,21 +53,188 @@ public class MovieListMenu : AppMenu {
                // Connect signals
                sort_by_title.toggled.connect (button => {
                        if (button.get_active ())
-                               sortable.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
+                               store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
                });
                sort_by_year.toggled.connect (button => {
                        if (button.get_active ())
-                               sortable.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
+                               store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
                });
                sort_by_rating.toggled.connect (button => {
                        if (button.get_active ())
-                               sortable.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
+                               store.set_sort_column_id (MovieListStore.Columns.RATING, Gtk.SortType.DESCENDING);
                });
 
                add_filter (sort_by_title);
                add_filter (sort_by_year);
                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"));
+               filter_genres = new Hildon.Button.with_text (SizeType.FINGER_HEIGHT, ButtonArrangement.VERTICAL, _("Filter by genres"), _("Off"));
+               poster_view = new Gtk.Button.with_label (_("Poster view"));
+               delete_movies = new Gtk.Button.with_label (_("Delete movies"));
+               import_movies = new Gtk.Button.with_label (_("Import movies"));
+               var settings = new Gtk.Button.with_label (_("Settings"));
+
+               filter_year.set_style (ButtonStyle.PICKER);
+               filter_rating.set_style (ButtonStyle.PICKER);
+               filter_genres.set_style (ButtonStyle.PICKER);
+
+               // Connect signals
+               filter_year.clicked.connect (on_filter_year_clicked);
+               filter_rating.clicked.connect (on_filter_rating_clicked);
+               filter_genres.clicked.connect (on_filter_genres_clicked);
+               poster_view.clicked.connect (on_poster_view_clicked);
+               delete_movies.clicked.connect (() => { movie_list_window.on_delete_movies_clicked (); });
+               import_movies.clicked.connect (on_import_movies_clicked);
+               settings.clicked.connect (on_settings_clicked);
+
+               append (filter_year);
+               append (filter_rating);
+               append (filter_genres);
+               append (poster_view);
+               append (import_movies);
+               append (delete_movies);
+               append (settings);
+
                show_all ();
        }
+
+       private MovieSource source_;
+       public MovieSource source {
+               set {
+                       source_ = value;
+                       if (source_ != null && SourceFlags.EDITABLE in source_.get_flags ()) {
+                               delete_movies.show ();
+                               import_movies.show ();
+                       } else {
+                               delete_movies.hide ();
+                               import_movies.hide ();
+                       }
+               }
+       }
+
+       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);
+               }
+               selector.center_on_selected ();
+               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 if (filter.year_min == filter.year_max)
+                               filter_year.set_value ("%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_filter_genres_clicked () {
+               var dialog = new GenreFilterDialog (movie_list_window);
+               string s;
+
+               var res = dialog.run (filter);
+
+               if (res == ResponseType.OK) {
+                       s = filter.genres.to_string ();
+                       if (s != null)
+                               filter_genres.set_value (s);
+                       else
+                               filter_genres.set_value (_("Off"));
+
+                       filter_changed ();
+               }
+       }
+
+       public void on_poster_view_clicked (Gtk.Button button) {
+               var poster_mode = movie_list_window.get_movie_list_view ().poster_mode;
+               movie_list_window.get_movie_list_view ().poster_mode = !poster_mode;
+               poster_view.set_label (poster_mode ? _("Poster view") : _("List view"));
+       }
+
+       public void on_import_movies_clicked (Gtk.Button button) {
+               var dialog = new Gtk.Dialog ();
+               dialog.set_transient_for (movie_list_window);
+               dialog.set_title (_("Import movies"));
+/*
+               // import movies or ratings from some source
+               for (var Plugin in CinaestProgram.plugins) {
+                       if (plugin.can_export_ratings ()) {
+                               exporters++;
+                       }
+               }
+               if (exporters > 1)
+                       exporter = run_exporter_selection_dialog
+*/
+               dialog.run ();
+       }
+
+       public void on_settings_clicked (Gtk.Button button) {
+               var dialog = new SettingsDialog (movie_list_window);
+
+               dialog.run ();
+       }
 }