]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/dialog.c
add varargs for properties to set on the tag.
[~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, gpointer user_data)
14 {
15   GtkWidget *dialog;
16   static gint i = 1;
17
18   dialog = gtk_message_dialog_new (GTK_WINDOW (window),
19                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
20                                    GTK_MESSAGE_INFO,
21                                    GTK_BUTTONS_OK,
22                                    "This message box has been popped up the following\n"
23                                    "number of times:\n\n"
24                                    "%d", i);
25   gtk_dialog_run (GTK_DIALOG (dialog));
26   gtk_widget_destroy (dialog);
27   i++;
28 }
29
30 static void
31 interactive_dialog_clicked (GtkButton *button, gpointer user_data)
32 {
33   GtkWidget *dialog;
34   GtkWidget *hbox;
35   GtkWidget *stock;
36   GtkWidget *table;
37   GtkWidget *local_entry1;
38   GtkWidget *local_entry2;
39   gint response;
40
41   dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
42                                         GTK_WINDOW (window),
43                                         GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
44                                         GTK_STOCK_BUTTON_OK,
45                                         GTK_RESPONSE_OK,
46                                         NULL);
47
48   hbox = gtk_hbox_new (FALSE, 8);
49   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
50   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
51
52   stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
53   gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
54
55   table = gtk_table_new (2, 2, FALSE);
56   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
57   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
58   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
59   gtk_table_attach_defaults (GTK_TABLE (table), gtk_label_new ("Entry 1"),
60                              0, 1, 0, 1);
61   gtk_table_attach_defaults (GTK_TABLE (table), gtk_label_new ("Entry 2"),
62                              0, 1, 1, 2);
63
64   local_entry1 = gtk_entry_new ();
65   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
66   gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
67   local_entry2 = gtk_entry_new ();
68   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
69   gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
70     
71   gtk_widget_show_all (hbox);
72   response = gtk_dialog_run (GTK_DIALOG (dialog));
73
74   if (response == GTK_RESPONSE_OK)
75     {
76       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
77       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
78     }
79
80   gtk_widget_destroy (dialog);
81 }
82
83 GtkWidget *
84 do_dialog (void)
85 {
86   GtkWidget *frame;
87   GtkWidget *vbox;
88   GtkWidget *vbox2;
89   GtkWidget *hbox;
90   GtkWidget *button;
91   GtkWidget *table;
92
93   if (!window)
94     {
95       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
96       gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
97
98       gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
99       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
100
101       frame = gtk_frame_new ("Dialogs");
102       gtk_container_add (GTK_CONTAINER (window), frame);
103
104       vbox = gtk_vbox_new (FALSE, 8);
105       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
106       gtk_container_add (GTK_CONTAINER (frame), vbox);
107
108       /* Standard message dialog */
109       hbox = gtk_hbox_new (FALSE, 8);
110       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
111       button = gtk_button_new_with_label ("Message Dialog");
112       gtk_signal_connect (GTK_OBJECT (button), "clicked",
113                           GTK_SIGNAL_FUNC (message_dialog_clicked), NULL);
114       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
115
116       gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
117
118       /* Interactive dialog*/
119       hbox = gtk_hbox_new (FALSE, 8);
120       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
121       vbox2 = gtk_vbox_new (FALSE, 0);
122
123       button = gtk_button_new_with_label ("Interactive Dialog");
124       gtk_signal_connect (GTK_OBJECT (button), "clicked",
125                           GTK_SIGNAL_FUNC (interactive_dialog_clicked), NULL);
126       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
127       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
128
129       table = gtk_table_new (2, 2, FALSE);
130       gtk_table_set_row_spacings (GTK_TABLE (table), 4);
131       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
132       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
133       gtk_table_attach_defaults (GTK_TABLE (table), gtk_label_new ("Entry 1"), 0, 1, 0, 1);
134       gtk_table_attach_defaults (GTK_TABLE (table), gtk_label_new ("Entry 2"), 0, 1, 1, 2);
135
136       entry1 = gtk_entry_new ();
137       gtk_table_attach_defaults (GTK_TABLE (table), entry1, 1, 2, 0, 1);
138       entry2 = gtk_entry_new ();
139       gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2);
140     }
141
142   if (!GTK_WIDGET_VISIBLE (window))
143     {
144       gtk_widget_show_all (window);
145     }
146   else
147     {    
148       gtk_widget_destroy (window);
149       window = NULL;
150     }
151
152   return window;
153 }