diff --git a/panels/common/cc-language-chooser.c b/panels/common/cc-language-chooser.c index 0af18aaaf..f55bb1b3a 100644 --- a/panels/common/cc-language-chooser.c +++ b/panels/common/cc-language-chooser.c @@ -30,8 +30,6 @@ #include #include -#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) + if (row == NULL) return; - if (child == priv->no_results) - 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++; -} + GtkWidget *current; -static void -end_refilter (EggListBox *list_box, - gpointer user_data) -{ - GtkDialog *chooser = user_data; - CcLanguageChooserPrivate *priv = GET_PRIVATE (chooser); - CountChildrenData data = { 0 }; + if (before == NULL) + return; - 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); - } + 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 (priv->language_list, "row-activated", + G_CALLBACK (row_activated), chooser); - g_signal_connect_after (priv->language_list, "refilter", - G_CALLBACK (end_refilter), 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 c2ea28b1b..0bfcf091f 100644 --- a/panels/common/language-chooser.ui +++ b/panels/common/language-chooser.ui @@ -25,7 +25,7 @@ True - + True True True