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 | |
10 | static void |
11 | on_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 | |
39 | GtkWidget * |
40 | do_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 | |