X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmovie-list-store.vala;h=52a3c3d9b9edbc99a910d47c16a40116e7b05dfb;hb=3217afeae35563fab2733bf0ab04567ea3c64871;hp=09d6c1dbda7e2734cc0699462f2234fa7210742f;hpb=d3bbd5f87a7a48f6aa2e2d43bb440a77ab4ef749;p=cinaest diff --git a/src/movie-list-store.vala b/src/movie-list-store.vala index 09d6c1d..52a3c3d 100644 --- a/src/movie-list-store.vala +++ b/src/movie-list-store.vala @@ -24,24 +24,32 @@ 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 (Movie) + typeof (Gdk.Pixbuf), + 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; 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); @@ -66,15 +74,32 @@ 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; @@ -166,19 +191,23 @@ public class MovieListStore : ListStore, TreeModel { if (cancellable.is_cancelled ()) return; - foreach (Movie movie in movies) { + view.freeze_child_notify (); + foreach (Movie movie in movies) 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.thaw_child_notify (); + } + + private void receive_poster_icon (Gdk.Pixbuf pixbuf, Movie movie) { + var poster = new Poster (); + poster.icon = pixbuf; + movie.poster = poster; } - private void receive_poster_thumbnail (Gdk.Pixbuf pixbuf, Movie movie) { + private void receive_poster_small (Gdk.Pixbuf pixbuf, Movie movie) { var poster = new Poster (); - poster.thumbnail = pixbuf; + if (movie.poster != null && movie.poster.icon != null) + poster.icon = movie.poster.icon; + poster.small = pixbuf; movie.poster = poster; } @@ -196,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 @@ -230,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 (); }