X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmovie-list-store.vala;h=c87d1dae6f5bd5c8072e4050bcf7eb5808a85152;hb=496ca82635f6e53bd37a97bbb99d2cf7ae5b0829;hp=b47fa20836f08fc659d7c33e6cb9d3e3b22fcbf3;hpb=9dfa698b63e25827bb1a55cb851fab423599c9a9;p=cinaest
diff --git a/src/movie-list-store.vala b/src/movie-list-store.vala
index b47fa20..c87d1da 100644
--- a/src/movie-list-store.vala
+++ b/src/movie-list-store.vala
@@ -24,45 +24,94 @@ 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;
- public MovieSource source;
+ 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);
+
+ private MovieSource _source;
+ public MovieSource source {
+ get {
+ return _source;
+ }
+ set {
+ _source = value;
+ }
+ }
construct {
set_column_types (base_type);
no_poster = null;
source = null;
update_running = false;
+
+ poster_factory = MoviePoster.Factory.get_instance ();
}
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);
- movie.notify.connect ((source, property) => { on_movie_changed(source); });
+ base.insert_with_values (out iter1, -1,
+ 0, movie,
+ 1, markup.str,
+ 2, (movie.rating >= 0) ? "%.1f".printf (movie.rating / 10.0) : null);
+
+ movie.notify.connect (this.on_movie_changed);
iter = iter1;
}
- private void on_movie_changed (GLib.Object source) {
- Movie movie = (Movie) source;
+ 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;
TreeIter iter;
if (get_iter_from_movie (out iter, movie)) {
@@ -71,6 +120,10 @@ public class MovieListStore : ListStore, TreeModel {
}
}
+ public bool get_editable () {
+ return (SourceFlags.EDITABLE in source.get_flags ());
+ }
+
public bool get_iter_from_movie (out TreeIter iter, Movie movie_a) {
if (get_iter_first (out iter)) {
do {
@@ -87,7 +140,7 @@ public class MovieListStore : ListStore, TreeModel {
if (update_running) {
stdout.printf ("aborting search ...\n");
cancellable.cancel ();
- // poster_factory.clear_queue ();
+ poster_factory.clear_queue ();
return false;
}
if (cancellable == null || cancellable.is_cancelled ())
@@ -106,9 +159,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 ()) {
@@ -123,15 +178,32 @@ 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);
+ view.freeze_child_notify ();
+ foreach (Movie movie in movies)
+ add (movie, out iter);
+ 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_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;
+ }
+
// Implement TreeModel interface
public virtual GLib.Type get_column_type (int index_) {
return_val_if_fail (index_ >= 0 && index_ < Columns.N_COLUMNS, 0);
@@ -146,13 +218,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
@@ -180,24 +245,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 ();
}