1/* Entry/Tagged Entry
2 *
3 * This example shows how to build a complex composite
4 * entry using GtkText, outside of GTK.
5 *
6 * This tagged entry can display tags and other widgets
7 * inside the entry area.
8 */
9
10#include <glib/gi18n.h>
11#include <gtk/gtk.h>
12#include "demotaggedentry.h"
13
14static GtkWidget *spinner = NULL;
15
16static void
17closed_cb (DemoTaggedEntryTag *tag, DemoTaggedEntry *entry)
18{
19 demo_tagged_entry_remove_tag (entry, GTK_WIDGET (tag));
20}
21
22static void
23add_tag (GtkButton *button, DemoTaggedEntry *entry)
24{
25 DemoTaggedEntryTag *tag;
26
27 tag = demo_tagged_entry_tag_new (label: "Blue");
28 gtk_widget_add_css_class (GTK_WIDGET (tag), css_class: "blue");
29 demo_tagged_entry_tag_set_has_close_button (tag, TRUE);
30 g_signal_connect (tag, "button-clicked", G_CALLBACK (closed_cb), entry);
31
32 if (spinner == NULL)
33 demo_tagged_entry_add_tag (entry, GTK_WIDGET (tag));
34 else
35 demo_tagged_entry_insert_tag_after (entry, GTK_WIDGET (tag), sibling: gtk_widget_get_prev_sibling (widget: spinner));
36}
37
38static void
39toggle_spinner (GtkCheckButton *button, DemoTaggedEntry *entry)
40{
41 if (spinner)
42 {
43 demo_tagged_entry_remove_tag (entry, tag: spinner);
44 spinner = NULL;
45 }
46 else
47 {
48 spinner = gtk_spinner_new ();
49 gtk_spinner_start (GTK_SPINNER (spinner));
50 demo_tagged_entry_add_tag (entry, tag: spinner);
51 }
52}
53
54GtkWidget *
55do_tagged_entry (GtkWidget *do_widget)
56{
57 static GtkWidget *window = NULL;
58 GtkWidget *box;
59 GtkWidget *box2;
60 GtkWidget *entry;
61 GtkWidget *button;
62
63 if (!window)
64 {
65 window = gtk_window_new ();
66 gtk_window_set_display (GTK_WINDOW (window),
67 display: gtk_widget_get_display (widget: do_widget));
68 gtk_window_set_title (GTK_WINDOW (window), title: "Tagged Entry");
69 gtk_window_set_default_size (GTK_WINDOW (window), width: 260, height: -1);
70 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
71
72 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
73
74 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 6);
75 gtk_widget_set_margin_start (widget: box, margin: 18);
76 gtk_widget_set_margin_end (widget: box, margin: 18);
77 gtk_widget_set_margin_top (widget: box, margin: 18);
78 gtk_widget_set_margin_bottom (widget: box, margin: 18);
79 gtk_window_set_child (GTK_WINDOW (window), child: box);
80
81 entry = demo_tagged_entry_new ();
82 gtk_box_append (GTK_BOX (box), child: entry);
83
84 box2 = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 6);
85 gtk_widget_set_halign (widget: box2, align: GTK_ALIGN_END);
86 gtk_box_append (GTK_BOX (box), child: box2);
87
88 button = gtk_button_new_with_mnemonic (label: "Add _Tag");
89 g_signal_connect (button, "clicked", G_CALLBACK (add_tag), entry);
90 gtk_box_append (GTK_BOX (box2), child: button);
91
92 button = gtk_check_button_new_with_mnemonic (label: "_Spinner");
93 g_signal_connect (button, "toggled", G_CALLBACK (toggle_spinner), entry);
94 gtk_box_append (GTK_BOX (box2), child: button);
95 }
96
97 if (!gtk_widget_get_visible (widget: window))
98 gtk_widget_show (widget: window);
99 else
100 gtk_window_destroy (GTK_WINDOW (window));
101
102 return window;
103}
104

source code of gtk/demos/gtk-demo/tagged_entry.c