[accounts-dialog/control-center-panel: 9/15] Convert the language chooser to the editable combo widget
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [accounts-dialog/control-center-panel: 9/15] Convert the language chooser to the editable combo widget
- Date: Mon, 14 Jun 2010 05:06:08 +0000 (UTC)
commit 91f6f2e5f8c49faea06f8f21c0742f679ced8320
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Jun 13 22:46:09 2010 -0400
Convert the language chooser to the editable combo widget
data/user-accounts-dialog.ui | 44 +------------
src/um-editable-combo.c | 70 ++++++++++++--------
src/um-editable-combo.h | 6 ++-
src/um-language-dialog.c | 68 ++++++++++----------
src/um-language-dialog.h | 9 ++-
src/um-user-panel.c | 146 ++++++++++--------------------------------
6 files changed, 125 insertions(+), 218 deletions(-)
---
diff --git a/data/user-accounts-dialog.ui b/data/user-accounts-dialog.ui
index 891e085..e1b56af 100644
--- a/data/user-accounts-dialog.ui
+++ b/data/user-accounts-dialog.ui
@@ -508,48 +508,10 @@
</packing>
</child>
<child>
- <object class="GtkNotebook" id="account-language-notebook">
+ <object class="UmEditableCombo" id="account-language-combo">
<property name="visible">True</property>
- <property name="show_tabs">False</property>
- <property name="show_border">False</property>
- <child>
- <object class="GtkLabel" id="account-language-value-label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="account-language-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="relief">none</property>
- <child>
- <object class="GtkLabel" id="account-language-button-label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="account-language-combo">
- <property name="visible">True</property>
- <property name="model">language-model</property>
- <child>
- <object class="GtkCellRendererText" id="account-language-cell"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
+ <property name="model">language-model</property>
+ <property name="text-column">1</property>
</object>
<packing>
<property name="left_attach">1</property>
diff --git a/src/um-editable-combo.c b/src/um-editable-combo.c
index bab2b13..567818e 100644
--- a/src/um-editable-combo.c
+++ b/src/um-editable-combo.c
@@ -22,6 +22,8 @@
#include <gdk/gdkkeysyms.h>
#include "um-editable-combo.h"
+#define EMPTY_TEXT "\xe2\x80\x94"
+
struct _UmEditableComboPrivate {
GtkNotebook *notebook;
GtkLabel *label;
@@ -29,8 +31,8 @@ struct _UmEditableComboPrivate {
GtkComboBox *combo;
GtkWidget *toplevel;
- gint editable;
gint active;
+ gint editable;
gint text_column;
};
@@ -39,7 +41,6 @@ struct _UmEditableComboPrivate {
enum {
PROP_0,
PROP_EDITABLE,
- PROP_ACTIVE,
PROP_MODEL,
PROP_TEXT_COLUMN
};
@@ -80,10 +81,7 @@ void
um_editable_combo_set_model (UmEditableCombo *combo,
GtkTreeModel *model)
{
- UmEditableComboPrivate *priv = combo->priv;
-
- gtk_combo_box_set_active (priv->combo, -1);
- gtk_combo_box_set_model (priv->combo, model);
+ gtk_combo_box_set_model (combo->priv->combo, model);
g_object_notify (G_OBJECT (combo), "model");
}
@@ -126,27 +124,56 @@ void
um_editable_combo_set_active (UmEditableCombo *combo,
gint active)
{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ if (active == -1)
+ um_editable_combo_set_active_iter (combo, NULL);
+ else {
+ model = gtk_combo_box_get_model (combo->priv->combo);
+ path = gtk_tree_path_new_from_indices (active, -1);
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_path_free (path);
+ um_editable_combo_set_active_iter (combo, &iter);
+ }
+}
+
+void
+um_editable_combo_set_active_iter (UmEditableCombo *combo,
+ GtkTreeIter *iter)
+{
UmEditableComboPrivate *priv = combo->priv;
GtkWidget *label;
gchar *text;
GtkTreeModel *model;
- GtkTreeIter iter;
- if (priv->active == active)
- return;
+ gtk_combo_box_set_active_iter (priv->combo, iter);
+ priv->active = gtk_combo_box_get_active (priv->combo);
- priv->active = active;
- gtk_combo_box_set_active (priv->combo, active);
+ if (priv->text_column == -1)
+ return;
- gtk_combo_box_get_active_iter (priv->combo, &iter);
- model = gtk_combo_box_get_model (priv->combo);
- gtk_tree_model_get (model, &iter, priv->text_column, &text, -1);
+ if (iter) {
+ model = gtk_combo_box_get_model (priv->combo);
+ gtk_tree_model_get (model, iter, priv->text_column, &text, -1);
+ }
+ else {
+ text = g_strdup (EMPTY_TEXT);
+ }
gtk_label_set_text (priv->label, text);
label = gtk_bin_get_child ((GtkBin*)priv->button);
gtk_label_set_text (GTK_LABEL (label), text);
- g_object_notify (G_OBJECT (combo), "active");
+ g_free (text);
+}
+
+gboolean
+um_editable_combo_get_active_iter (UmEditableCombo *combo,
+ GtkTreeIter *iter)
+{
+ return gtk_combo_box_get_active_iter (combo->priv->combo, iter);
}
gint
@@ -173,9 +200,6 @@ um_editable_combo_set_property (GObject *object,
case PROP_TEXT_COLUMN:
um_editable_combo_set_text_column (combo, g_value_get_int (value));
break;
- case PROP_ACTIVE:
- um_editable_combo_set_active (combo, g_value_get_int (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -203,10 +227,6 @@ um_editable_combo_get_property (GObject *object,
g_value_set_int (value,
um_editable_combo_get_text_column (combo));
break;
- case PROP_ACTIVE:
- g_value_set_int (value,
- um_editable_combo_get_active (combo));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -251,12 +271,6 @@ um_editable_combo_class_init (UmEditableComboClass *class)
FALSE,
G_PARAM_READWRITE));
- g_object_class_install_property (object_class, PROP_ACTIVE,
- g_param_spec_int ("active",
- "Active choice", "The index of the selected choice",
- -1, G_MAXINT, -1,
- G_PARAM_READWRITE));
-
g_type_class_add_private (class, sizeof (UmEditableComboPrivate));
}
diff --git a/src/um-editable-combo.h b/src/um-editable-combo.h
index 7ddd1a8..0d4e4a6 100644
--- a/src/um-editable-combo.h
+++ b/src/um-editable-combo.h
@@ -63,9 +63,13 @@ GtkTreeModel *um_editable_combo_get_model (UmEditableCombo *combo);
void um_editable_combo_set_text_column (UmEditableCombo *combo,
gint column);
gint um_editable_combo_get_text_column (UmEditableCombo *combo);
+gint um_editable_combo_get_active (UmEditableCombo *combo);
void um_editable_combo_set_active (UmEditableCombo *combo,
gint active);
-gint um_editable_combo_get_active (UmEditableCombo *combo);
+gboolean um_editable_combo_get_active_iter (UmEditableCombo *combo,
+ GtkTreeIter *iter);
+void um_editable_combo_set_active_iter (UmEditableCombo *combo,
+ GtkTreeIter *iter);
G_END_DECLS
diff --git a/src/um-language-dialog.c b/src/um-language-dialog.c
index a4b0772..0f2ab87 100644
--- a/src/um-language-dialog.c
+++ b/src/um-language-dialog.c
@@ -62,7 +62,7 @@ static void
cancel_language_dialog (GtkButton *button,
UmLanguageDialog *um)
{
- if (um->force_setting != FALSE)
+ if (um->force_setting)
um_user_set_language (um->user, um->language);
gtk_widget_hide (um->dialog);
um_language_dialog_set_user (um, NULL);
@@ -126,42 +126,37 @@ sort_languages (GtkTreeModel *model,
return result;
}
-void
-um_select_language (GtkWidget *combo,
- const gchar *lang)
+gboolean
+um_get_iter_for_language (GtkTreeModel *model,
+ const gchar *lang,
+ GtkTreeIter *iter)
{
- GtkTreeModel *model;
- GtkTreeIter iter;
char *l;
char *name;
char *language;
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
-
- gtk_widget_set_sensitive (combo, TRUE);
-
- gtk_tree_model_get_iter_first (model, &iter);
+ gtk_tree_model_get_iter_first (model, iter);
do {
- gtk_tree_model_get (model, &iter, LOCALE_COL, &l, -1);
+ gtk_tree_model_get (model, iter, LOCALE_COL, &l, -1);
if (g_strcmp0 (l, lang) == 0) {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
g_free (l);
- return;
+ return TRUE;
}
g_free (l);
- } while (gtk_tree_model_iter_next (model, &iter));
+ } while (gtk_tree_model_iter_next (model, iter));
name = gdm_normalize_language_name (lang);
if (name != NULL) {
language = gdm_get_language_from_name (name, NULL);
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, LOCALE_COL, name, DISPLAY_LOCALE_COL, language, -1);
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
-
+ gtk_list_store_append (GTK_LIST_STORE (model), iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), iter, LOCALE_COL, name, DISPLAY_LOCALE_COL, language, -1);
g_free (name);
g_free (language);
+ return TRUE;
}
+
+ return FALSE;
}
static void
@@ -270,7 +265,7 @@ add_available_languages (GtkListStore *store)
}
void
-um_add_user_languages (GtkWidget *combo)
+um_add_user_languages (GtkTreeModel *model)
{
GHashTable *seen;
GSList *users, *l;
@@ -280,11 +275,7 @@ um_add_user_languages (GtkWidget *combo)
char *language;
GtkTreeIter iter;
UmUserManager *manager;
- GtkTreeModel *model;
- GtkListStore *store;
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
- store = GTK_LIST_STORE (model);
+ GtkListStore *store = GTK_LIST_STORE (model);
gtk_list_store_clear (store);
@@ -320,8 +311,7 @@ um_add_user_languages (GtkWidget *combo)
g_slist_free (users);
/* Make sure the current locale is present */
- lang = (const gchar *) setlocale (LC_MESSAGES, NULL);
- name = gdm_normalize_language_name (lang);
+ name = um_get_current_language ();
if (!g_hash_table_lookup (seen, name)) {
language = gdm_get_language_from_name (name, NULL);
@@ -338,6 +328,21 @@ um_add_user_languages (GtkWidget *combo)
gtk_list_store_set (store, &iter, LOCALE_COL, NULL, DISPLAY_LOCALE_COL, _("Other..."), -1);
}
+gchar *
+um_get_current_language (void)
+{
+ gchar *language;
+ const gchar *locale;
+
+ locale = (const gchar *) setlocale (LC_MESSAGES, NULL);
+ if (locale)
+ language = gdm_normalize_language_name (locale);
+ else
+ language = NULL;
+
+ return language;
+}
+
GtkWidget *
um_language_chooser_new (void)
{
@@ -523,18 +528,15 @@ um_language_dialog_set_user (UmLanguageDialog *um,
name = um_user_get_real_name (user);
gtk_label_set_label (GTK_LABEL (um->user_name), name);
- um_add_user_languages (um->dialog_combo);
+ um_add_user_languages (gtk_combo_box_get_model (um->dialog_combo));
language = um_user_get_language (user);
if (language) {
select_language (um, language);
} else if (um_user_get_uid (user) == getuid ()) {
- const char *locale;
- char *lang;
-
- locale = (const char *) setlocale(LC_MESSAGES, NULL);
- lang = gdm_normalize_language_name (locale);
+ gchar *lang;
+ lang = um_get_current_language ();
select_language (um, lang);
g_free (lang);
um->force_setting = TRUE;
diff --git a/src/um-language-dialog.h b/src/um-language-dialog.h
index dc51cd1..5df8af3 100644
--- a/src/um-language-dialog.h
+++ b/src/um-language-dialog.h
@@ -35,9 +35,12 @@ void um_language_dialog_set_user (UmLanguageDialog *dialog,
UmUser *user);
void um_language_dialog_show (UmLanguageDialog *dialog,
GtkWindow *parent);
-void um_add_user_languages (GtkWidget *combo);
-void um_select_language (GtkWidget *combo,
- const gchar *lang);
+void um_add_user_languages (GtkTreeModel *model);
+gchar *um_get_current_language (void);
+gboolean um_get_iter_for_language (GtkTreeModel *model,
+ const gchar *lang,
+ GtkTreeIter *iter);
+
GtkWidget *um_language_chooser_new (void);
gchar *um_language_chooser_get_language (GtkWidget *chooser);
diff --git a/src/um-user-panel.c b/src/um-user-panel.c
index 243294f..8f441c4 100644
--- a/src/um-user-panel.c
+++ b/src/um-user-panel.c
@@ -25,8 +25,6 @@
#include <stdlib.h>
#include <string.h>
-#include <locale.h>
-#include <libintl.h>
#include <unistd.h>
#include <sys/types.h>
@@ -462,8 +460,6 @@ nonempty (const char *str)
return (str == NULL || str[0] == 0) ? "\xe2\x80\x94" : str;
}
-static void language_changed (GtkComboBox *combo, UmUserPanelPrivate *d);
-
static void
show_user (UmUser *user, UmUserPanelPrivate *d)
{
@@ -472,12 +468,11 @@ show_user (UmUser *user, UmUserPanelPrivate *d)
GtkWidget *label2;
GtkWidget *label3;
GdkPixbuf *pixbuf;
- const char *text;
- char *language;
- GtkWidget *combo;
+ const gchar *text;
+ gchar *lang;
+ GtkWidget *widget;
GtkTreeModel *model;
GtkTreeIter iter;
- GtkWidget *widget;
pixbuf = um_user_render_icon (user, FALSE, 48);
image = get_widget (d, "user-icon-image");
@@ -523,33 +518,15 @@ show_user (UmUser *user, UmUserPanelPrivate *d)
um_editable_button_set_text (UM_EDITABLE_BUTTON (widget), text);
widget = get_widget (d, "account-language-combo");
- g_signal_handlers_block_by_func (widget, language_changed, d);
- um_add_user_languages (widget);
+ model = um_editable_combo_get_model (UM_EDITABLE_COMBO (widget));
+ um_add_user_languages (model);
- text = um_user_get_language (user);
- if (text) {
- um_select_language (widget, text);
- language = gdm_get_language_from_name (text, NULL);
- }
- else {
- const gchar *locale;
- locale = (const gchar *) setlocale (LC_MESSAGES, NULL);
- if (locale) {
- gchar *name;
- name = gdm_normalize_language_name (locale);
- um_select_language (widget, name);
- language = gdm_get_language_from_name (name, NULL);
- g_free (name);
- } else {
- language = g_strdup (nonempty (""));
- }
- }
- label = get_widget (d, "account-language-value-label");
- gtk_label_set_text (GTK_LABEL (label), language);
- label = get_widget (d, "account-language-button-label");
- gtk_label_set_text (GTK_LABEL (label), language);
- g_free (language);
- g_signal_handlers_unblock_by_func (widget, language_changed, d);
+ lang = g_strdup (um_user_get_language (user));
+ if (!lang)
+ lang = um_get_current_language ();
+ um_get_iter_for_language (model, lang, &iter);
+ um_editable_combo_set_active_iter (UM_EDITABLE_COMBO (widget), &iter);
+ g_free (lang);
text = um_user_get_location (user);
label = get_widget (d, "account-location-button");
@@ -651,49 +628,32 @@ language_response (GtkDialog *dialog,
gint response_id,
UmUserPanelPrivate *d)
{
- GtkWidget *widget;
+ GtkWidget *combo;
UmUser *user;
gchar *lang;
const gchar *text;
- gchar *language;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
user = get_selected_user (d);
- widget = get_widget (d, "account-language-combo");
+ combo = get_widget (d, "account-language-combo");
+ model = um_editable_combo_get_model (UM_EDITABLE_COMBO (combo));
+
if (response_id == GTK_RESPONSE_OK) {
lang = um_language_chooser_get_language (GTK_WIDGET (dialog));
um_user_set_language (user, lang);
- um_select_language (widget, lang);
- language = g_strdup (nonempty (lang));
- g_free (lang);
}
else {
- text = um_user_get_language (user);
- if (text) {
- um_select_language (widget, text);
- language = gdm_get_language_from_name (text, NULL);
- }
- else {
- const gchar *locale;
- locale = (const gchar *) setlocale (LC_MESSAGES, NULL);
- if (locale) {
- char *name;
- name = gdm_normalize_language_name (locale);
- um_select_language (widget, name);
- language = gdm_get_language_from_name (name, NULL);
- g_free (name);
- } else {
- language = g_strdup (nonempty (""));
- }
- }
+ lang = g_strdup (um_user_get_language (user));
+ if (!lang)
+ lang = um_get_current_language ();
}
-
- gtk_label_set_text (GTK_LABEL (get_widget (d, "account-language-value-label")), language);
- gtk_label_set_text (GTK_LABEL (get_widget (d, "account-language-button-label")), language);
- g_free (language);
+ um_get_iter_for_language (model, lang, &iter);
+ um_editable_combo_set_active_iter (UM_EDITABLE_COMBO (combo), &iter);
+ g_free (lang);
gtk_widget_hide (GTK_WIDGET (dialog));
- gtk_widget_set_sensitive (widget, TRUE);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-language-notebook")), 1);
+ gtk_widget_set_sensitive (combo, TRUE);
}
static gboolean
@@ -718,7 +678,7 @@ finish_language_chooser (UmUserPanelPrivate *d)
}
static void
-language_changed (GtkComboBox *combo,
+language_changed (UmEditableCombo *combo,
UmUserPanelPrivate *d)
{
GtkTreeModel *model;
@@ -727,11 +687,11 @@ language_changed (GtkComboBox *combo,
UmUser *user;
GdkCursor *cursor;
- if (!gtk_combo_box_get_active_iter (combo, &iter))
+ if (!um_editable_combo_get_active_iter (combo, &iter))
return;
user = get_selected_user (d);
- model = gtk_combo_box_get_model (combo);
+ model = um_editable_combo_get_model (combo);
gtk_tree_model_get (model, &iter, 0, &lang, -1);
if (lang) {
@@ -756,23 +716,6 @@ language_changed (GtkComboBox *combo,
g_idle_add ((GSourceFunc)finish_language_chooser, d);
}
-static gboolean
-language_key_press (GtkWidget *combo,
- GdkEventKey *event,
- UmUserPanelPrivate *d)
-{
- GtkWidget *nb;
-
- if (event->keyval == GDK_Escape) {
- nb = get_widget (d, "account-language-notebook");
- gtk_notebook_set_current_page (GTK_NOTEBOOK (nb), 1);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
static void
change_password (GtkButton *button, UmUserPanelPrivate *d)
{
@@ -818,13 +761,6 @@ change_location_done (GtkWidget *entry,
}
static void
-change_language_start (GtkButton *button,
- UmUserPanelPrivate *d)
-{
- gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-language-notebook")), 2);
-}
-
-static void
change_fingerprint (GtkButton *button, UmUserPanelPrivate *d)
{
GtkWidget *label, *label2;
@@ -1046,7 +982,9 @@ lockbutton_changed (PolkitLockButton *button,
um_editable_button_set_editable (UM_EDITABLE_BUTTON (get_widget (d, "account-location-button")), TRUE);
remove_unlock_tooltip (get_widget (d, "account-location-button"));
- gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-language-notebook")), 1);
+ um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-language-combo")), TRUE);
+ remove_unlock_tooltip (get_widget (d, "account-language-combo"));
+
gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-password-notebook")), 1);
gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-fingerprint-notebook")), 1);
}
@@ -1063,7 +1001,9 @@ lockbutton_changed (PolkitLockButton *button,
um_editable_button_set_editable (UM_EDITABLE_BUTTON (get_widget (d, "account-location-button")), FALSE);
add_unlock_tooltip (get_widget (d, "account-location-button"));
- gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-language-notebook")), 0);
+ um_editable_combo_set_editable (UM_EDITABLE_COMBO (get_widget (d, "account-language-combo")), FALSE);
+ add_unlock_tooltip (get_widget (d, "account-language-combo"));
+
gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-password-notebook")), 0);
gtk_notebook_set_current_page (GTK_NOTEBOOK (get_widget (d, "account-fingerprint-notebook")), 0);
}
@@ -1241,19 +1181,8 @@ setup_main_window (UmUserPanelPrivate *d)
g_signal_connect (button, "editing-done",
G_CALLBACK (change_email_done), d);
- button = get_widget (d, "account-language-value-label");
- setup_tooltip_with_embedded_icon (button,
- _("To make changes,\nclick the * icon first"),
- "*",
- "security-medium");
- g_signal_connect (button, "button-release-event",
- G_CALLBACK (show_tooltip_now), NULL);
-
- button = get_widget (d, "account-language-button");
- g_signal_connect (button, "clicked", G_CALLBACK (change_language_start), d);
button = get_widget (d, "account-language-combo");
- g_signal_connect (button, "changed", G_CALLBACK (language_changed), d);
- g_signal_connect (button, "key-press-event", G_CALLBACK (language_key_press), d);
+ g_signal_connect (button, "editing-done", G_CALLBACK (language_changed), d);
button = get_widget (d, "account-location-button");
g_signal_connect (button, "editing-done",
@@ -1378,12 +1307,6 @@ um_user_panel_dispose (GObject *object)
}
static void
-um_user_panel_finalize (GObject *object)
-{
- G_OBJECT_CLASS (um_user_panel_parent_class)->finalize (object);
-}
-
-static void
um_user_panel_class_init (UmUserPanelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -1391,7 +1314,6 @@ um_user_panel_class_init (UmUserPanelClass *klass)
g_type_class_add_private (klass, sizeof (UmUserPanelPrivate));
object_class->dispose = um_user_panel_dispose;
- object_class->finalize = um_user_panel_finalize;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]