From 21336daab7ce7bacc8c826f292b30442ee18439d Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Mon, 12 Jul 2010 18:28:47 +0200 Subject: [PATCH] Movie list store & view: store prepared title + year markup and rating text To avoid allocating / freeing strings during cell rendering. This also empties the year column and appends the year to the title in parentheses and in a smaller font. --- src/movie-list-store.vala | 31 ++++++++++++++++++++++--------- src/movie-list-view.vala | 28 +++++++++++++--------------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/movie-list-store.vala b/src/movie-list-store.vala index 09d6c1d..852690f 100644 --- a/src/movie-list-store.vala +++ b/src/movie-list-store.vala @@ -25,22 +25,27 @@ public class MovieListStore : ListStore, TreeModel { RATING, POSTER, MOVIE, + MARKUP, N_COLUMNS } private GLib.Type[] types = { typeof (string), typeof (int), - typeof (int), + typeof (string), 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; private MovieFilter filter; public bool update_running { get; set; } + public string year_markup = "[%d]"; private Cancellable cancellable; public signal void search_finished (int movies); @@ -66,9 +71,17 @@ 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.set (iter1, 0, movie, + 1, markup.str, + 2, (movie.rating >= 0) ? "%d.%d".printf (movie.rating / 10, movie.rating % 10) : null); movie.notify.connect (this.on_movie_changed); @@ -230,11 +243,7 @@ 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: @@ -248,6 +257,10 @@ public class MovieListStore : ListStore, TreeModel { value.set_object (movie); break; + case Columns.MARKUP: + base.get_value (iter, 1, out value); + break; + default: assert_not_reached (); } diff --git a/src/movie-list-view.vala b/src/movie-list-view.vala index 205f5ce..44cbb1d 100644 --- a/src/movie-list-view.vala +++ b/src/movie-list-view.vala @@ -35,6 +35,12 @@ public class MovieListView : PannableArea { public MovieListView (Gtk.Window window, bool show_date = false) { store = new MovieListStore (); + Gdk.Color color; + window.ensure_style (); + if (window.style.lookup_color ("SecondaryTextColor", out color)) { + store.year_markup = "(%%d)".printf (color.to_string ()); + } + // Add filter wrapper var filtered_store = new TreeModelFilter (store, null); @@ -94,14 +100,11 @@ public class MovieListView : PannableArea { sorted_store.set_sort_column_id (MovieListStore.Columns.TITLE, SortType.ASCENDING); // Year column - var renderer = new CellRendererText (); var year_column = new TreeViewColumn (); - year_column.set_title (_("Rating")); + year_column.set_title (_("Year")); year_column.set_sort_column_id (MovieListStore.Columns.YEAR); year_column.set_reorderable (false); year_column.set_sort_order (SortType.DESCENDING); - year_column.pack_start (renderer, true); - year_column.set_cell_data_func (renderer, year_data_func); tree.append_column (year_column); // Rating column @@ -200,26 +203,21 @@ public class MovieListView : PannableArea { private void title_data_func (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter) { Movie movie; + string markup; - model.get (iter, MovieListStore.Columns.MOVIE, out movie); - title_renderer.text = movie.title; + model.get (iter, MovieListStore.Columns.MOVIE, out movie, + MovieListStore.Columns.MARKUP, out markup); + title_renderer.markup = markup; secondary_renderer.text = movie.secondary; } - private void year_data_func (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter) { - int year; - - model.get (iter, MovieListStore.Columns.YEAR, out year); - ((CellRendererText) cell).text = (year > 0) ? year.to_string () : ""; - } - private void rating_data_func (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter) { - int rating; + string rating; Movie movie; model.get (iter, MovieListStore.Columns.RATING, out rating, MovieListStore.Columns.MOVIE, out movie); - rating_renderer.text = (rating > 0) ? "%d.%d".printf (rating / 10, rating % 10) : ""; + rating_renderer.text = rating; if (movie.julian_date != 0) { var date = Date (); date.set_julian (movie.julian_date); -- 1.7.9.5