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;
+ private Gtk.Button export_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);
// TODO - get this from GConf
sort_by_title.set_active (true);
- // TODO - connect signals
+ // Connect signals
+ sort_by_title.toggled.connect (button => {
+ if (button.get_active ())
+ store.set_sort_column_id (MovieListStore.Columns.TITLE, Gtk.SortType.ASCENDING);
+ });
+ sort_by_year.toggled.connect (button => {
+ if (button.get_active ())
+ store.set_sort_column_id (MovieListStore.Columns.YEAR, Gtk.SortType.DESCENDING);
+ });
+ sort_by_rating.toggled.connect (button => {
+ if (button.get_active ())
+ 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"));
+ export_movies = new Gtk.Button.with_label (_("Export 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);
+ export_movies.clicked.connect (on_export_movies_clicked);
+ settings.clicked.connect (on_settings_clicked);
+
+ append (filter_year);
+ append (filter_rating);
+ append (filter_genres);
+ append (poster_view);
+ append (import_movies);
+ append (export_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 ();
+ export_movies.show ();
+ } else {
+ delete_movies.hide ();
+ import_movies.hide ();
+ export_movies.show ();
+ }
+ }
+ }
+
+ 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"));
+ }
+
+ Hildon.FileChooserDialog file_chooser;
+ int imported_movies = 0;
+ public void on_import_movies_clicked (Gtk.Button button) {
+ file_chooser = new Hildon.FileChooserDialog (movie_list_window, FileChooserAction.OPEN);
+ file_chooser.set_title (_("Select file to import movies from"));
+
+ var filter = new Gtk.FileFilter ();
+ filter.add_pattern ("*.xml");
+ file_chooser.set_filter (filter);
+
+ file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
+
+ var res = file_chooser.run ();
+ if (res == ResponseType.OK) {
+ print ("FILE: %s\n", file_chooser.get_filename ());
+ }
+
+ var importer = new AMCImporter ();
+ importer.movie_available.connect (on_movie_available);
+ importer.parse_file (file_chooser.get_filename ());
+
+ file_chooser.destroy ();
+ file_chooser = null;
+
+ Banner.show_information (movie_list_window, null, _("%d movies imported").printf (imported_movies));
+ imported_movies = 0;
+ }
+
+ private void on_movie_available (Movie movie) {
+ // if filter.matches (movie)
+ source_.add_movie (movie);
+ TreeIter iter;
+ store.add (movie, out iter);
+ imported_movies++;
+ }
+
+ public void on_export_movies_clicked (Gtk.Button button) {
+ file_chooser = new Hildon.FileChooserDialog (movie_list_window, FileChooserAction.SAVE);
+ file_chooser.set_title (_("Select file to export movies to"));
+
+ var filter = new Gtk.FileFilter ();
+ filter.add_pattern ("*.xml");
+ file_chooser.set_filter (filter);
+
+ file_chooser.set_current_folder ("/home/user/MyDocs/.documents");
+
+ var res = file_chooser.run ();
+ if (res == ResponseType.OK) {
+ print ("FILE: %s\n", file_chooser.get_filename ());
+ }
+
+ var movies = new List<Movie> ();
+ // TODO: append from store
+
+ var exporter = new AMCExporter ();
+ exporter.write_file (file_chooser.get_filename (), movies);
+
+ file_chooser.destroy ();
+ file_chooser = null;
+ }
+
+ public void on_settings_clicked (Gtk.Button button) {
+ var dialog = new SettingsDialog (movie_list_window);
+
+ dialog.run ();
+ }
}