summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorraveit65 <[email protected]>2017-01-08 19:26:54 +0100
committerraveit65 <[email protected]>2017-02-17 12:28:22 +0100
commit7e20448f7a3c03d1e9add21c95d7020198b97798 (patch)
treeeaae6ec72703d271577b78b9b20232b8141acb7f
parenta90ffcd2912dc484cee7dd95b794860b9353138a (diff)
downloadmate-control-center-7e20448f7a3c03d1e9add21c95d7020198b97798.tar.bz2
mate-control-center-7e20448f7a3c03d1e9add21c95d7020198b97798.tar.xz
Fontviewer: model: cache tree iters when setting values on the model
This speeds up model loading again, since we don't need to go through the font list again when setting the thumbnail pixbuf. taken from: https://git.gnome.org/browse/gnome-font-viewer/commit/?id=2120af2
-rw-r--r--font-viewer/font-model.c67
-rw-r--r--font-viewer/font-model.h3
2 files changed, 22 insertions, 48 deletions
diff --git a/font-viewer/font-model.c b/font-viewer/font-model.c
index d5243f34..c89c0144 100644
--- a/font-viewer/font-model.c
+++ b/font-viewer/font-model.c
@@ -75,32 +75,26 @@ typedef struct {
FT_Face face;
GtkTreeIter iter;
gboolean found;
-} IterForFileData;
+} IterForFaceData;
static gboolean
-iter_for_file_foreach (GtkTreeModel *model,
+iter_for_face_foreach (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data)
{
- IterForFileData *data = user_data;
- gchar *font_path, *font_name, *match_name;
+ IterForFaceData *data = user_data;
+ gchar *font_name, *match_name;
gboolean retval;
gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
COLUMN_NAME, &font_name,
- COLUMN_PATH, &font_path,
-1);
- if (data->file) {
- retval = (g_strcmp0 (font_path, data->file) == 0);
- } else if (data->face) {
- match_name = font_utils_get_font_name (data->face);
- retval = (g_strcmp0 (font_name, match_name) == 0);
- g_free (match_name);
- }
+ match_name = font_utils_get_font_name (data->face);
+ retval = (g_strcmp0 (font_name, match_name) == 0);
- g_free (font_path);
+ g_free (match_name);
g_free (font_name);
if (retval) {
@@ -111,55 +105,36 @@ iter_for_file_foreach (GtkTreeModel *model,
return retval;
}
-static gboolean
-font_view_model_get_iter_internal (FontViewModel *self,
- const gchar *file,
+gboolean
+font_view_model_get_iter_for_face (FontViewModel *self,
FT_Face face,
GtkTreeIter *iter)
{
- IterForFileData *data = g_slice_new0 (IterForFileData);
+ IterForFaceData *data = g_slice_new0 (IterForFaceData);
gboolean found;
- data->file = file;
data->face = face;
data->found = FALSE;
gtk_tree_model_foreach (GTK_TREE_MODEL (self),
- iter_for_file_foreach,
+ iter_for_face_foreach,
data);
found = data->found;
if (found && iter)
*iter = data->iter;
- g_slice_free (IterForFileData, data);
+ g_slice_free (IterForFaceData, data);
return found;
}
-gboolean
-font_view_model_get_iter_for_file (FontViewModel *self,
- const gchar *file,
- GtkTreeIter *iter)
-{
- return font_view_model_get_iter_internal
- (self, file, NULL, iter);
-}
-
-gboolean
-font_view_model_get_iter_for_face (FontViewModel *self,
- FT_Face face,
- GtkTreeIter *iter)
-{
- return font_view_model_get_iter_internal
- (self, NULL, face, iter);
-}
-
typedef struct {
FontViewModel *self;
GFile *font_file;
gchar *font_path;
GdkPixbuf *pixbuf;
+ GtkTreeIter iter;
} LoadThumbnailData;
static void
@@ -177,11 +152,9 @@ static gboolean
ensure_thumbnail_job_done (gpointer user_data)
{
LoadThumbnailData *data = user_data;
- GtkTreeIter iter;
- if ((data->pixbuf != NULL) &&
- (font_view_model_get_iter_for_file (data->self, data->font_path, &iter)))
- gtk_list_store_set (GTK_LIST_STORE (data->self), &iter,
+ if (data->pixbuf != NULL)
+ gtk_list_store_set (GTK_LIST_STORE (data->self), &(data->iter),
COLUMN_ICON, data->pixbuf,
-1);
@@ -299,7 +272,8 @@ ensure_thumbnail_job (GIOSchedulerJob *job,
static void
ensure_thumbnail (FontViewModel *self,
- const gchar *path)
+ const gchar *path,
+ GtkTreeIter *iter)
{
LoadThumbnailData *data;
@@ -307,6 +281,7 @@ ensure_thumbnail (FontViewModel *self,
data->self = g_object_ref (self);
data->font_file = g_file_new_for_path (path);
data->font_path = g_strdup (path);
+ data->iter = *iter;
g_io_scheduler_push_job (ensure_thumbnail_job, data,
NULL, G_PRIORITY_DEFAULT, NULL);
@@ -345,6 +320,8 @@ ensure_font_list (FontViewModel *self)
return;
for (i = 0; i < self->priv->font_list->nfont; i++) {
+ GtkTreeIter iter;
+
FcPatternGetString (self->priv->font_list->fonts[i], FC_FILE, 0, &file);
font_name = font_utils_get_font_name_for_file (self->priv->library, (const gchar *) file);
@@ -353,7 +330,7 @@ ensure_font_list (FontViewModel *self)
collation_key = g_utf8_collate_key (font_name, -1);
- gtk_list_store_insert_with_values (GTK_LIST_STORE (self), NULL, -1,
+ gtk_list_store_insert_with_values (GTK_LIST_STORE (self), &iter, -1,
COLUMN_NAME, font_name,
COLUMN_POINTER, self->priv->font_list->fonts[i],
COLUMN_PATH, file,
@@ -361,7 +338,7 @@ ensure_font_list (FontViewModel *self)
COLUMN_COLLATION_KEY, collation_key,
-1);
- ensure_thumbnail (self, (const gchar *) file);
+ ensure_thumbnail (self, (const gchar *) file, &iter);
g_free (font_name);
g_free (collation_key);
diff --git a/font-viewer/font-model.h b/font-viewer/font-model.h
index f4ae79aa..deed9470 100644
--- a/font-viewer/font-model.h
+++ b/font-viewer/font-model.h
@@ -58,9 +58,6 @@ typedef struct {
GType font_view_model_get_type (void);
GtkTreeModel * font_view_model_new (void);
-gboolean font_view_model_get_iter_for_file (FontViewModel *self,
- const gchar *file,
- GtkTreeIter *iter);
gboolean font_view_model_get_iter_for_face (FontViewModel *self,
FT_Face face,
GtkTreeIter *iter);