diff options
author | Ray Strode <rstrode@redhat.com> | 2008-02-25 20:55:07 +0000 |
---|---|---|
committer | Ray Strode <halfline@src.gnome.org> | 2008-02-25 20:55:07 +0000 |
commit | 76436035892a898ccca6930a3ad21a8038e4529e (patch) | |
tree | 7c5252cf6c44bf5fd4484a32a30f8128fb56d986 | |
parent | 9a0d31806873abf4e2ebf3022cb09f22ad3fd68f (diff) | |
download | gdm-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-- | ChangeLog | 22 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-option-widget.c | 107 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-option-widget.h | 3 |
3 files changed, 128 insertions, 4 deletions
@@ -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 */ |