1 /* This file is part of Cinaest.
3 * Copyright (C) 2009 Philipp Zabel
5 * Cinaest is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * Cinaest is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Cinaest. If not, see <http://www.gnu.org/licenses/>.
21 public class MovieListStore : ListStore, TreeModel {
30 private GLib.Type[] types = {
37 private GLib.Type[] base_type = {
40 private Gdk.Pixbuf no_poster;
41 private MoviePoster.Factory poster_factory;
42 public MovieSource source;
43 private MovieFilter filter;
44 public bool update_running { get; set; }
45 private Cancellable cancellable;
47 public signal void search_finished (int movies);
50 set_column_types (base_type);
53 update_running = false;
55 poster_factory = MoviePoster.Factory.get_instance ();
58 public void add (Movie movie, out TreeIter iter) {
62 base.set (iter1, 0, movie);
64 movie.notify.connect (this.on_movie_changed);
69 public new bool remove (Movie movie) {
72 if (get_iter_from_movie (out iter, movie)) {
73 movie.notify.disconnect (this.on_movie_changed);
76 if (source.get_editable ()) {
77 source.delete_movie (movie);
86 private void on_movie_changed (GLib.Object source, GLib.ParamSpec spec) {
87 var movie = (Movie) source;
90 if (get_iter_from_movie (out iter, movie)) {
91 TreePath path = get_path (iter);
92 base.row_changed (path, iter);
96 public bool get_editable () {
97 return source.get_editable ();
100 public bool get_iter_from_movie (out TreeIter iter, Movie movie_a) {
101 if (get_iter_first (out iter)) {
104 get (iter, Columns.MOVIE, out movie_b);
105 if (movie_a == movie_b)
107 } while (iter_next (ref iter));
112 public bool start_search (MovieFilter _filter) {
113 if (update_running) {
114 stdout.printf ("aborting search ...\n");
115 cancellable.cancel ();
116 poster_factory.clear_queue ();
119 if (cancellable == null || cancellable.is_cancelled ())
120 cancellable = new Cancellable ();
123 stdout.printf ("begin search\n");
124 search_async.begin ();
125 update_running = true;
129 // Asynchronous update method
130 private async void search_async () {
131 stdout.printf ("search started: \"%s\"\n", filter.title);
135 if (source != null) {
136 // FIXME - arbitrary limit
137 int n = yield source.get_movies (filter, receive_movie, 100, cancellable);
141 update_running = false;
142 if (cancellable.is_cancelled ()) {
143 stdout.printf ("search aborted, starting new\n");
144 cancellable.reset ();
145 if (cancellable.is_cancelled ()) {
146 stdout.printf ("OW WEY\n");
148 start_search (filter);
150 stdout.printf ("search stopped\n");
154 private void receive_movie (Movie movie) {
157 if (cancellable.is_cancelled ())
160 add (movie, out iter);
162 poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail);
164 warning ("Failed to queue poster request: %s\n", e.message);
168 private void receive_poster_thumbnail (Gdk.Pixbuf pixbuf, Movie movie) {
169 var poster = new Poster ();
170 poster.thumbnail = pixbuf;
171 movie.poster = poster;
174 // Implement TreeModel interface
175 public virtual GLib.Type get_column_type (int index_) {
176 return_val_if_fail (index_ >= 0 && index_ < Columns.N_COLUMNS, 0);
178 return types[index_];
181 public virtual int get_n_columns () {
182 return Columns.N_COLUMNS;
185 public virtual void get_value (TreeIter iter, int column, out GLib.Value value) {
189 if (no_poster == null) try {
190 no_poster = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/general_video.png");
192 critical ("Missing general_video icon: %s\n", e.message);
195 return_if_fail (column >= 0 && column < Columns.N_COLUMNS);
197 // Get the Movie from our parent's storage
199 base.get_value (iter, 0, out val);
200 movie = (Movie) val.get_object ();
202 value.init (get_column_type (column));
207 value.set_string (movie.title);
209 value.set_string ("");
215 value.set_int (movie.year);
223 value.set_int (movie.rating);
230 if ((movie.poster != null) && (movie.poster.thumbnail != null))
231 value.set_object (movie.poster.thumbnail);
233 value.set_object (no_poster);
237 value.set_object (movie);
241 assert_not_reached ();