2
* Copyright (c) 2011, 2012 Red Hat, Inc.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or (at your
7
* option) any later version.
9
* This program is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of the GNU Lesser General Public License
15
* along with this program; if not, write to the Free Software Foundation,
16
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
* Author: Cosimo Cecchi <cosimoc@redhat.com>
22
#include "gd-main-toolbar.h"
23
#include "gd-header-button.h"
26
#include <glib/gi18n.h>
28
G_DEFINE_TYPE (GdMainToolbar, gd_main_toolbar, GTK_TYPE_TOOLBAR)
30
struct _GdMainToolbarPrivate {
31
GtkSizeGroup *size_group;
32
GtkSizeGroup *vertical_size_group;
34
GtkToolItem *left_group;
35
GtkToolItem *center_group;
36
GtkToolItem *right_group;
39
GtkWidget *center_grid;
41
GtkWidget *labels_grid;
42
GtkWidget *title_label;
43
GtkWidget *detail_label;
47
GtkWidget *center_menu;
48
GtkWidget *center_menu_child;
50
GtkWidget *right_grid;
61
gd_main_toolbar_dispose (GObject *obj)
63
GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
65
g_clear_object (&self->priv->size_group);
66
g_clear_object (&self->priv->vertical_size_group);
68
G_OBJECT_CLASS (gd_main_toolbar_parent_class)->dispose (obj);
72
get_vertical_size_group (GdMainToolbar *self)
76
GtkToolItem *container;
78
dummy = gd_header_simple_button_new ();
79
gd_header_button_set_label (GD_HEADER_BUTTON (dummy), "Dummy");
80
container = gtk_tool_item_new ();
81
gtk_widget_set_no_show_all (GTK_WIDGET (container), TRUE);
82
gtk_container_add (GTK_CONTAINER (container), dummy);
83
gtk_toolbar_insert (GTK_TOOLBAR (self), container, -1);
85
retval = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
86
gtk_size_group_add_widget (retval, dummy);
92
gd_main_toolbar_get_show_modes (GdMainToolbar *self)
94
return self->priv->show_modes;
98
gd_main_toolbar_set_show_modes (GdMainToolbar *self,
101
if (self->priv->show_modes == show_modes)
104
self->priv->show_modes = show_modes;
105
if (self->priv->show_modes)
107
gtk_widget_set_no_show_all (self->priv->labels_grid, TRUE);
108
gtk_widget_hide (self->priv->labels_grid);
110
gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_FILL);
111
gtk_widget_set_no_show_all (self->priv->modes_box, FALSE);
112
gtk_widget_show_all (self->priv->modes_box);
116
gtk_widget_set_no_show_all (self->priv->modes_box, TRUE);
117
gtk_widget_hide (self->priv->modes_box);
119
gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER);
120
gtk_widget_set_no_show_all (self->priv->labels_grid, FALSE);
121
gtk_widget_show_all (self->priv->labels_grid);
124
g_object_notify (G_OBJECT (self), "show-modes");
128
gd_main_toolbar_set_property (GObject *object,
134
GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
138
case PROP_SHOW_MODES:
139
gd_main_toolbar_set_show_modes (GD_MAIN_TOOLBAR (self), g_value_get_boolean (value));
142
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
148
gd_main_toolbar_get_property (GObject *object,
153
GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
157
case PROP_SHOW_MODES:
158
g_value_set_boolean (value, self->priv->show_modes);
161
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
167
gd_main_toolbar_constructed (GObject *obj)
169
GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
170
GtkToolbar *tb = GTK_TOOLBAR (obj);
173
G_OBJECT_CLASS (gd_main_toolbar_parent_class)->constructed (obj);
175
self->priv->vertical_size_group = get_vertical_size_group (self);
178
self->priv->left_group = gtk_tool_item_new ();
179
gtk_widget_set_margin_right (GTK_WIDGET (self->priv->left_group), 12);
180
gtk_toolbar_insert (tb, self->priv->left_group, -1);
181
gtk_size_group_add_widget (self->priv->vertical_size_group,
182
GTK_WIDGET (self->priv->left_group));
184
/* left button group */
185
self->priv->left_grid = gtk_grid_new ();
186
gtk_grid_set_column_spacing (GTK_GRID (self->priv->left_grid), 12);
187
gtk_container_add (GTK_CONTAINER (self->priv->left_group), self->priv->left_grid);
188
gtk_widget_set_halign (self->priv->left_grid, GTK_ALIGN_START);
191
self->priv->center_group = gtk_tool_item_new ();
192
gtk_tool_item_set_expand (self->priv->center_group, TRUE);
193
gtk_toolbar_insert (tb, self->priv->center_group, -1);
194
self->priv->center_grid = gtk_grid_new ();
195
gtk_widget_set_halign (self->priv->center_grid, GTK_ALIGN_CENTER);
196
gtk_widget_set_valign (self->priv->center_grid, GTK_ALIGN_CENTER);
197
gtk_container_add (GTK_CONTAINER (self->priv->center_group), self->priv->center_grid);
198
gtk_size_group_add_widget (self->priv->vertical_size_group,
199
GTK_WIDGET (self->priv->center_group));
201
/* centered label group */
202
self->priv->labels_grid = grid = gtk_grid_new ();
203
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
204
gtk_container_add (GTK_CONTAINER (self->priv->center_grid), grid);
206
self->priv->title_label = gtk_label_new (NULL);
207
gtk_label_set_ellipsize (GTK_LABEL (self->priv->title_label), PANGO_ELLIPSIZE_END);
208
gtk_container_add (GTK_CONTAINER (grid), self->priv->title_label);
210
self->priv->detail_label = gtk_label_new (NULL);
211
gtk_label_set_ellipsize (GTK_LABEL (self->priv->detail_label), PANGO_ELLIPSIZE_END);
212
gtk_widget_set_no_show_all (self->priv->detail_label, TRUE);
213
gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->detail_label), "dim-label");
214
gtk_container_add (GTK_CONTAINER (grid), self->priv->detail_label);
216
/* centered mode group */
217
self->priv->modes_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
218
gtk_box_set_homogeneous (GTK_BOX (self->priv->modes_box), TRUE);
219
gtk_widget_set_no_show_all (self->priv->modes_box, TRUE);
220
gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->modes_box), "linked");
221
gtk_container_add (GTK_CONTAINER (self->priv->center_grid), self->priv->modes_box);
224
self->priv->right_group = gtk_tool_item_new ();
225
gtk_widget_set_margin_left (GTK_WIDGET (self->priv->right_group), 12);
226
gtk_toolbar_insert (tb, self->priv->right_group, -1);
227
gtk_size_group_add_widget (self->priv->vertical_size_group,
228
GTK_WIDGET (self->priv->right_group));
230
self->priv->right_grid = gtk_grid_new ();
231
gtk_grid_set_column_spacing (GTK_GRID (self->priv->right_grid), 12);
232
gtk_container_add (GTK_CONTAINER (self->priv->right_group), self->priv->right_grid);
233
gtk_widget_set_halign (self->priv->right_grid, GTK_ALIGN_END);
235
self->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
236
gtk_size_group_add_widget (self->priv->size_group, GTK_WIDGET (self->priv->left_group));
237
gtk_size_group_add_widget (self->priv->size_group, GTK_WIDGET (self->priv->right_group));
241
gd_main_toolbar_init (GdMainToolbar *self)
243
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_MAIN_TOOLBAR, GdMainToolbarPrivate);
247
gd_main_toolbar_class_init (GdMainToolbarClass *klass)
249
GObjectClass *oclass;
251
oclass = G_OBJECT_CLASS (klass);
252
oclass->constructed = gd_main_toolbar_constructed;
253
oclass->set_property = gd_main_toolbar_set_property;
254
oclass->get_property = gd_main_toolbar_get_property;
255
oclass->dispose = gd_main_toolbar_dispose;
257
g_object_class_install_property (oclass,
259
g_param_spec_boolean ("show-modes",
265
g_type_class_add_private (klass, sizeof (GdMainToolbarPrivate));
269
gd_main_toolbar_clear (GdMainToolbar *self)
272
gtk_label_set_text (GTK_LABEL (self->priv->title_label), "");
273
gtk_label_set_text (GTK_LABEL (self->priv->detail_label), "");
275
/* clear all added buttons */
276
gtk_container_foreach (GTK_CONTAINER (self->priv->left_grid),
277
(GtkCallback) gtk_widget_destroy, self);
278
gtk_container_foreach (GTK_CONTAINER (self->priv->modes_box),
279
(GtkCallback) gtk_widget_destroy, self);
280
gtk_container_foreach (GTK_CONTAINER (self->priv->right_grid),
281
(GtkCallback) gtk_widget_destroy, self);
285
* gd_main_toolbar_set_labels:
287
* @primary: (allow-none):
288
* @detail: (allow-none):
292
gd_main_toolbar_set_labels (GdMainToolbar *self,
293
const gchar *primary,
296
gchar *real_primary = NULL;
299
real_primary = g_markup_printf_escaped ("<b>%s</b>", primary);
301
if (real_primary == NULL)
303
gtk_label_set_markup (GTK_LABEL (self->priv->title_label), "");
304
gtk_widget_hide (self->priv->title_label);
308
gtk_label_set_markup (GTK_LABEL (self->priv->title_label), real_primary);
309
gtk_widget_show (self->priv->title_label);
314
gtk_label_set_text (GTK_LABEL (self->priv->detail_label), "");
315
gtk_widget_hide (self->priv->detail_label);
319
gtk_label_set_text (GTK_LABEL (self->priv->detail_label), detail);
320
gtk_widget_show (self->priv->detail_label);
323
g_free (real_primary);
327
gd_main_toolbar_new (void)
329
return g_object_new (GD_TYPE_MAIN_TOOLBAR, NULL);
333
* gd_main_toolbar_set_labels_menu:
335
* @menu: (allow-none):
339
gd_main_toolbar_set_labels_menu (GdMainToolbar *self,
342
GtkWidget *button, *grid, *w;
345
((gtk_widget_get_parent (self->priv->labels_grid) == self->priv->center_grid) ||
346
self->priv->center_menu_child == NULL))
351
g_object_ref (self->priv->labels_grid);
352
gtk_container_remove (GTK_CONTAINER (self->priv->center_grid),
353
self->priv->labels_grid);
355
self->priv->center_menu_child = grid = gtk_grid_new ();
356
gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
357
gtk_container_add (GTK_CONTAINER (grid), self->priv->labels_grid);
358
g_object_unref (self->priv->labels_grid);
360
w = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
361
gtk_container_add (GTK_CONTAINER (grid), w);
363
self->priv->center_menu = button = gtk_menu_button_new ();
364
gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->center_menu),
366
gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (button)));
367
gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
368
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), menu);
369
gtk_container_add (GTK_CONTAINER (self->priv->center_menu), grid);
371
gtk_container_add (GTK_CONTAINER (self->priv->center_grid), button);
375
g_object_ref (self->priv->labels_grid);
376
gtk_container_remove (GTK_CONTAINER (self->priv->center_menu_child),
377
self->priv->labels_grid);
378
gtk_widget_destroy (self->priv->center_menu);
380
self->priv->center_menu = NULL;
381
self->priv->center_menu_child = NULL;
383
gtk_container_add (GTK_CONTAINER (self->priv->center_grid),
384
self->priv->labels_grid);
385
g_object_unref (self->priv->labels_grid);
388
gtk_widget_show_all (self->priv->center_grid);
392
* gd_main_toolbar_add_mode:
396
* Returns: (transfer none):
399
gd_main_toolbar_add_mode (GdMainToolbar *self,
405
button = gtk_radio_button_new_with_label (NULL, label);
406
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
407
gtk_widget_set_size_request (button, 100, -1);
408
gtk_widget_set_vexpand (button, TRUE);
409
gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
410
gtk_style_context_add_class (gtk_widget_get_style_context (button), "text-button");
412
group = gtk_container_get_children (GTK_CONTAINER (self->priv->modes_box));
415
gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data));
419
gtk_container_add (GTK_CONTAINER (self->priv->modes_box), button);
420
gtk_widget_show (button);
426
* gd_main_toolbar_add_button:
428
* @icon_name: (allow-none):
429
* @label: (allow-none):
432
* Returns: (transfer none):
435
gd_main_toolbar_add_button (GdMainToolbar *self,
436
const gchar *icon_name,
440
GtkWidget *button = gd_header_simple_button_new ();
442
gd_header_button_set_symbolic_icon_name (GD_HEADER_BUTTON (button), icon_name);
443
gd_header_button_set_label (GD_HEADER_BUTTON (button), label);
445
gd_main_toolbar_add_widget (self, button, pack_start);
451
* gd_main_toolbar_add_menu:
453
* @icon_name: (allow-none):
454
* @label: (allow-none):
457
* Returns: (transfer none):
460
gd_main_toolbar_add_menu (GdMainToolbar *self,
461
const gchar *icon_name,
465
GtkWidget *button = gd_header_menu_button_new ();
467
gd_header_button_set_symbolic_icon_name (GD_HEADER_BUTTON (button), icon_name);
468
gd_header_button_set_label (GD_HEADER_BUTTON (button), label);
470
gd_main_toolbar_add_widget (self, button, pack_start);
476
* gd_main_toolbar_add_toggle:
478
* @icon_name: (allow-none):
479
* @label: (allow-none):
482
* Returns: (transfer none):
485
gd_main_toolbar_add_toggle (GdMainToolbar *self,
486
const gchar *icon_name,
490
GtkWidget *button = gd_header_toggle_button_new ();
492
gd_header_button_set_symbolic_icon_name (GD_HEADER_BUTTON (button), icon_name);
493
gd_header_button_set_label (GD_HEADER_BUTTON (button), label);
495
gd_main_toolbar_add_widget (self, button, pack_start);
501
* gd_main_toolbar_add_widget:
508
gd_main_toolbar_add_widget (GdMainToolbar *self,
513
gtk_container_add (GTK_CONTAINER (self->priv->left_grid), widget);
515
gtk_container_add (GTK_CONTAINER (self->priv->right_grid), widget);