private CellRendererText secondary_renderer;
private CellRendererText rating_renderer;
private CellRendererText date_renderer;
+ private MoviePoster.Factory poster_factory;
+ private int last_a = -1;
+ private int last_b = -1;
private bool poster_mode_;
public bool poster_mode {
set {
if (value & !poster_mode_) {
remove (tree);
+ tree.set_model (null);
+ icons.set_model (store);
+ store.view = (Widget) icons;
add (icons);
} else if (!value & poster_mode_) {
remove (icons);
+ icons.set_model (null);
+ tree.set_model (store);
+ store.view = (Widget) tree;
add (tree);
}
- poster_mode_ = value;
+ if (value != poster_mode_) {
+ poster_mode_ = value;
+ last_a = -1;
+ last_b = -1;
+
+ // FIXME - just calling on_adjustment_value_changed () here doesn't work
+ // because icons.get_visible_range () returns wrong paths.
+ check_posters (0, 10);
+ jump_to (0, 0);
+ }
}
}
}
private Gtk.IconView create_iconview () {
- var iconview = (Gtk.IconView) Hildon.gtk_icon_view_new_with_model (Hildon.UIMode.NORMAL, store);
+ var iconview = (Gtk.IconView) Hildon.gtk_icon_view_new (Hildon.UIMode.NORMAL);
iconview.set_column_spacing (0);
iconview.set_pixbuf_column (MovieListStore.Columns.POSTER);
iconview.margin = 0;
}
tree = create_treeview (window, show_date);
+ store.view = (Widget) tree;
icons = create_iconview ();
get_vadjustment ().value_changed.connect (on_adjustment_value_changed);
tree.row_activated.connect (on_row_activated);
icons.item_activated.connect (on_item_activated);
+ store.row_changed.connect (on_row_changed);
+ store.row_inserted.connect (on_row_changed);
store.search_finished.connect (on_search_finished);
}
construct {
hscrollbar_policy = Gtk.PolicyType.NEVER;
+
+ poster_factory = MoviePoster.Factory.get_instance ();
}
public void set_hildon_ui_mode (UIMode mode) {
more_movies_available = false;
}
}
+
+ TreePath a_;
+ TreePath b_;
+ bool range;
+ if (poster_mode_) {
+ range = icons.get_visible_range (out a_, out b_);
+ } else {
+ range = tree.get_visible_range (out a_, out b_);
+ }
+ if (range) {
+ // We know the list store is flat
+ int a = a_.get_indices ()[0];
+ int b = b_.get_indices ()[0];
+ assert (a <= b);
+
+ if (a == last_a && b == last_b)
+ return;
+
+ if (a > last_b || b < last_a) {
+ check_posters (a, b);
+ } else if (a >= last_a && b > last_b) {
+ check_posters (last_b + 1, b);
+ } else if (b <= last_b && a < last_a) {
+ check_posters (a, last_a - 1);
+ }
+
+ last_a = a;
+ last_b = b;
+ }
+ }
+
+ private void check_posters (int a, int b) {
+ for (int i = a; i <= b; i++) {
+ var path = new TreePath.from_indices (i);
+ TreeIter iter;
+ if (!store.get_iter (out iter, path))
+ continue;
+
+ Movie movie;
+ store.get (iter, MovieListStore.Columns.MOVIE, out movie);
+ if (movie == null)
+ continue;
+
+ if (poster_mode_) {
+ if (movie.poster == null || movie.poster.small == null) try {
+ poster_factory.queue (movie,
+ Poster.SMALL_WIDTH,
+ Poster.SMALL_HEIGHT,
+ true,
+ receive_poster_small);
+ } catch (Error e) {
+ warning ("Failed to queue poster request: %s\n", e.message);
+ }
+ } else {
+ if (movie.poster == null || movie.poster.icon == null) try {
+ poster_factory.queue (movie,
+ Poster.ICON_WIDTH,
+ Poster.ICON_HEIGHT,
+ true,
+ receive_poster_icon);
+ } catch (Error e) {
+ warning ("Failed to queue poster request: %s\n", e.message);
+ }
+ }
+ }
}
private void on_row_activated (TreeView tree, TreePath path, TreeViewColumn column) {
}
}
+ private void on_row_changed (TreePath path, TreeIter iter) {
+ TreePath a;
+ TreePath b;
+ bool range;
+
+ if (poster_mode_) {
+ range = icons.get_visible_range (out a, out b);
+ } else {
+ range = tree.get_visible_range (out a, out b);
+ }
+ if (!range ||
+ (range && path.compare (a) >= 0 && path.compare (b) <= 0)) {
+ Movie movie;
+
+ store.get (iter, MovieListStore.Columns.MOVIE, out movie);
+ if (movie == null)
+ return;
+
+ int i = path.get_indices ()[0];
+ check_posters (i, i);
+ }
+ }
+
+ private void receive_poster_small (Gdk.Pixbuf pixbuf, Movie movie) {
+ Poster poster;
+ if (movie.poster != null)
+ poster = movie.poster;
+ else
+ poster = new Poster ();
+ poster.small = pixbuf;
+ // Notify store of the poster change
+ movie.poster = poster;
+ }
+
+ private void receive_poster_icon (Gdk.Pixbuf pixbuf, Movie movie) {
+ Poster poster;
+ if (movie.poster != null)
+ poster = movie.poster;
+ else
+ poster = new Poster ();
+ poster.icon = pixbuf;
+ // Notify store of the poster change
+ movie.poster = poster;
+ }
+
private void on_search_finished (int movies) {
more_movies_available = (movies > 100); // FIXME
}