diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-12-13 22:12:15 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-05-30 19:31:38 -0400 |
commit | 6346fa960c58c2be3adc37abdc1a630365e94986 (patch) | |
tree | af5c308167e0cca0076bcfb820b88a04b24f27b9 | |
parent | 99c98d0736cf15bd38d75fa32cd5bd39b7fb5667 (diff) | |
download | gtk+-6346fa960c58c2be3adc37abdc1a630365e94986.tar.gz |
inspector: Use a dropdown for attribute mapping
Use a GtkDropDown for the attribute mapping editor.
-rw-r--r-- | gtk/inspector/prop-editor.c | 122 |
1 files changed, 97 insertions, 25 deletions
diff --git a/gtk/inspector/prop-editor.c b/gtk/inspector/prop-editor.c index 5a61256767..2b87f03b2e 100644 --- a/gtk/inspector/prop-editor.c +++ b/gtk/inspector/prop-editor.c @@ -1160,7 +1160,8 @@ model_properties (GtkButton *button, } static void -attribute_mapping_changed (GtkComboBox *combo, +attribute_mapping_changed (GtkDropDown *dropdown, + GParamSpec *pspec, GtkInspectorPropEditor *self) { gint col; @@ -1168,7 +1169,7 @@ attribute_mapping_changed (GtkComboBox *combo, GtkCellRenderer *cell; GtkCellArea *area; - col = gtk_combo_box_get_active (combo) - 1; + col = gtk_drop_down_get_selected (dropdown) - 1; layout = g_object_get_data (self->object, "gtk-inspector-cell-layout"); if (GTK_IS_CELL_LAYOUT (layout)) { @@ -1183,6 +1184,72 @@ attribute_mapping_changed (GtkComboBox *combo, } } +#define ATTRIBUTE_TYPE_HOLDER (attribute_holder_get_type ()) +G_DECLARE_FINAL_TYPE (AttributeHolder, attribute_holder, ATTRIBUTE, HOLDER, GObject) + +struct _AttributeHolder { + GObject parent_instance; + int column; + gboolean sensitive; +}; + +G_DEFINE_TYPE (AttributeHolder, attribute_holder, G_TYPE_OBJECT); + +static void +attribute_holder_init (AttributeHolder *holder) +{ +} + +static void +attribute_holder_class_init (AttributeHolderClass *class) +{ +} + +static AttributeHolder * +attribute_holder_new (int column, + gboolean sensitive) +{ + AttributeHolder *holder = g_object_new (ATTRIBUTE_TYPE_HOLDER, NULL); + holder->column = column; + holder->sensitive = sensitive; + return holder; +} + +static void +attribute_setup_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkWidget *label; + + label = gtk_label_new (""); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + + gtk_list_item_set_child (item, label); +} + +static void +attribute_bind_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkWidget *label; + AttributeHolder *holder; + + holder = gtk_list_item_get_item (item); + label = gtk_list_item_get_child (item); + + if (holder->column >= 0) + { + char *text = g_strdup_printf ("%d", holder->column); + gtk_label_set_label (GTK_LABEL (label), text); + g_free (text); + } + else + gtk_label_set_label (GTK_LABEL (label), _("None")); + + gtk_list_item_set_selectable (item, holder->sensitive); + gtk_widget_set_sensitive (label, holder->sensitive); +} + static GtkWidget * attribute_editor (GObject *object, GParamSpec *spec, @@ -1195,13 +1262,12 @@ attribute_editor (GObject *object, GtkWidget *label; GtkWidget *button; GtkWidget *box; - GtkWidget *combo; - gchar *text; + GtkWidget *dropdown; + GListStore *store; + GtkListItemFactory *factory; gint i; + AttributeHolder *holder; gboolean sensitive; - GtkCellRenderer *renderer; - GtkListStore *store; - GtkTreeIter iter; layout = g_object_get_data (object, "gtk-inspector-cell-layout"); if (GTK_IS_CELL_LAYOUT (layout)) @@ -1224,30 +1290,36 @@ attribute_editor (GObject *object, gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), gtk_label_new (_("Column:"))); - store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN); - combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); - renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, - "text", 0, - "sensitive", 1, - NULL); - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, C_("property name", "None"), 1, TRUE, -1); + dropdown = gtk_drop_down_new (); + + store = g_list_store_new (ATTRIBUTE_TYPE_HOLDER); + holder = attribute_holder_new (-1, TRUE); + g_list_store_append (store, holder); + g_object_unref (holder); + for (i = 0; i < gtk_tree_model_get_n_columns (model); i++) { - text = g_strdup_printf ("%d", i); sensitive = g_value_type_transformable (gtk_tree_model_get_column_type (model, i), spec->value_type); - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, text, 1, sensitive, -1); - g_free (text); + holder = attribute_holder_new (i, sensitive); + g_list_store_append (store, holder); + g_object_unref (holder); } - gtk_combo_box_set_active (GTK_COMBO_BOX (combo), col + 1); - attribute_mapping_changed (GTK_COMBO_BOX (combo), self); - g_signal_connect (combo, "changed", + gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (store)); + g_object_unref (store); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (attribute_setup_item), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (attribute_bind_item), NULL); + gtk_drop_down_set_factory (GTK_DROP_DOWN (dropdown), factory); + g_object_unref (factory); + + gtk_drop_down_set_selected (GTK_DROP_DOWN (dropdown), col + 1); + attribute_mapping_changed (GTK_DROP_DOWN (dropdown), NULL, self); + g_signal_connect (dropdown, "notify::selected", G_CALLBACK (attribute_mapping_changed), self); - gtk_box_append (GTK_BOX (box), combo); + + gtk_box_append (GTK_BOX (box), dropdown); return box; } |