From 86718439beaf9ac2e9304e2ade2dfe4efae24ecc Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 11 Jun 2020 23:25:58 -0400 Subject: [PATCH] testdropdown: Add some more tests Add a homegrown combobox entry replacement that combines a dropdown with a plain entry. --- tests/testdropdown.c | 248 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) diff --git a/tests/testdropdown.c b/tests/testdropdown.c index 877109f563..525e67f7c6 100644 --- a/tests/testdropdown.c +++ b/tests/testdropdown.c @@ -234,6 +234,203 @@ quit_cb (GtkWindow *window, return TRUE; } +#define GTK_TYPE_STRING_PAIR (gtk_string_pair_get_type ()) +G_DECLARE_FINAL_TYPE (GtkStringPair, gtk_string_pair, GTK, STRING_PAIR, GObject) + +struct _GtkStringPair { + GObject parent_instance; + char *id; + char *string; +}; + +enum { + PROP_ID = 1, + PROP_STRING, + PROP_NUM_PROPERTIES +}; + +G_DEFINE_TYPE (GtkStringPair, gtk_string_pair, G_TYPE_OBJECT); + +static void +gtk_string_pair_init (GtkStringPair *pair) +{ +} + +static void +gtk_string_pair_finalize (GObject *object) +{ + GtkStringPair *pair = GTK_STRING_PAIR (object); + + g_free (pair->id); + g_free (pair->string); + + G_OBJECT_CLASS (gtk_string_pair_parent_class)->finalize (object); +} + +static void +gtk_string_pair_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkStringPair *pair = GTK_STRING_PAIR (object); + + switch (property_id) + { + case PROP_STRING: + g_free (pair->string); + pair->string = g_value_dup_string (value); + break; + + case PROP_ID: + g_free (pair->id); + pair->id = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gtk_string_pair_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GtkStringPair *pair = GTK_STRING_PAIR (object); + + switch (property_id) + { + case PROP_STRING: + g_value_set_string (value, pair->string); + break; + + case PROP_ID: + g_value_set_string (value, pair->id); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gtk_string_pair_class_init (GtkStringPairClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GParamSpec *pspec; + + object_class->finalize = gtk_string_pair_finalize; + object_class->set_property = gtk_string_pair_set_property; + object_class->get_property = gtk_string_pair_get_property; + + pspec = g_param_spec_string ("string", "String", "String", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_property (object_class, PROP_STRING, pspec); + + pspec = g_param_spec_string ("id", "ID", "ID", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_property (object_class, PROP_ID, pspec); +} + +static GtkStringPair * +gtk_string_pair_new (const char *id, + const char *string) +{ + return g_object_new (GTK_TYPE_STRING_PAIR, + "id", id, + "string", string, + NULL); +} + +static const char * +gtk_string_pair_get_string (GtkStringPair *pair) +{ + return pair->string; +} + +static const char * +gtk_string_pair_get_id (GtkStringPair *pair) +{ + return pair->id; +} + +static void +setup_no_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ +} + +static void +setup_list_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkWidget *label; + + label = gtk_label_new (""); + gtk_widget_set_halign (label, GTK_ALIGN_START); + gtk_list_item_set_child (item, label); +} + +static void +bind_list_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkStringPair *pair; + GtkWidget *label; + + pair = gtk_list_item_get_item (item); + label = gtk_list_item_get_child (item); + + gtk_label_set_text (GTK_LABEL (label), gtk_string_pair_get_string (pair)); +} + +static void +selected_changed (GtkDropDown *dropdown, + GParamSpec *pspec, + gpointer data) +{ + GListModel *model; + guint selected; + GtkStringPair *pair; + + model = gtk_drop_down_get_model (dropdown); + selected = gtk_drop_down_get_selected (dropdown); + + pair = g_list_model_get_item (model, selected); + + g_print ("selected %s\n", gtk_string_pair_get_id (pair)); + + g_object_unref (pair); +} + +static void +selected_changed2 (GtkDropDown *dropdown, + GParamSpec *pspec, + gpointer data) +{ + GListModel *model; + guint selected; + GtkStringPair *pair; + GtkWidget *entry = data; + + model = gtk_drop_down_get_model (dropdown); + selected = gtk_drop_down_get_selected (dropdown); + + pair = g_list_model_get_item (model, selected); + + gtk_editable_set_text (GTK_EDITABLE (entry), gtk_string_pair_get_string (pair)); + + g_object_unref (pair); +} + int main (int argc, char *argv[]) { @@ -253,6 +450,10 @@ main (int argc, char *argv[]) "Built-in Audio", "Built-in audio", "Thinkpad Tunderbolt 3 Dock USB Audio", "Thinkpad Tunderbolt 3 Dock USB Audio", NULL }; gboolean quit = FALSE; + GListStore *store; + GtkListItemFactory *factory; + GtkWidget *entry; + GtkWidget *hbox; gtk_init (); @@ -312,6 +513,53 @@ main (int argc, char *argv[]) button = drop_down_new_from_strings (device_titles, device_icons, device_descriptions); gtk_box_append (GTK_BOX (box), button); + button = gtk_drop_down_new (); + + store = g_list_store_new (GTK_TYPE_STRING_PAIR); + g_list_store_append (store, gtk_string_pair_new ("1", "One")); + g_list_store_append (store, gtk_string_pair_new ("2", "Two")); + g_list_store_append (store, gtk_string_pair_new ("2.5", "Two ½")); + g_list_store_append (store, gtk_string_pair_new ("3", "Three")); + gtk_drop_down_set_model (GTK_DROP_DOWN (button), G_LIST_MODEL (store)); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_list_item), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (bind_list_item), NULL); + gtk_drop_down_set_factory (GTK_DROP_DOWN (button), factory); + g_object_unref (factory); + + g_signal_connect (button, "notify::selected", G_CALLBACK (selected_changed), NULL); + + gtk_box_append (GTK_BOX (box), button); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_widget_add_css_class (hbox, "linked"); + + entry = gtk_entry_new (); + button = gtk_drop_down_new (); + + gtk_drop_down_set_model (GTK_DROP_DOWN (button), G_LIST_MODEL (store)); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_no_item), NULL); + gtk_drop_down_set_factory (GTK_DROP_DOWN (button), factory); + g_object_unref (factory); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_list_item), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (bind_list_item), NULL); + gtk_drop_down_set_list_factory (GTK_DROP_DOWN (button), factory); + g_object_unref (factory); + + g_signal_connect (button, "notify::selected", G_CALLBACK (selected_changed2), entry); + + gtk_box_append (GTK_BOX (hbox), entry); + gtk_box_append (GTK_BOX (hbox), button); + + gtk_box_append (GTK_BOX (box), hbox); + + g_object_unref (store); + gtk_window_present (GTK_WINDOW (window)); while (!quit)