[gnome-control-center] region: Reinstate the separator in the languages list



commit 897243858f04eca03e757252da68a82e080f4693
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Dec 11 09:14:39 2012 +0100

    region: Reinstate the separator in the languages list
    
    The separator went missing when we started adding the popular
    languages to the list. Make it come back to separate the user
    languages from the popular ones.

 panels/common/cc-common-language.c      |   76 ++++++++++++++++++++-----------
 panels/common/cc-common-language.h      |    2 +
 panels/common/cc-language-chooser.c     |    2 +-
 panels/region/gnome-region-panel-lang.c |   12 ++++-
 4 files changed, 61 insertions(+), 31 deletions(-)
---
diff --git a/panels/common/cc-common-language.c b/panels/common/cc-common-language.c
index b5e32a5..727937d 100644
--- a/panels/common/cc-common-language.c
+++ b/panels/common/cc-common-language.c
@@ -264,21 +264,6 @@ add_one_language (gpointer d)
     goto next;
   }
 
-  /* Add separator between initial languages and new additions */
-  if (g_object_get_data (G_OBJECT (data->store), "needs-separator")) {
-    GtkTreeIter iter;
-
-    gtk_list_store_insert_with_values (GTK_LIST_STORE (data->store),
-                                       &iter,
-                                       -1,
-                                       LOCALE_COL, NULL,
-                                       DISPLAY_LOCALE_COL, "Don't show",
-                                       SEPARATOR_COL, TRUE,
-                                       USER_LANGUAGE, FALSE,
-                                       -1);
-    g_object_set_data (G_OBJECT (data->store), "needs-separator", NULL);
-  }
-
   gtk_list_store_insert_with_values (data->store,
                                      &iter,
                                      -1,
@@ -335,23 +320,27 @@ cc_common_language_get_current_language (void)
         return language;
 }
 
+typedef struct {
+	GtkListStore *store;
+	gboolean      user_lang;
+} LangForeachData;
+
 static void
 languages_foreach_cb (gpointer key,
 		      gpointer value,
 		      gpointer user_data)
 {
-	GtkListStore *store = (GtkListStore *) user_data;
+	LangForeachData *data = (LangForeachData *) user_data;
 	const char *locale = (const char *) key;
 	const char *display_locale = (const char *) value;
-	GtkTreeIter iter;
 
-        gtk_list_store_insert_with_values (store,
-                                           &iter,
+        gtk_list_store_insert_with_values (data->store,
+                                           NULL,
                                            -1,
                                            LOCALE_COL, locale,
                                            DISPLAY_LOCALE_COL, display_locale,
                                            SEPARATOR_COL, FALSE,
-                                           USER_LANGUAGE, TRUE,
+                                           USER_LANGUAGE, data->user_lang,
                                            -1);
 }
 
@@ -371,11 +360,14 @@ separator_func (GtkTreeModel *model,
 
 void
 cc_common_language_setup_list (GtkWidget    *treeview,
+			       GHashTable   *users,
 			       GHashTable   *initial)
 {
 	GtkCellRenderer *cell;
 	GtkTreeViewColumn *column;
 	GtkListStore *store;
+	LangForeachData data;
+	GList *langs, *l;
 
         cell = gtk_cell_renderer_text_new ();
 	g_object_set (cell,
@@ -396,14 +388,33 @@ cc_common_language_setup_list (GtkWidget    *treeview,
 
         gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
 
+        data.store = store;
+
+        /* Add the original users languages */
+        if (users != NULL && g_hash_table_size (users) > 0) {
+                data.user_lang = TRUE;
+                g_hash_table_foreach (users, (GHFunc) languages_foreach_cb, &data);
+
+                gtk_list_store_insert_with_values (store,
+                                                   NULL,
+                                                   -1,
+                                                   LOCALE_COL, NULL,
+                                                   DISPLAY_LOCALE_COL, "Don't show",
+                                                   SEPARATOR_COL, TRUE,
+                                                   USER_LANGUAGE, FALSE,
+                                                   -1);
+        }
 
         /* Add languages from the initial hashtable */
-        g_hash_table_foreach (initial, (GHFunc) languages_foreach_cb, store);
+        data.user_lang = FALSE;
+        langs = initial ? g_hash_table_get_keys (initial) : NULL;
+        for (l = langs; l != NULL; l = l->next) {
+                char *lang = l->data;
 
-        /* Mark the need for a separator if we had any languages added */
-        if (initial != NULL &&
-            g_hash_table_size (initial) > 0) {
-		g_object_set_data (G_OBJECT (store), "needs-separator", GINT_TO_POINTER (TRUE));
+                if (g_hash_table_lookup (users, lang) != NULL)
+                        continue;
+
+                languages_foreach_cb (lang, g_hash_table_lookup (initial, lang), &data);
 	}
 }
 
@@ -617,8 +628,6 @@ GHashTable *
 cc_common_language_get_initial_languages (void)
 {
         GHashTable *ht;
-        char *name;
-        char *language;
 
         ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 
@@ -634,6 +643,19 @@ cc_common_language_get_initial_languages (void)
         insert_language (ht, "ja", "ja_JP", TRUE, "Japanese");
         insert_language (ht, "ru", "ru_RU", FALSE, "Russian");
         insert_language (ht, "ar", "ar_EG", TRUE, "Arabic");
+
+        return ht;
+}
+
+GHashTable *
+cc_common_language_get_user_languages (void)
+{
+        GHashTable *ht;
+        char *name;
+        char *language;
+
+        ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
         /* Add the languages used by other users on the system */
         add_other_users_language (ht);
 
diff --git a/panels/common/cc-common-language.h b/panels/common/cc-common-language.h
index d88d107..f08d142 100644
--- a/panels/common/cc-common-language.h
+++ b/panels/common/cc-common-language.h
@@ -47,9 +47,11 @@ gboolean cc_common_language_has_font                (const gchar  *locale);
 gchar   *cc_common_language_get_current_language    (void);
 
 GHashTable *cc_common_language_get_initial_languages   (void);
+GHashTable *cc_common_language_get_user_languages      (void);
 GHashTable *cc_common_language_get_initial_regions     (const gchar *lang);
 
 void     cc_common_language_setup_list              (GtkWidget    *treeview,
+						     GHashTable   *users,
 						     GHashTable   *initial);
 void     cc_common_language_select_current_language (GtkTreeView  *treeview);
 
diff --git a/panels/common/cc-language-chooser.c b/panels/common/cc-language-chooser.c
index ab072bf..bd8d6e5 100644
--- a/panels/common/cc-language-chooser.c
+++ b/panels/common/cc-language-chooser.c
@@ -310,7 +310,7 @@ cc_language_chooser_new (GtkWidget *parent, gboolean regions)
         gtk_widget_grab_focus (entry);
 
 	user_langs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-	cc_common_language_setup_list (list, user_langs);
+	cc_common_language_setup_list (list, user_langs, NULL);
 
 	model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
 	filter_model = gtk_tree_model_filter_new (model, NULL);
diff --git a/panels/region/gnome-region-panel-lang.c b/panels/region/gnome-region-panel-lang.c
index f34ff07..dbb3761 100644
--- a/panels/region/gnome-region-panel-lang.c
+++ b/panels/region/gnome-region-panel-lang.c
@@ -277,7 +277,7 @@ void
 setup_language (GtkBuilder *builder)
 {
 	GtkWidget *treeview;
-	GHashTable *user_langs;
+	GHashTable *user_langs, *popular_langs;
 	GError *error = NULL;
 	GtkWidget *widget;
 	GtkStyleContext *context;
@@ -339,8 +339,14 @@ setup_language (GtkBuilder *builder)
 	}
 
 	/* Add user languages */
-	user_langs = cc_common_language_get_initial_languages ();
-	cc_common_language_setup_list (treeview, user_langs);
+	user_langs = cc_common_language_get_user_languages ();
+	popular_langs = cc_common_language_get_initial_languages ();
+	cc_common_language_setup_list (treeview, user_langs, popular_langs);
+
+	g_object_set_data_full (G_OBJECT (treeview), "user-langs",
+				user_langs, (GDestroyNotify) g_hash_table_destroy);
+	g_object_set_data_full (G_OBJECT (treeview), "popular-langs",
+				popular_langs, (GDestroyNotify) g_hash_table_destroy);
 
         /* And select the current language */
         cc_common_language_select_current_language (GTK_TREE_VIEW (treeview));



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