1/* Info Bars
2 * #Keywords: GtkInfoBar
3 *
4 * Info bar widgets are used to report important messages to the user.
5 */
6
7#include <glib/gi18n.h>
8#include <gtk/gtk.h>
9
10static void
11on_bar_response (GtkInfoBar *info_bar,
12 int response_id,
13 gpointer user_data)
14{
15 GtkWidget *dialog;
16 GtkWidget *window;
17
18 if (response_id == GTK_RESPONSE_CLOSE)
19 {
20 gtk_info_bar_set_revealed (info_bar, FALSE);
21 return;
22 }
23
24 window = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (info_bar)));
25 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
26 flags: GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
27 type: GTK_MESSAGE_INFO,
28 buttons: GTK_BUTTONS_OK,
29 message_format: "You clicked a button on an info bar");
30 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
31 message_format: "Your response has id %d", response_id);
32
33 g_signal_connect_swapped (dialog, "response",
34 G_CALLBACK (gtk_window_destroy), dialog);
35
36 gtk_widget_show (widget: dialog);
37}
38
39GtkWidget *
40do_infobar (GtkWidget *do_widget)
41{
42 static GtkWidget *window = NULL;
43 GtkWidget *frame;
44 GtkWidget *bar;
45 GtkWidget *vbox;
46 GtkWidget *label;
47 GtkWidget *actions;
48 GtkWidget *button;
49
50 if (!window)
51 {
52 actions = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 0);
53 gtk_widget_add_css_class (widget: actions, css_class: "linked");
54
55 window = gtk_window_new ();
56 gtk_window_set_display (GTK_WINDOW (window),
57 display: gtk_widget_get_display (widget: do_widget));
58 gtk_window_set_title (GTK_WINDOW (window), title: "Info Bars");
59 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
60 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
61
62 vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0);
63 gtk_widget_set_margin_start (widget: vbox, margin: 8);
64 gtk_widget_set_margin_end (widget: vbox, margin: 8);
65 gtk_widget_set_margin_top (widget: vbox, margin: 8);
66 gtk_widget_set_margin_bottom (widget: vbox, margin: 8);
67 gtk_window_set_child (GTK_WINDOW (window), child: vbox);
68
69 bar = gtk_info_bar_new ();
70 gtk_box_append (GTK_BOX (vbox), child: bar);
71 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), message_type: GTK_MESSAGE_INFO);
72 label = gtk_label_new (str: "This is an info bar with message type GTK_MESSAGE_INFO");
73 gtk_label_set_wrap (GTK_LABEL (label), TRUE);
74 gtk_label_set_xalign (GTK_LABEL (label), xalign: 0);
75 gtk_info_bar_add_child (GTK_INFO_BAR (bar), widget: label);
76
77 button = gtk_toggle_button_new_with_label (label: "Message");
78 g_object_bind_property (source: bar, source_property: "revealed", target: button, target_property: "active", flags: G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
79 gtk_box_append (GTK_BOX (actions), child: button);
80
81 bar = gtk_info_bar_new ();
82 gtk_box_append (GTK_BOX (vbox), child: bar);
83 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), message_type: GTK_MESSAGE_WARNING);
84 label = gtk_label_new (str: "This is an info bar with message type GTK_MESSAGE_WARNING");
85 gtk_label_set_wrap (GTK_LABEL (label), TRUE);
86 gtk_label_set_xalign (GTK_LABEL (label), xalign: 0);
87 gtk_info_bar_add_child (GTK_INFO_BAR (bar), widget: label);
88
89 button = gtk_toggle_button_new_with_label (label: "Warning");
90 g_object_bind_property (source: bar, source_property: "revealed", target: button, target_property: "active", flags: G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
91 gtk_box_append (GTK_BOX (actions), child: button);
92
93 bar = gtk_info_bar_new_with_buttons (_("_OK"), GTK_RESPONSE_OK, NULL);
94 gtk_info_bar_set_show_close_button (GTK_INFO_BAR (bar), TRUE);
95 g_signal_connect (bar, "response", G_CALLBACK (on_bar_response), window);
96 gtk_box_append (GTK_BOX (vbox), child: bar);
97 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), message_type: GTK_MESSAGE_QUESTION);
98 label = gtk_label_new (str: "This is an info bar with message type GTK_MESSAGE_QUESTION");
99 gtk_label_set_wrap (GTK_LABEL (label), TRUE);
100 gtk_label_set_xalign (GTK_LABEL (label), xalign: 0);
101 gtk_info_bar_add_child (GTK_INFO_BAR (bar), widget: label);
102 gtk_info_bar_set_default_response (GTK_INFO_BAR (bar), response_id: GTK_RESPONSE_OK);
103
104 button = gtk_toggle_button_new_with_label (label: "Question");
105 g_object_bind_property (source: bar, source_property: "revealed", target: button, target_property: "active", flags: G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
106 gtk_box_append (GTK_BOX (actions), child: button);
107
108 bar = gtk_info_bar_new ();
109 gtk_box_append (GTK_BOX (vbox), child: bar);
110 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), message_type: GTK_MESSAGE_ERROR);
111 label = gtk_label_new (str: "This is an info bar with message type GTK_MESSAGE_ERROR");
112 gtk_label_set_wrap (GTK_LABEL (label), TRUE);
113 gtk_label_set_xalign (GTK_LABEL (label), xalign: 0);
114 gtk_info_bar_add_child (GTK_INFO_BAR (bar), widget: label);
115
116 button = gtk_toggle_button_new_with_label (label: "Error");
117 g_object_bind_property (source: bar, source_property: "revealed", target: button, target_property: "active", flags: G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
118
119 gtk_box_append (GTK_BOX (actions), child: button);
120
121 bar = gtk_info_bar_new ();
122 gtk_box_append (GTK_BOX (vbox), child: bar);
123 gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), message_type: GTK_MESSAGE_OTHER);
124 label = gtk_label_new (str: "This is an info bar with message type GTK_MESSAGE_OTHER");
125 gtk_label_set_wrap (GTK_LABEL (label), TRUE);
126 gtk_label_set_xalign (GTK_LABEL (label), xalign: 0);
127 gtk_info_bar_add_child (GTK_INFO_BAR (bar), widget: label);
128
129 button = gtk_toggle_button_new_with_label (label: "Other");
130 g_object_bind_property (source: bar, source_property: "revealed", target: button, target_property: "active", flags: G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
131 gtk_box_append (GTK_BOX (actions), child: button);
132
133 frame = gtk_frame_new (label: "An example of different info bars");
134 gtk_widget_set_margin_top (widget: frame, margin: 8);
135 gtk_widget_set_margin_bottom (widget: frame, margin: 8);
136 gtk_box_append (GTK_BOX (vbox), child: frame);
137
138 gtk_widget_set_halign (widget: actions, align: GTK_ALIGN_CENTER);
139
140 gtk_widget_set_margin_start (widget: actions, margin: 8);
141 gtk_widget_set_margin_end (widget: actions, margin: 8);
142 gtk_widget_set_margin_top (widget: actions, margin: 8);
143 gtk_widget_set_margin_bottom (widget: actions, margin: 8);
144 gtk_frame_set_child (GTK_FRAME (frame), child: actions);
145 }
146
147 if (!gtk_widget_get_visible (widget: window))
148 gtk_widget_show (widget: window);
149 else
150 gtk_window_destroy (GTK_WINDOW (window));
151
152 return window;
153}
154

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