common: Change language chooser layout to match design

Have the language name on the left and the country on the right dimmed as per:
https://wiki.gnome.org/Design/SystemSettings/RegionAndLanguage
This commit is contained in:
Robert Ancell 2018-08-15 14:39:51 +12:00 committed by Georges Basile Stavracas Neto
parent c874eac8b3
commit b2cd50019f
2 changed files with 67 additions and 59 deletions

View file

@ -52,63 +52,57 @@ struct _CcLanguageChooser {
G_DEFINE_TYPE (CcLanguageChooser, cc_language_chooser, GTK_TYPE_DIALOG) G_DEFINE_TYPE (CcLanguageChooser, cc_language_chooser, GTK_TYPE_DIALOG)
static GtkWidget *
padded_label_new (char *text, gboolean narrow)
{
GtkWidget *widget;
widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
gtk_widget_set_margin_top (widget, 10);
gtk_widget_set_margin_bottom (widget, 10);
gtk_widget_set_margin_start (widget, narrow ? 10 : 80);
gtk_widget_set_margin_end (widget, narrow ? 10 : 80);
gtk_box_pack_start (GTK_BOX (widget), gtk_label_new (text), FALSE, FALSE, 0);
return widget;
}
static GtkWidget * static GtkWidget *
language_widget_new (const gchar *locale_id, language_widget_new (const gchar *locale_id,
const gchar *current_locale_id,
gboolean is_extra) gboolean is_extra)
{ {
gchar *locale_name; g_autofree gchar *language_code = NULL;
gchar *locale_current_name; g_autofree gchar *country_code = NULL;
gchar *locale_untranslated_name; g_autofree gchar *language = NULL;
g_autofree gchar *country = NULL;
g_autofree gchar *language_local = NULL;
g_autofree gchar *country_local = NULL;
GtkWidget *row; GtkWidget *row;
GtkWidget *check;
GtkWidget *box; GtkWidget *box;
GtkWidget *language_label;
GtkWidget *check;
GtkWidget *country_label;
locale_name = gnome_get_language_from_locale (locale_id, locale_id); gnome_parse_locale (locale_id, &language_code, &country_code, NULL, NULL);
locale_current_name = gnome_get_language_from_locale (locale_id, NULL); language = gnome_get_language_from_code (language_code, locale_id);
locale_untranslated_name = gnome_get_language_from_locale (locale_id, "C"); country = gnome_get_country_from_code (country_code, locale_id);
language_local = gnome_get_language_from_code (language_code, NULL);
country_local = gnome_get_country_from_code (country_code, NULL);
row = gtk_list_box_row_new (); row = gtk_list_box_row_new ();
box = padded_label_new (locale_name, is_extra);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
gtk_widget_set_margin_top (box, 12);
gtk_widget_set_margin_bottom (box, 12);
gtk_widget_set_margin_start (box, 18);
gtk_widget_set_margin_end (box, 18);
gtk_container_add (GTK_CONTAINER (row), box); gtk_container_add (GTK_CONTAINER (row), box);
/* We add a check on each side of the label to keep it centered. */ language_label = gtk_label_new (language);
check = gtk_image_new (); gtk_label_set_xalign (GTK_LABEL (language_label), 0.0);
gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU); gtk_box_pack_start (GTK_BOX (box), language_label, FALSE, TRUE, 0);
gtk_widget_set_opacity (check, 0.0);
g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL);
gtk_box_pack_start (GTK_BOX (box), check, FALSE, FALSE, 0);
gtk_box_reorder_child (GTK_BOX (box), check, 0);
check = gtk_image_new (); check = gtk_image_new ();
gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU); 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); g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL);
gtk_box_pack_start (GTK_BOX (box), 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); country_label = gtk_label_new (country);
gtk_label_set_xalign (GTK_LABEL (country_label), 1.0);
gtk_style_context_add_class (gtk_widget_get_style_context (country_label), "dim-label");
gtk_box_pack_start (GTK_BOX (box), country_label, TRUE, TRUE, 0);
g_object_set_data (G_OBJECT (row), "check", check); 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-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), "language", g_steal_pointer (&language), 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), "country", g_steal_pointer (&country), g_free);
g_object_set_data_full (G_OBJECT (row), "locale-untranslated-name", locale_untranslated_name, g_free); g_object_set_data_full (G_OBJECT (row), "language-local", g_steal_pointer (&language_local), g_free);
g_object_set_data_full (G_OBJECT (row), "country-local", g_steal_pointer (&country_local), g_free);
g_object_set_data (G_OBJECT (row), "is-extra", GUINT_TO_POINTER (is_extra)); g_object_set_data (G_OBJECT (row), "is-extra", GUINT_TO_POINTER (is_extra));
return row; return row;
@ -139,7 +133,7 @@ no_results_widget_new (void)
{ {
GtkWidget *widget; GtkWidget *widget;
widget = padded_label_new (_("No languages found"), TRUE); widget = gtk_label_new (_("No languages found"));
gtk_widget_set_sensitive (widget, FALSE); gtk_widget_set_sensitive (widget, FALSE);
return widget; return widget;
} }
@ -161,7 +155,7 @@ add_languages (CcLanguageChooser *chooser,
continue; continue;
is_initial = (g_hash_table_lookup (initial, locale_id) != NULL); is_initial = (g_hash_table_lookup (initial, locale_id) != NULL);
widget = language_widget_new (locale_id, chooser->language, !is_initial); widget = language_widget_new (locale_id, !is_initial);
gtk_container_add (GTK_CONTAINER (chooser->language_listbox), widget); gtk_container_add (GTK_CONTAINER (chooser->language_listbox), widget);
} }
@ -201,9 +195,10 @@ language_visible (GtkListBoxRow *row,
gpointer user_data) gpointer user_data)
{ {
CcLanguageChooser *chooser = user_data; CcLanguageChooser *chooser = user_data;
g_autofree gchar *locale_name = NULL; g_autofree gchar *language = NULL;
g_autofree gchar *locale_current_name = NULL; g_autofree gchar *country = NULL;
g_autofree gchar *locale_untranslated_name = NULL; g_autofree gchar *language_local = NULL;
g_autofree gchar *country_local = NULL;
gboolean is_extra; gboolean is_extra;
gboolean visible; gboolean visible;
@ -218,21 +213,27 @@ language_visible (GtkListBoxRow *row,
if (!chooser->filter_words) if (!chooser->filter_words)
return TRUE; return TRUE;
locale_name = language =
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "locale-name")); cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "language"));
visible = match_all (chooser->filter_words, locale_name); visible = match_all (chooser->filter_words, language);
if (visible) if (visible)
return TRUE; return TRUE;
locale_current_name = country =
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "locale-current-name")); cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "country"));
visible = match_all (chooser->filter_words, locale_current_name); visible = match_all (chooser->filter_words, country);
if (visible) if (visible)
return TRUE; return TRUE;
locale_untranslated_name = language_local =
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "locale-untranslated-name")); cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "language-local"));
return match_all (chooser->filter_words, locale_untranslated_name); visible = match_all (chooser->filter_words, language_local);
if (visible)
return TRUE;
country_local =
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (row), "country-local"));
return match_all (chooser->filter_words, country_local);
} }
static gint static gint
@ -240,18 +241,23 @@ sort_languages (GtkListBoxRow *a,
GtkListBoxRow *b, GtkListBoxRow *b,
gpointer data) gpointer data)
{ {
const gchar *la; const gchar *la, *lb, *ca, *cb;
const gchar *lb; int d;
if (g_object_get_data (G_OBJECT (a), "locale-id") == NULL) if (g_object_get_data (G_OBJECT (a), "locale-id") == NULL)
return 1; return 1;
if (g_object_get_data (G_OBJECT (b), "locale-id") == NULL) if (g_object_get_data (G_OBJECT (b), "locale-id") == NULL)
return -1; return -1;
la = g_object_get_data (G_OBJECT (a), "locale-name"); la = g_object_get_data (G_OBJECT (a), "language");
lb = g_object_get_data (G_OBJECT (b), "locale-name"); lb = g_object_get_data (G_OBJECT (b), "language");
d = g_strcmp0 (la, lb);
if (d != 0)
return d;
return g_strcmp0 (la, lb); ca = g_object_get_data (G_OBJECT (a), "country");
cb = g_object_get_data (G_OBJECT (b), "country");
return g_strcmp0 (ca, cb);
} }
static void static void
@ -288,6 +294,7 @@ show_more (CcLanguageChooser *chooser, gboolean visible)
gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->language_listbox)); gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->language_listbox));
} }
static void static void
set_locale_id (CcLanguageChooser *chooser, set_locale_id (CcLanguageChooser *chooser,
const gchar *locale_id) const gchar *locale_id)
@ -308,7 +315,7 @@ set_locale_id (CcLanguageChooser *chooser,
if (g_strcmp0 (locale_id, language) == 0) { if (g_strcmp0 (locale_id, language) == 0) {
gboolean is_extra; gboolean is_extra;
gtk_widget_set_opacity (check, 1.0); gtk_widget_show (check);
gtk_widget_set_sensitive (chooser->select_button, TRUE); gtk_widget_set_sensitive (chooser->select_button, TRUE);
/* make sure the selected language is shown */ /* make sure the selected language is shown */
@ -318,7 +325,7 @@ set_locale_id (CcLanguageChooser *chooser,
gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->language_listbox)); gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->language_listbox));
} }
} else { } else {
gtk_widget_set_opacity (check, 0.0); gtk_widget_hide (check);
} }
} }

View file

@ -5,6 +5,7 @@
<property name="title" translatable="yes">Select Language</property> <property name="title" translatable="yes">Select Language</property>
<property name="modal">True</property> <property name="modal">True</property>
<property name="destroy_with_parent">True</property> <property name="destroy_with_parent">True</property>
<property name="default_width">400</property>
<property name="default_height">350</property> <property name="default_height">350</property>
<child type="action"> <child type="action">
<object class="GtkButton" id="select_button"> <object class="GtkButton" id="select_button">