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 | |
14 | static GtkWidget *spinner = NULL; |
15 | |
16 | static void |
17 | closed_cb (DemoTaggedEntryTag *tag, DemoTaggedEntry *entry) |
18 | { |
19 | demo_tagged_entry_remove_tag (entry, GTK_WIDGET (tag)); |
20 | } |
21 | |
22 | static void |
23 | add_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 | |
38 | static void |
39 | toggle_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 | |
54 | GtkWidget * |
55 | do_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 | |