/* This file is part of Cinaest. * * Copyright (C) 2009 Philipp Zabel * * Cinaest is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Cinaest is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Cinaest. If not, see . */ using Gtk; using Hildon; public class MovieListMenu : AppMenu { 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")); // Draw them as toggle buttons, not as radio buttons sort_by_title.set_mode (false); sort_by_year.set_mode (false); sort_by_rating.set_mode (false); // TODO - get this from GConf sort_by_title.set_active (true); // 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.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")); } 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, ngettext("%d movie imported", "%d movies imported", imported_movies).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 (); // 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 (); } }