summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-02-25 20:55:07 +0000
committerRay Strode <halfline@src.gnome.org>2008-02-25 20:55:07 +0000
commit76436035892a898ccca6930a3ad21a8038e4529e (patch)
tree7c5252cf6c44bf5fd4484a32a30f8128fb56d986
parent9a0d31806873abf4e2ebf3022cb09f22ad3fd68f (diff)
downloadgdm-76436035892a898ccca6930a3ad21a8038e4529e.tar.gz
allow NULL input to deselect combo box
2008-02-25 Ray Strode <rstrode@redhat.com> * gui/simple-greeter/gdm-option-widget.[ch]: (activate_from_item_id): allow NULL input to deselect combo box (gdm_option_widget_get_default_item): (gdm_option_widget_set_default_item): (gdm_option_widget_set_property): (gdm_option_widget_get_property): Add new concept of a default item, to fall back to if the user hasn't picked on yet (on_changed): If no default item is set don't activate whatever invalid item is selected (gdm_option_widget_init): (on_default_item_changed): set combo box to insensitive if there is no default item (name_cell_data_func): show the default item in italics (gdm_option_widget_remove_item): don't let the default item get removed svn path=/trunk/; revision=5849
-rw-r--r--ChangeLog22
-rw-r--r--gui/simple-greeter/gdm-option-widget.c107
-rw-r--r--gui/simple-greeter/gdm-option-widget.h3
3 files changed, 128 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a73e9e9f..6ea43266 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
2008-02-25 Ray Strode <rstrode@redhat.com>
+ * gui/simple-greeter/gdm-option-widget.[ch]:
+ (activate_from_item_id): allow NULL input
+ to deselect combo box
+ (gdm_option_widget_get_default_item):
+ (gdm_option_widget_set_default_item):
+ (gdm_option_widget_set_property):
+ (gdm_option_widget_get_property):
+ Add new concept of a default item, to fall
+ back to if the user hasn't picked on yet
+ (on_changed): If no default item is set
+ don't activate whatever invalid item is
+ selected
+ (gdm_option_widget_init):
+ (on_default_item_changed): set combo box
+ to insensitive if there is no default item
+ (name_cell_data_func): show the default item
+ in italics
+ (gdm_option_widget_remove_item): don't let the
+ default item get removed
+
+2008-02-25 Ray Strode <rstrode@redhat.com>
+
* gui/simple-greeter/gdm-greeter-client.[ch]:
(on_default_language_name_changed),
(on_default_session_name_changed),
diff --git a/gui/simple-greeter/gdm-option-widget.c b/gui/simple-greeter/gdm-option-widget.c
index fd24d65c..e5d0e564 100644
--- a/gui/simple-greeter/gdm-option-widget.c
+++ b/gui/simple-greeter/gdm-option-widget.c
@@ -53,6 +53,7 @@ struct GdmOptionWidgetPrivate
GtkWidget *image;
char *label_text;
char *icon_name;
+ char *default_item_id;
GtkWidget *items_combo_box;
GtkListStore *list_store;
@@ -72,7 +73,8 @@ struct GdmOptionWidgetPrivate
enum {
PROP_0,
PROP_LABEL_TEXT,
- PROP_ICON_NAME
+ PROP_ICON_NAME,
+ PROP_DEFAULT_ITEM
};
enum {
@@ -172,6 +174,16 @@ activate_from_item_id (GdmOptionWidget *widget,
{
GtkTreeIter iter;
+ if (item_id == NULL) {
+ if (widget->priv->active_row != NULL) {
+ gtk_tree_row_reference_free (widget->priv->active_row);
+ widget->priv->active_row = NULL;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget->priv->items_combo_box), -1);
+ return;
+ }
+
if (!find_item (widget, item_id, &iter)) {
g_critical ("Tried to activate non-existing item from option widget");
return;
@@ -250,11 +262,42 @@ gdm_option_widget_set_active_item (GdmOptionWidget *widget,
const char *id)
{
g_return_if_fail (GDM_IS_OPTION_WIDGET (widget));
- g_return_if_fail (id != NULL);
activate_from_item_id (widget, id);
}
+char *
+gdm_option_widget_get_default_item (GdmOptionWidget *widget)
+{
+ g_return_val_if_fail (GDM_IS_OPTION_WIDGET (widget), NULL);
+
+ return g_strdup (widget->priv->default_item_id);
+}
+
+void
+gdm_option_widget_set_default_item (GdmOptionWidget *widget,
+ const char *item)
+{
+ g_return_if_fail (GDM_IS_OPTION_WIDGET (widget));
+ g_return_if_fail (item == NULL ||
+ gdm_option_widget_lookup_item (widget, item,
+ NULL, NULL, NULL));
+
+ if (widget->priv->default_item_id == NULL ||
+ strcmp (widget->priv->default_item_id, item) != 0) {
+ g_free (widget->priv->default_item_id);
+ widget->priv->default_item_id = NULL;
+
+ if (widget->priv->active_row == NULL) {
+ activate_from_item_id (widget, item);
+ }
+
+ widget->priv->default_item_id = g_strdup (item);
+
+ g_object_notify (G_OBJECT (widget), "default-item");
+ }
+}
+
static const char *
gdm_option_widget_get_label_text (GdmOptionWidget *widget)
{
@@ -326,6 +369,9 @@ gdm_option_widget_set_property (GObject *object,
case PROP_ICON_NAME:
gdm_option_widget_set_icon_name (self, g_value_get_string (value));
break;
+ case PROP_DEFAULT_ITEM:
+ gdm_option_widget_set_default_item (self, g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -351,6 +397,10 @@ gdm_option_widget_get_property (GObject *object,
g_value_set_string (value,
gdm_option_widget_get_icon_name (self));
break;
+ case PROP_DEFAULT_ITEM:
+ g_value_take_string (value,
+ gdm_option_widget_get_default_item (self));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -436,6 +486,13 @@ gdm_option_widget_class_init (GdmOptionWidgetClass *klass)
(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT)));
+ g_object_class_install_property (object_class,
+ PROP_DEFAULT_ITEM,
+ g_param_spec_string ("default-item",
+ _("Default Item"),
+ _("The id of the default item"),
+ NULL,
+ G_PARAM_READWRITE));
g_type_class_add_private (klass, sizeof (GdmOptionWidgetPrivate));
}
@@ -444,9 +501,21 @@ static void
on_changed (GtkComboBox *combo_box,
GdmOptionWidget *widget)
{
+ if (widget->priv->default_item_id == NULL) {
+ return;
+ }
+
activate_selected_item (widget);
}
+static void
+on_default_item_changed (GdmOptionWidget *widget)
+{
+ gtk_widget_set_sensitive (widget->priv->items_combo_box,
+ widget->priv->default_item_id != NULL);
+ gtk_tree_model_filter_refilter (widget->priv->model_filter);
+}
+
static gboolean
path_is_row (GdmOptionWidget *widget,
GtkTreeModel *model,
@@ -644,16 +713,31 @@ name_cell_data_func (GtkTreeViewColumn *tree_column,
GdmOptionWidget *widget)
{
char *name;
+ char *id;
char *markup;
+ gboolean is_default;
name = NULL;
gtk_tree_model_get (model,
iter,
+ OPTION_ID_COLUMN, &id,
OPTION_NAME_COLUMN, &name,
-1);
- markup = g_strdup_printf ("<span size='small'>%s</span>",
- name ? name : "(null)");
+ if (widget->priv->default_item_id != NULL &&
+ id != NULL &&
+ strcmp (widget->priv->default_item_id, id) == 0) {
+ is_default = TRUE;
+ } else {
+ is_default = FALSE;
+ }
+ g_free (id);
+ id = NULL;
+
+ markup = g_strdup_printf ("<span size='small'>%s%s%s</span>",
+ is_default? "<i>" : "",
+ name ? name : "",
+ is_default? "</i>" : "");
g_free (name);
g_object_set (cell, "markup", markup, NULL);
@@ -743,11 +827,20 @@ gdm_option_widget_init (GdmOptionWidget *widget)
gtk_box_pack_start (GTK_BOX (box), widget->priv->label, FALSE, FALSE, 0);
widget->priv->items_combo_box = gtk_combo_box_new ();
+
g_signal_connect (widget->priv->items_combo_box,
"changed",
G_CALLBACK (on_changed),
widget);
+ /* We disable the combo box until it has a default
+ */
+ gtk_widget_set_sensitive (widget->priv->items_combo_box, FALSE);
+ g_signal_connect (widget,
+ "notify::default-item",
+ G_CALLBACK (on_default_item_changed),
+ NULL);
+
gtk_widget_show (widget->priv->items_combo_box);
gtk_container_add (GTK_CONTAINER (box),
widget->priv->items_combo_box);
@@ -876,6 +969,12 @@ gdm_option_widget_remove_item (GdmOptionWidget *widget,
return;
}
+ if (widget->priv->default_item_id != NULL &&
+ strcmp (widget->priv->default_item_id, id) == 0) {
+ g_critical ("Tried to remove default item from option widget");
+ return;
+ }
+
gtk_tree_model_get (model, &iter,
OPTION_POSITION_COLUMN, &position,
-1);
diff --git a/gui/simple-greeter/gdm-option-widget.h b/gui/simple-greeter/gdm-option-widget.h
index ec49041c..9da79af8 100644
--- a/gui/simple-greeter/gdm-option-widget.h
+++ b/gui/simple-greeter/gdm-option-widget.h
@@ -79,6 +79,9 @@ gboolean gdm_option_widget_lookup_item (GdmOptionWidget
char * gdm_option_widget_get_active_item (GdmOptionWidget *widget);
void gdm_option_widget_set_active_item (GdmOptionWidget *widget,
const char *item);
+char * gdm_option_widget_get_default_item (GdmOptionWidget *widget);
+void gdm_option_widget_set_default_item (GdmOptionWidget *widget,
+ const char *item);
G_END_DECLS
#endif /* __GDM_OPTION_WIDGET_H */