/* 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 ();
}
}