]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/dialog.c
Deprecate widget flag: GTK_WIDGET_VISIBLE
[~andy/gtk] / demos / gtk-demo / dialog.c
1 /* Dialog and Message Boxes
2  *
3  * Dialog widgets are used to pop up a transient window for user feedback.
4  */
5
6 #include <gtk/gtk.h>
7
8 static GtkWidget *window = NULL;
9 static GtkWidget *entry1 = NULL;
10 static GtkWidget *entry2 = NULL;
11
12 static void
13 message_dialog_clicked (GtkButton *button,
14                         gpointer   user_data)
15 {
16   GtkWidget *dialog;
17   static gint i = 1;
18
19   dialog = gtk_message_dialog_new (GTK_WINDOW (window),
20                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
21                                    GTK_MESSAGE_INFO,
22                                    GTK_BUTTONS_OK,
23                                    "This message box has been popped up the following\n"
24                                    "number of times:");
25   gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
26                                             "%d", i);
27   gtk_dialog_run (GTK_DIALOG (dialog));
28   gtk_widget_destroy (dialog);
29   i++;
30 }
31
32 static void
33 interactive_dialog_clicked (GtkButton *button,
34                             gpointer   user_data)
35 {
36   GtkWidget *dialog;
37   GtkWidget *hbox;
38   GtkWidget *stock;
39   GtkWidget *table;
40   GtkWidget *local_entry1;
41   GtkWidget *local_entry2;
42   GtkWidget *label;
43   gint response;
44
45   dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
46                                         GTK_WINDOW (window),
47                                         GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
48                                         GTK_STOCK_OK,
49                                         GTK_RESPONSE_OK,
50                                         "_Non-stock Button",
51                                         GTK_RESPONSE_CANCEL,
52                                         NULL);
53
54   hbox = gtk_hbox_new (FALSE, 8);
55   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
56   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
57
58   stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
59   gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
60
61   table = gtk_table_new (2, 2, FALSE);
62   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
63   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
64   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
65   label = gtk_label_new_with_mnemonic ("_Entry 1");
66   gtk_table_attach_defaults (GTK_TABLE (table),
67                              label,
68                              0, 1, 0, 1);
69   local_entry1 = gtk_entry_new ();
70   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
71   gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
72   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry1);
73
74   label = gtk_label_new_with_mnemonic ("E_ntry 2");
75   gtk_table_attach_defaults (GTK_TABLE (table),
76                              label,
77                              0, 1, 1, 2);
78
79   local_entry2 = gtk_entry_new ();
80   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
81   gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
82   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
83   
84   gtk_widget_show_all (hbox);
85   response = gtk_dialog_run (GTK_DIALOG (dialog));
86
87   if (response == GTK_RESPONSE_OK)
88     {
89       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
90       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
91     }
92
93   gtk_widget_destroy (dialog);
94 }
95
96 GtkWidget *
97 do_dialog (GtkWidget *do_widget)
98 {
99   GtkWidget *frame;
100   GtkWidget *vbox;
101   GtkWidget *vbox2;
102   GtkWidget *hbox;
103   GtkWidget *button;
104   GtkWidget *table;
105   GtkWidget *label;
106   
107   if (!window)
108     {
109       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
110       gtk_window_set_screen (GTK_WINDOW (window),
111                              gtk_widget_get_screen (do_widget));
112       gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
113
114       g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
115       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
116
117       frame = gtk_frame_new ("Dialogs");
118       gtk_container_add (GTK_CONTAINER (window), frame);
119
120       vbox = gtk_vbox_new (FALSE, 8);
121       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
122       gtk_container_add (GTK_CONTAINER (frame), vbox);
123
124       /* Standard message dialog */
125       hbox = gtk_hbox_new (FALSE, 8);
126       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
127       button = gtk_button_new_with_mnemonic ("_Message Dialog");
128       g_signal_connect (button, "clicked",
129                         G_CALLBACK (message_dialog_clicked), NULL);
130       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
131
132       gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
133
134       /* Interactive dialog*/
135       hbox = gtk_hbox_new (FALSE, 8);
136       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
137       vbox2 = gtk_vbox_new (FALSE, 0);
138
139       button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
140       g_signal_connect (button, "clicked",
141                         G_CALLBACK (interactive_dialog_clicked), NULL);
142       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
143       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
144
145       table = gtk_table_new (2, 2, FALSE);
146       gtk_table_set_row_spacings (GTK_TABLE (table), 4);
147       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
148       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
149
150       label = gtk_label_new_with_mnemonic ("_Entry 1");
151       gtk_table_attach_defaults (GTK_TABLE (table),
152                                  label,
153                                  0, 1, 0, 1);
154
155       entry1 = gtk_entry_new ();
156       gtk_table_attach_defaults (GTK_TABLE (table), entry1, 1, 2, 0, 1);
157       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry1);
158
159       label = gtk_label_new_with_mnemonic ("E_ntry 2");
160       
161       gtk_table_attach_defaults (GTK_TABLE (table),
162                                  label,
163                                  0, 1, 1, 2);
164
165       entry2 = gtk_entry_new ();
166       gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2);
167       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry2);
168     }
169
170   if (!gtk_widget_get_visible (window))
171     {
172       gtk_widget_show_all (window);
173     }
174   else
175     {    
176       gtk_widget_destroy (window);
177       window = NULL;
178     }
179
180   return window;
181 }