[gnome-control-center] language-chooser: Convert to GtkListBox



commit a07825a58e42d508015be089f58146b42d518ff4
Author: Alexander Larsson <alexl redhat com>
Date:   Thu Jun 13 12:19:28 2013 +0200

    language-chooser: Convert to GtkListBox
    
    https://bugzilla.gnome.org/show_bug.cgi?id=702164

 panels/common/cc-language-chooser.c |  183 ++++++++++++++---------------------
 panels/common/language-chooser.ui   |    2 +-
 2 files changed, 75 insertions(+), 110 deletions(-)
---
diff --git a/panels/common/cc-language-chooser.c b/panels/common/cc-language-chooser.c
index 0af18aa..f55bb1b 100644
--- a/panels/common/cc-language-chooser.c
+++ b/panels/common/cc-language-chooser.c
@@ -30,8 +30,6 @@
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
-#include "egg-list-box/egg-list-box.h"
-
 #include "cc-common-language.h"
 #include "cc-util.h"
 
@@ -40,7 +38,7 @@
 
 typedef struct {
         GtkWidget *no_results;
-        GtkWidget *more_item;
+        GtkListBoxRow *more_item;
         GtkWidget *filter_entry;
         GtkWidget *language_list;
         GtkWidget *scrolledwindow;
@@ -76,58 +74,63 @@ language_widget_new (const gchar *locale_id,
         gchar *locale_name;
         gchar *locale_current_name;
         gchar *locale_untranslated_name;
-        GtkWidget *widget;
+        GtkWidget *row;
         GtkWidget *check;
+        GtkWidget *box;
 
         locale_name = gnome_get_language_from_locale (locale_id, locale_id);
         locale_current_name = gnome_get_language_from_locale (locale_id, NULL);
         locale_untranslated_name = gnome_get_language_from_locale (locale_id, "C");
 
-        widget = padded_label_new (locale_name, is_extra);
+        row = gtk_list_box_row_new ();
+        box = padded_label_new (locale_name, is_extra);
+        gtk_container_add (GTK_CONTAINER (row), box);
 
         /* We add a check on each side of the label to keep it centered. */
         check = gtk_image_new ();
         gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU);
         gtk_widget_set_opacity (check, 0.0);
         g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL);
-        gtk_box_pack_start (GTK_BOX (widget), check, FALSE, FALSE, 0);
-        gtk_box_reorder_child (GTK_BOX (widget), check, 0);
+        gtk_box_pack_start (GTK_BOX (box), check, FALSE, FALSE, 0);
+        gtk_box_reorder_child (GTK_BOX (box), check, 0);
 
         check = gtk_image_new ();
         gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU);
         gtk_widget_set_opacity (check, 0.0);
         g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL);
-        gtk_box_pack_start (GTK_BOX (widget), check, FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (box), check, FALSE, FALSE, 0);
         if (g_strcmp0 (locale_id, current_locale_id) == 0)
                 gtk_widget_set_opacity (check, 1.0);
 
-        g_object_set_data (G_OBJECT (widget), "check", check);
-        g_object_set_data_full (G_OBJECT (widget), "locale-id", g_strdup (locale_id), g_free);
-        g_object_set_data_full (G_OBJECT (widget), "locale-name", locale_name, g_free);
-        g_object_set_data_full (G_OBJECT (widget), "locale-current-name", locale_current_name, g_free);
-        g_object_set_data_full (G_OBJECT (widget), "locale-untranslated-name", locale_untranslated_name, 
g_free);
-        g_object_set_data (G_OBJECT (widget), "is-extra", GUINT_TO_POINTER (is_extra));
+        g_object_set_data (G_OBJECT (row), "check", check);
+        g_object_set_data_full (G_OBJECT (row), "locale-id", g_strdup (locale_id), g_free);
+        g_object_set_data_full (G_OBJECT (row), "locale-name", locale_name, g_free);
+        g_object_set_data_full (G_OBJECT (row), "locale-current-name", locale_current_name, g_free);
+        g_object_set_data_full (G_OBJECT (row), "locale-untranslated-name", locale_untranslated_name, 
g_free);
+        g_object_set_data (G_OBJECT (row), "is-extra", GUINT_TO_POINTER (is_extra));
 
-        return widget;
+        return row;
 }
 
-static GtkWidget *
+static GtkListBoxRow *
 more_widget_new (void)
 {
-        GtkWidget *widget;
+        GtkWidget *box, *row;
         GtkWidget *arrow;
 
-        widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
-        gtk_widget_set_tooltip_text (widget, _("More…"));
+        row = gtk_list_box_row_new ();
+        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+        gtk_container_add (GTK_CONTAINER (row), box);
+        gtk_widget_set_tooltip_text (box, _("More…"));
 
         arrow = gtk_image_new_from_icon_name ("view-more-symbolic", GTK_ICON_SIZE_MENU);
         gtk_style_context_add_class (gtk_widget_get_style_context (arrow), "dim-label");
-        gtk_widget_set_margin_top (widget, 10);
-        gtk_widget_set_margin_bottom (widget, 10);
+        gtk_widget_set_margin_top (box, 10);
+        gtk_widget_set_margin_bottom (box, 10);
         gtk_misc_set_alignment (GTK_MISC (arrow), 0.5, 0.5);
-        gtk_box_pack_start (GTK_BOX (widget), arrow, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (box), arrow, TRUE, TRUE, 0);
 
-        return widget;
+        return GTK_LIST_BOX_ROW (row);
 }
 
 static GtkWidget *
@@ -165,8 +168,7 @@ add_languages (GtkDialog   *chooser,
                 gtk_container_add (GTK_CONTAINER (priv->language_list), widget);
         }
 
-        gtk_container_add (GTK_CONTAINER (priv->language_list), priv->more_item);
-        gtk_container_add (GTK_CONTAINER (priv->language_list), priv->no_results);
+        gtk_container_add (GTK_CONTAINER (priv->language_list), GTK_WIDGET (priv->more_item));
 
         gtk_widget_show_all (priv->language_list);
 
@@ -200,7 +202,7 @@ match_all (gchar       **words,
 }
 
 static gboolean
-language_visible (GtkWidget *child,
+language_visible (GtkListBoxRow *row,
                   gpointer   user_data)
 {
         GtkDialog *chooser = user_data;
@@ -211,14 +213,10 @@ language_visible (GtkWidget *child,
         gboolean is_extra;
         gboolean visible;
 
-        if (child == priv->more_item)
+        if (row == priv->more_item)
                 return !priv->showing_extra;
 
-        /* We hide this in the after-refilter handler below. */
-        if (child == priv->no_results)
-                return TRUE;
-
-        is_extra = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "is-extra"));
+        is_extra = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (row), "is-extra"));
 
         if (!priv->showing_extra && is_extra)
                 return FALSE;
@@ -229,19 +227,19 @@ language_visible (GtkWidget *child,
         visible = FALSE;
 
         locale_name =
-                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), 
"locale-name"));
+                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "locale-name"));
         visible = match_all (priv->filter_words, locale_name);
         if (visible)
                 goto out;
 
         locale_current_name =
-                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), 
"locale-current-name"));
+                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), 
"locale-current-name"));
         visible = match_all (priv->filter_words, locale_current_name);
         if (visible)
                 goto out;
 
         locale_untranslated_name =
-                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), 
"locale-untranslated-name"));
+                cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), 
"locale-untranslated-name"));
         visible = match_all (priv->filter_words, locale_untranslated_name);
 
 out:
@@ -252,8 +250,8 @@ out:
 }
 
 static gint
-sort_languages (GtkWidget *a,
-                GtkWidget *b,
+sort_languages (GtkListBoxRow *a,
+                GtkListBoxRow *b,
                 gpointer   data)
 {
         const gchar *la;
@@ -281,12 +279,14 @@ filter_changed (GtkDialog *chooser)
         filter_contents =
                 cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY 
(priv->filter_entry)));
         if (!filter_contents) {
-                egg_list_box_refilter (EGG_LIST_BOX (priv->language_list));
+                gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->language_list));
+                gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->language_list), NULL);
                 return;
         }
         priv->filter_words = g_strsplit_set (g_strstrip (filter_contents), " ", 0);
         g_free (filter_contents);
-        egg_list_box_refilter (EGG_LIST_BOX (priv->language_list));
+        gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->language_list), priv->no_results);
+        gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->language_list));
 }
 
 static void
@@ -310,7 +310,7 @@ show_more (GtkDialog *chooser)
 
         priv->showing_extra = TRUE;
 
-        egg_list_box_refilter (EGG_LIST_BOX (priv->language_list));
+        gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->language_list));
 }
 
 static void
@@ -337,7 +337,7 @@ set_locale_id (GtkDialog *chooser,
                         is_extra = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (row), "is-extra"));
                         if (!priv->showing_extra && is_extra) {
                                 g_object_set_data (G_OBJECT (row), "is-extra", GINT_TO_POINTER (FALSE));
-                                egg_list_box_refilter (EGG_LIST_BOX (priv->language_list));
+                                gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->language_list));
                         }
                 } else {
                         gtk_widget_set_opacity (check, 0.0);
@@ -350,9 +350,9 @@ set_locale_id (GtkDialog *chooser,
 }
 
 static void
-child_activated (EggListBox        *box,
-                 GtkWidget         *child,
-                 GtkDialog *chooser)
+row_activated (GtkListBox        *box,
+               GtkListBoxRow     *row,
+               GtkDialog *chooser)
 {
         CcLanguageChooserPrivate *priv = GET_PRIVATE (chooser);
         gchar *new_locale_id;
@@ -360,66 +360,34 @@ child_activated (EggListBox        *box,
         if (priv->adding_languages)
                 return;
 
-        if (child == NULL)
-                return;
-
-        if (child == priv->no_results)
+        if (row == NULL)
                 return;
 
-        if (child == priv->more_item) {
+        if (row == priv->more_item) {
                 show_more (chooser);
                 return;
         }
-        new_locale_id = g_object_get_data (G_OBJECT (child), "locale-id");
+        new_locale_id = g_object_get_data (G_OBJECT (row), "locale-id");
         set_locale_id (chooser, new_locale_id);
 }
 
-typedef struct {
-        gint count;
-        GtkWidget *ignore;
-} CountChildrenData;
-
 static void
-count_visible_children (GtkWidget *widget,
-                        gpointer   user_data)
+update_header_func (GtkListBoxRow  *row,
+                    GtkListBoxRow  *before,
+                    gpointer    user_data)
 {
-        CountChildrenData *data = user_data;
-        if (widget != data->ignore &&
-            gtk_widget_get_child_visible (widget) &&
-            gtk_widget_get_visible (widget))
-                data->count++;
-}
-
-static void
-end_refilter (EggListBox *list_box,
-              gpointer    user_data)
-{
-        GtkDialog *chooser = user_data;
-        CcLanguageChooserPrivate *priv = GET_PRIVATE (chooser);
-        CountChildrenData data = { 0 };
-
-        data.ignore = priv->no_results;
-
-        gtk_container_foreach (GTK_CONTAINER (list_box),
-                               count_visible_children, &data);
-
-        gtk_widget_set_visible (priv->no_results, (data.count == 0));
-}
-
-static void
-update_separator_func (GtkWidget **separator,
-                       GtkWidget  *child,
-                       GtkWidget  *before,
-                       gpointer    user_data)
-{
-        if (before == NULL)
-                return;
-
-        if (*separator == NULL) {
-                *separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
-                g_object_ref_sink (*separator);
-                gtk_widget_show (*separator);
-        }
+  GtkWidget *current;
+
+  if (before == NULL)
+    return;
+
+  current = gtk_list_box_row_get_header (row);
+  if (current == NULL)
+    {
+      current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+      gtk_widget_show (current);
+      gtk_list_box_row_set_header (row, current);
+    }
 }
 
 static void
@@ -427,6 +395,7 @@ cc_language_chooser_private_free (gpointer data)
 {
         CcLanguageChooserPrivate *priv = data;
 
+        g_clear_object (&priv->no_results);
         g_strfreev (priv->filter_words);
         g_free (priv->language);
         g_free (priv);
@@ -461,31 +430,27 @@ cc_language_chooser_new (GtkWidget *parent)
         priv->language_list = WID ("language-list");
         priv->scrolledwindow = WID ("language-scrolledwindow");
         priv->more_item = more_widget_new ();
-        priv->no_results = no_results_widget_new ();
+        /* We ref-sink here so we can reuse this widget multiple times */
+        priv->no_results = g_object_ref_sink (no_results_widget_new ());
+        gtk_widget_show_all (priv->no_results);
 
-        egg_list_box_set_adjustment (EGG_LIST_BOX (priv->language_list),
-                                     gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW 
(priv->scrolledwindow)));
-
-        egg_list_box_set_sort_func (EGG_LIST_BOX (priv->language_list),
+        gtk_list_box_set_sort_func (GTK_LIST_BOX (priv->language_list),
                                     sort_languages, chooser, NULL);
-        egg_list_box_set_filter_func (EGG_LIST_BOX (priv->language_list),
+        gtk_list_box_set_filter_func (GTK_LIST_BOX (priv->language_list),
                                       language_visible, chooser, NULL);
-        egg_list_box_set_selection_mode (EGG_LIST_BOX (priv->language_list),
+        gtk_list_box_set_selection_mode (GTK_LIST_BOX (priv->language_list),
                                          GTK_SELECTION_NONE);
-        egg_list_box_set_separator_funcs (EGG_LIST_BOX (priv->language_list),
-                                          update_separator_func, NULL, NULL);
+        gtk_list_box_set_header_func (GTK_LIST_BOX (priv->language_list),
+                                      update_header_func, NULL, NULL);
         add_all_languages (GTK_DIALOG (chooser));
 
         g_signal_connect_swapped (priv->filter_entry, "changed",
                                   G_CALLBACK (filter_changed), chooser);
 
-        g_signal_connect (priv->language_list, "child-activated",
-                          G_CALLBACK (child_activated), chooser);
-
-        g_signal_connect_after (priv->language_list, "refilter",
-                                G_CALLBACK (end_refilter), chooser);
+        g_signal_connect (priv->language_list, "row-activated",
+                          G_CALLBACK (row_activated), chooser);
 
-        egg_list_box_refilter (EGG_LIST_BOX (priv->language_list));
+        gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->language_list));
 
         gtk_window_set_transient_for (GTK_WINDOW (chooser), GTK_WINDOW (parent));
 
diff --git a/panels/common/language-chooser.ui b/panels/common/language-chooser.ui
index c2ea28b..0bfcf09 100644
--- a/panels/common/language-chooser.ui
+++ b/panels/common/language-chooser.ui
@@ -25,7 +25,7 @@
               <object class="GtkViewport" id="language-viewport">
                 <property name="visible">True</property>
                 <child>
-                  <object class="EggListBox" id="language-list">
+                  <object class="GtkListBox" id="language-list">
                     <property name="visible">True</property>
                     <property name="can-focus">True</property>
                     <property name="vexpand">True</property>


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