[gtk/pango-list-models] font chooser: Use pango list models



commit 0d44597fae79228ebe1390cd3ec522831ee8451e
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Dec 5 00:24:59 2019 -0500

    font chooser: Use pango list models
    
    Instead of GtkFontList, use the list models provided by pango.

 gtk/gtkfontchooserwidget.c     | 50 ++++++++++++++++++++++++++++++++++++------
 gtk/ui/gtkfontchooserwidget.ui |  4 ----
 2 files changed, 43 insertions(+), 11 deletions(-)
---
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index cc4ec383cb..dcfd8e3272 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -36,7 +36,6 @@
 #include "gtkgrid.h"
 #include "gtkfontchooser.h"
 #include "gtkfontchooserutils.h"
-#include "gtkfontlist.h"
 #include "gtkintl.h"
 #include "gtklabel.h"
 #include "gtksingleselection.h"
@@ -58,6 +57,9 @@
 #include "gtkgestureclick.h"
 #include "gtkeventcontrollerscroll.h"
 #include "gtkroot.h"
+#include "gtkfilterlistmodel.h"
+#include "gtkflattenlistmodel.h"
+#include "gtkmaplistmodel.h"
 
 #include <hb-ot.h>
 
@@ -110,9 +112,10 @@ struct _GtkFontChooserWidgetPrivate
   GtkWidget    *search_entry;
   GtkWidget    *family_face_list;
   GtkWidget    *list_stack;
-  GtkFontList  *fontlist;
   GtkSingleSelection *selection;
   GtkFilter    *custom_filter;
+  GtkFilterListModel   *filter_model;
+  GListModel   *fontlist;
 
   GtkWidget       *preview;
   GtkWidget       *preview2;
@@ -575,7 +578,6 @@ gtk_font_chooser_widget_map (GtkWidget *widget)
   GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (widget);
   GtkFontChooserWidgetPrivate *priv = gtk_font_chooser_widget_get_instance_private (fontchooser);
 
-  gtk_font_list_set_display (priv->fontlist, gtk_widget_get_display (widget));
   gtk_editable_set_text (GTK_EDITABLE (priv->search_entry), "");
   gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "list");
   g_simple_action_set_state (G_SIMPLE_ACTION (priv->tweak_action), g_variant_new_boolean (FALSE));
@@ -629,7 +631,6 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GParamSpec *pspec;
 
-  g_type_ensure (GTK_TYPE_FONT_LIST);
   g_type_ensure (G_TYPE_THEMED_ICON);
 
   widget_class->root = gtk_font_chooser_widget_root;
@@ -668,7 +669,7 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, search_entry);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, family_face_list);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, list_stack);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, fontlist);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, filter_model);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, selection);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, custom_filter);
   gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, preview);
@@ -1961,6 +1962,41 @@ gtk_font_chooser_widget_set_show_preview_entry (GtkFontChooserWidget *fontchoose
     }
 }
 
+static gpointer
+pick_one_face (gpointer item, gpointer user_data)
+{
+  PangoFontFamily *family = PANGO_FONT_FAMILY (item);
+  PangoFontFace *face;
+
+  face = pango_font_family_get_face (family, "Regular");
+  
+  g_object_unref (family);
+
+  return g_object_ref (face);
+}
+
+static void
+update_fontlist (GtkFontChooserWidget *fontchooser)
+{
+  GtkFontChooserWidgetPrivate *priv = gtk_font_chooser_widget_get_instance_private (fontchooser);
+  PangoFontMap *fontmap;
+  GListModel *model;
+
+  fontmap = priv->font_map;
+  if (!fontmap)
+    fontmap = pango_cairo_font_map_get_default ();
+
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) == 0)
+    model = G_LIST_MODEL (gtk_map_list_model_new (PANGO_TYPE_FONT_FACE,
+                                                  G_LIST_MODEL (fontmap),
+                                                  pick_one_face,
+                                                  NULL, NULL));
+  else
+    model = G_LIST_MODEL (gtk_flatten_list_model_new (PANGO_TYPE_FONT_FACE, G_LIST_MODEL (fontmap)));
+  gtk_filter_list_model_set_model (priv->filter_model,  model);
+  g_object_unref (model);
+}
+
 static void
 gtk_font_chooser_widget_set_font_map (GtkFontChooser *chooser,
                                       PangoFontMap   *fontmap)
@@ -1981,7 +2017,7 @@ gtk_font_chooser_widget_set_font_map (GtkFontChooser *chooser,
       context = gtk_widget_get_pango_context (priv->preview);
       pango_context_set_font_map (context, fontmap);
 
-      gtk_font_list_set_font_map (priv->fontlist, priv->font_map);
+      update_fontlist (fontchooser);
     }
 }
 
@@ -2037,7 +2073,7 @@ gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser,
       gtk_widget_hide (priv->size_spin);
    }
 
-  gtk_font_list_set_families_only (priv->fontlist, (priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) == 0);
+  update_fontlist (fontchooser);
 
   g_object_notify (G_OBJECT (fontchooser), "level");
 }
diff --git a/gtk/ui/gtkfontchooserwidget.ui b/gtk/ui/gtkfontchooserwidget.ui
index ba84730ddc..23ce7d0e92 100644
--- a/gtk/ui/gtkfontchooserwidget.ui
+++ b/gtk/ui/gtkfontchooserwidget.ui
@@ -5,10 +5,6 @@
     <signal name="items-changed" handler="rows_changed_cb" object="GtkFontChooserWidget" swapped="1" />
     <property name="model">
       <object class="GtkFilterListModel" id="filter_model">
-        <property name="model">
-          <object class="GtkFontList" id="fontlist">
-          </object>
-        </property>
         <property name="filter">
           <object class="GtkStringFilter">
             <binding name="search">


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]