language-chooser: Convert to GtkListBox
https://bugzilla.gnome.org/show_bug.cgi?id=702164
This commit is contained in:
parent
c492349be8
commit
a07825a58e
2 changed files with 73 additions and 108 deletions
|
@ -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)
|
||||
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));
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue