X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmovie-list-store.vala;h=52a3c3d9b9edbc99a910d47c16a40116e7b05dfb;hb=38bb5376d14ee12fd7b3a38231148634749fb88f;hp=68f72dcc7e4e3fef42529edabd276fb71b17b504;hpb=587ab43844888fcba8b687afc862e8a0e3ef2c3b;p=cinaest diff --git a/src/movie-list-store.vala b/src/movie-list-store.vala index 68f72dc..52a3c3d 100644 --- a/src/movie-list-store.vala +++ b/src/movie-list-store.vala @@ -24,25 +24,44 @@ public class MovieListStore : ListStore, TreeModel { YEAR, RATING, POSTER, + ICON, MOVIE, + MARKUP, N_COLUMNS } private GLib.Type[] types = { typeof (string), typeof (int), - typeof (int), + typeof (string), + typeof (Gdk.Pixbuf), typeof (Gdk.Pixbuf), - typeof (Movie) + typeof (Movie), + typeof (string) }; private GLib.Type[] base_type = { - typeof (Movie) + typeof (Movie), + typeof (string), // Markup: "Title (Year)" + typeof (string) // Rating }; private Gdk.Pixbuf no_poster; private MoviePoster.Factory poster_factory; - public MovieSource source; private MovieFilter filter; public bool update_running { get; set; } + public string year_markup = "[%d]"; private Cancellable cancellable; + public Widget view; + + public signal void search_finished (int movies); + + private MovieSource _source; + public MovieSource source { + get { + return _source; + } + set { + _source = value; + } + } construct { set_column_types (base_type); @@ -55,15 +74,49 @@ public class MovieListStore : ListStore, TreeModel { public void add (Movie movie, out TreeIter iter) { TreeIter iter1; + var markup = new StringBuilder (); + markup.append (Markup.escape_text (movie.title)); + if (movie.year > 0) { + markup.append (" "); + markup.append_printf (year_markup, movie.year); + } - append (out iter1); - base.set (iter1, 0, movie); + base.insert_with_values (out iter1, -1, + 0, movie, + 1, markup.str, + 2, rating_string (movie.rating)); movie.notify.connect (this.on_movie_changed); iter = iter1; } + private string? rating_string (int rating) { + if (rating >= 0) { + return "%d.%d".printf (rating / 10, + rating % 10); + } else { + return null; + } + } + + public new bool remove (Movie movie) { + TreeIter iter; + + if (get_iter_from_movie (out iter, movie)) { + movie.notify.disconnect (this.on_movie_changed); + base.remove (iter); + + if (SourceFlags.EDITABLE in source.get_flags ()) { + source.delete_movie (movie); + } + + return true; + } + + return false; + } + private void on_movie_changed (GLib.Object source, GLib.ParamSpec spec) { var movie = (Movie) source; @@ -75,7 +128,7 @@ public class MovieListStore : ListStore, TreeModel { } public bool get_editable () { - return source.get_editable (); + return (SourceFlags.EDITABLE in source.get_flags ()); } public bool get_iter_from_movie (out TreeIter iter, Movie movie_a) { @@ -113,9 +166,11 @@ public class MovieListStore : ListStore, TreeModel { clear (); - if (source != null) + if (source != null) { // FIXME - arbitrary limit - yield source.get_movies (filter, receive_movie, 100, cancellable); + int n = yield source.get_movies (filter, receive_movie, 100, cancellable); + search_finished (n); + } update_running = false; if (cancellable.is_cancelled ()) { @@ -130,23 +185,29 @@ public class MovieListStore : ListStore, TreeModel { } } - private void receive_movie (Movie movie) { + private void receive_movie (SList movies) { TreeIter iter; if (cancellable.is_cancelled ()) return; - add (movie, out iter); - try { - poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail); - } catch (Error e) { - warning ("Failed to queue poster request: %s\n", e.message); - } + view.freeze_child_notify (); + foreach (Movie movie in movies) + add (movie, out iter); + view.thaw_child_notify (); } - private void receive_poster_thumbnail (Gdk.Pixbuf pixbuf, Movie movie) { + private void receive_poster_icon (Gdk.Pixbuf pixbuf, Movie movie) { var poster = new Poster (); - poster.thumbnail = pixbuf; + poster.icon = pixbuf; + movie.poster = poster; + } + + private void receive_poster_small (Gdk.Pixbuf pixbuf, Movie movie) { + var poster = new Poster (); + if (movie.poster != null && movie.poster.icon != null) + poster.icon = movie.poster.icon; + poster.small = pixbuf; movie.poster = poster; } @@ -164,13 +225,6 @@ public class MovieListStore : ListStore, TreeModel { public virtual void get_value (TreeIter iter, int column, out GLib.Value value) { Movie movie; - // FIXME - if (no_poster == null) try { - no_poster = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/general_video.png"); - } catch (Error e) { - critical ("Missing general_video icon: %s\n", e.message); - } - return_if_fail (column >= 0 && column < Columns.N_COLUMNS); // Get the Movie from our parent's storage @@ -198,24 +252,44 @@ public class MovieListStore : ListStore, TreeModel { break; case Columns.RATING: - if (movie != null) { - value.set_int (movie.rating); - } else { - value.set_int (-1); - } + base.get_value (iter, 2, out value); break; case Columns.POSTER: - if ((movie.poster != null) && (movie.poster.thumbnail != null)) - value.set_object (movie.poster.thumbnail); - else + if ((movie.poster != null) && (movie.poster.small != null)) { + value.set_object (movie.poster.small); + } else { + // FIXME + if (no_poster == null) try { + // var no_pic = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/imageviewer_no_pic.png"); + var no_pic = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/general_no_thumbnail.png"); + no_poster = new Gdk.Pixbuf (Gdk.Colorspace.RGB, true, 8, Poster.SMALL_WIDTH, Poster.SMALL_HEIGHT); + no_poster.fill (0); + no_pic.copy_area (0, 0, no_pic.width, no_pic.height, no_poster, + (Poster.SMALL_WIDTH - no_pic.width) / 2, (Poster.SMALL_HEIGHT - no_pic.height) / 2); + } catch (Error e) { + critical ("Missing general_video icon: %s\n", e.message); + } value.set_object (no_poster); + } + break; + + case Columns.ICON: + if ((movie.poster != null) && (movie.poster.icon != null)) { + value.set_object (movie.poster.icon); + } else { + value.set_object (null); + } break; case Columns.MOVIE: value.set_object (movie); break; + case Columns.MARKUP: + base.get_value (iter, 1, out value); + break; + default: assert_not_reached (); }