1 | /* Dialogs |
2 | * #Keywords: GtkMessageDialog |
3 | * |
4 | * Dialogs are used to pop up transient windows for information |
5 | * and user feedback. |
6 | */ |
7 | |
8 | #include <glib/gi18n.h> |
9 | #include <gtk/gtk.h> |
10 | |
11 | static GtkWidget *window = NULL; |
12 | static GtkWidget *entry1 = NULL; |
13 | static GtkWidget *entry2 = NULL; |
14 | |
15 | static void |
16 | message_dialog_clicked (GtkButton *button, |
17 | gpointer user_data) |
18 | { |
19 | GtkWidget *dialog; |
20 | static int i = 1; |
21 | |
22 | dialog = gtk_message_dialog_new (GTK_WINDOW (window), |
23 | flags: GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, |
24 | type: GTK_MESSAGE_INFO, |
25 | buttons: GTK_BUTTONS_OK_CANCEL, |
26 | message_format: "Test message" ); |
27 | gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), |
28 | ngettext ("Has been shown once" , "Has been shown %d times" , i), i); |
29 | g_signal_connect (dialog, "response" , G_CALLBACK (gtk_window_destroy), NULL); |
30 | gtk_widget_show (widget: dialog); |
31 | i++; |
32 | } |
33 | |
34 | typedef struct { |
35 | GtkWidget *local_entry1; |
36 | GtkWidget *local_entry2; |
37 | GtkWidget *global_entry1; |
38 | GtkWidget *global_entry2; |
39 | } ResponseData; |
40 | |
41 | static void |
42 | on_dialog_response (GtkDialog *dialog, |
43 | int response, |
44 | gpointer user_data) |
45 | { |
46 | ResponseData *data = user_data; |
47 | |
48 | if (response == GTK_RESPONSE_OK) |
49 | { |
50 | gtk_editable_set_text (GTK_EDITABLE (data->global_entry1), |
51 | text: gtk_editable_get_text (GTK_EDITABLE (data->local_entry1))); |
52 | gtk_editable_set_text (GTK_EDITABLE (data->global_entry2), |
53 | text: gtk_editable_get_text (GTK_EDITABLE (data->local_entry2))); |
54 | } |
55 | |
56 | gtk_window_destroy (GTK_WINDOW (dialog)); |
57 | } |
58 | |
59 | static void |
60 | interactive_dialog_clicked (GtkButton *button, |
61 | gpointer user_data) |
62 | { |
63 | GtkWidget *content_area; |
64 | GtkWidget *dialog; |
65 | GtkWidget *table; |
66 | GtkWidget *local_entry1; |
67 | GtkWidget *local_entry2; |
68 | GtkWidget *label; |
69 | ResponseData *data; |
70 | |
71 | dialog = gtk_dialog_new_with_buttons (title: "Interactive Dialog" , |
72 | GTK_WINDOW (window), |
73 | flags: GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR, |
74 | _("_OK" ), GTK_RESPONSE_OK, |
75 | _("_Cancel" ), GTK_RESPONSE_CANCEL, |
76 | NULL); |
77 | |
78 | gtk_dialog_set_default_response (GTK_DIALOG (dialog), response_id: GTK_RESPONSE_OK); |
79 | |
80 | content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); |
81 | |
82 | table = gtk_grid_new (); |
83 | gtk_widget_set_hexpand (widget: table, TRUE); |
84 | gtk_widget_set_vexpand (widget: table, TRUE); |
85 | gtk_widget_set_halign (widget: table, align: GTK_ALIGN_CENTER); |
86 | gtk_widget_set_valign (widget: table, align: GTK_ALIGN_CENTER); |
87 | gtk_box_append (GTK_BOX (content_area), child: table); |
88 | gtk_grid_set_row_spacing (GTK_GRID (table), spacing: 6); |
89 | gtk_grid_set_column_spacing (GTK_GRID (table), spacing: 6); |
90 | |
91 | label = gtk_label_new_with_mnemonic (str: "_Entry 1" ); |
92 | gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 0, width: 1, height: 1); |
93 | local_entry1 = gtk_entry_new (); |
94 | gtk_editable_set_text (GTK_EDITABLE (local_entry1), text: gtk_editable_get_text (GTK_EDITABLE (entry1))); |
95 | gtk_grid_attach (GTK_GRID (table), child: local_entry1, column: 1, row: 0, width: 1, height: 1); |
96 | gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: local_entry1); |
97 | |
98 | label = gtk_label_new_with_mnemonic (str: "E_ntry 2" ); |
99 | gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 1, width: 1, height: 1); |
100 | |
101 | local_entry2 = gtk_entry_new (); |
102 | gtk_editable_set_text (GTK_EDITABLE (local_entry2), text: gtk_editable_get_text (GTK_EDITABLE (entry2))); |
103 | gtk_grid_attach (GTK_GRID (table), child: local_entry2, column: 1, row: 1, width: 1, height: 1); |
104 | gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: local_entry2); |
105 | |
106 | data = g_new (ResponseData, 1); |
107 | data->local_entry1 = local_entry1; |
108 | data->local_entry2 = local_entry2; |
109 | data->global_entry1 = entry1; |
110 | data->global_entry2 = entry2; |
111 | |
112 | g_signal_connect_data (instance: dialog, detailed_signal: "response" , |
113 | G_CALLBACK (on_dialog_response), |
114 | data, destroy_data: (GClosureNotify) g_free, |
115 | connect_flags: 0); |
116 | |
117 | gtk_widget_show (widget: dialog); |
118 | } |
119 | |
120 | GtkWidget * |
121 | do_dialog (GtkWidget *do_widget) |
122 | { |
123 | GtkWidget *vbox; |
124 | GtkWidget *vbox2; |
125 | GtkWidget *hbox; |
126 | GtkWidget *button; |
127 | GtkWidget *table; |
128 | GtkWidget *label; |
129 | |
130 | if (!window) |
131 | { |
132 | window = gtk_window_new (); |
133 | gtk_window_set_display (GTK_WINDOW (window), |
134 | display: gtk_widget_get_display (widget: do_widget)); |
135 | gtk_window_set_title (GTK_WINDOW (window), title: "Dialogs" ); |
136 | gtk_window_set_resizable (GTK_WINDOW (window), FALSE); |
137 | g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window); |
138 | |
139 | vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 8); |
140 | gtk_widget_set_margin_start (widget: vbox, margin: 8); |
141 | gtk_widget_set_margin_end (widget: vbox, margin: 8); |
142 | gtk_widget_set_margin_top (widget: vbox, margin: 8); |
143 | gtk_widget_set_margin_bottom (widget: vbox, margin: 8); |
144 | gtk_window_set_child (GTK_WINDOW (window), child: vbox); |
145 | |
146 | /* Standard message dialog */ |
147 | hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 8); |
148 | gtk_box_append (GTK_BOX (vbox), child: hbox); |
149 | button = gtk_button_new_with_mnemonic (label: "_Message Dialog" ); |
150 | g_signal_connect (button, "clicked" , |
151 | G_CALLBACK (message_dialog_clicked), NULL); |
152 | gtk_box_append (GTK_BOX (hbox), child: button); |
153 | |
154 | gtk_box_append (GTK_BOX (vbox), child: gtk_separator_new (orientation: GTK_ORIENTATION_HORIZONTAL)); |
155 | |
156 | /* Interactive dialog*/ |
157 | hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 8); |
158 | gtk_box_append (GTK_BOX (vbox), child: hbox); |
159 | vbox2 = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0); |
160 | |
161 | button = gtk_button_new_with_mnemonic (label: "_Interactive Dialog" ); |
162 | g_signal_connect (button, "clicked" , |
163 | G_CALLBACK (interactive_dialog_clicked), NULL); |
164 | gtk_box_append (GTK_BOX (hbox), child: vbox2); |
165 | gtk_box_append (GTK_BOX (vbox2), child: button); |
166 | |
167 | table = gtk_grid_new (); |
168 | gtk_grid_set_row_spacing (GTK_GRID (table), spacing: 4); |
169 | gtk_grid_set_column_spacing (GTK_GRID (table), spacing: 4); |
170 | gtk_box_append (GTK_BOX (hbox), child: table); |
171 | |
172 | label = gtk_label_new_with_mnemonic (str: "_Entry 1" ); |
173 | gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 0, width: 1, height: 1); |
174 | |
175 | entry1 = gtk_entry_new (); |
176 | gtk_grid_attach (GTK_GRID (table), child: entry1, column: 1, row: 0, width: 1, height: 1); |
177 | gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: entry1); |
178 | |
179 | label = gtk_label_new_with_mnemonic (str: "E_ntry 2" ); |
180 | gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 1, width: 1, height: 1); |
181 | |
182 | entry2 = gtk_entry_new (); |
183 | gtk_grid_attach (GTK_GRID (table), child: entry2, column: 1, row: 1, width: 1, height: 1); |
184 | } |
185 | |
186 | if (!gtk_widget_get_visible (widget: window)) |
187 | gtk_widget_show (widget: window); |
188 | else |
189 | gtk_window_destroy (GTK_WINDOW (window)); |
190 | |
191 | return window; |
192 | } |
193 | |