[gtk/matthiasc/for-master: 4/8] testdropdown: Add some more tests
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 4/8] testdropdown: Add some more tests
- Date: Fri, 12 Jun 2020 13:29:04 +0000 (UTC)
commit 86718439beaf9ac2e9304e2ade2dfe4efae24ecc
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Jun 11 23:25:58 2020 -0400
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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]