~ubuntu-branches/ubuntu/trusty/gnome-contacts/trusty

« back to all changes in this revision

Viewing changes to libgd/libgd/gd-main-toolbar.c

  • Committer: Package Import Robot
  • Author(s): Michael Biebl, Jeremy Bicha, Michael Biebl
  • Date: 2013-09-19 18:23:06 UTC
  • mfrom: (1.3.10) (0.3.4 experimental)
  • mto: This revision was merged to the branch mainline in revision 40.
  • Revision ID: package-import@ubuntu.com-20130919182306-rcatwotzg94pr884
Tags: 3.8.3-1
[ Jeremy Bicha ]
* debian/control.in:
  - Drop alternate build-depends on valac-0.18 since it's no longer
    in Debian

[ Michael Biebl ]
* New upstream release.
* Loosen Build-Depends on libgnome-desktop-3-dev, we do not strictly require
  version (>= 3.6.0) which is not yet available in unstable.
* Bump Standards-Version to 3.9.4. No further changes.
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2011, 2012 Red Hat, Inc.
 
3
 *
 
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.
 
8
 *
 
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.
 
13
 *
 
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
 
17
 *
 
18
 * Author: Cosimo Cecchi <cosimoc@redhat.com>
 
19
 *
 
20
 */
 
21
 
 
22
#include "gd-main-toolbar.h"
 
23
#include "gd-header-button.h"
 
24
 
 
25
#include <math.h>
 
26
#include <glib/gi18n.h>
 
27
 
 
28
G_DEFINE_TYPE (GdMainToolbar, gd_main_toolbar, GTK_TYPE_TOOLBAR)
 
29
 
 
30
struct _GdMainToolbarPrivate {
 
31
  GtkSizeGroup *size_group;
 
32
  GtkSizeGroup *vertical_size_group;
 
33
 
 
34
  GtkToolItem *left_group;
 
35
  GtkToolItem *center_group;
 
36
  GtkToolItem *right_group;
 
37
 
 
38
  GtkWidget *left_grid;
 
39
  GtkWidget *center_grid;
 
40
 
 
41
  GtkWidget *labels_grid;
 
42
  GtkWidget *title_label;
 
43
  GtkWidget *detail_label;
 
44
 
 
45
  GtkWidget *modes_box;
 
46
 
 
47
  GtkWidget *center_menu;
 
48
  GtkWidget *center_menu_child;
 
49
 
 
50
  GtkWidget *right_grid;
 
51
 
 
52
  gboolean show_modes;
 
53
};
 
54
 
 
55
enum {
 
56
        PROP_0,
 
57
        PROP_SHOW_MODES,
 
58
};
 
59
 
 
60
static void
 
61
gd_main_toolbar_dispose (GObject *obj)
 
62
{
 
63
  GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
 
64
 
 
65
  g_clear_object (&self->priv->size_group);
 
66
  g_clear_object (&self->priv->vertical_size_group);
 
67
 
 
68
  G_OBJECT_CLASS (gd_main_toolbar_parent_class)->dispose (obj);
 
69
}
 
70
 
 
71
static GtkSizeGroup *
 
72
get_vertical_size_group (GdMainToolbar *self)
 
73
{
 
74
  GtkSizeGroup *retval;
 
75
  GtkWidget *dummy;
 
76
  GtkToolItem *container;
 
77
 
 
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);
 
84
 
 
85
  retval = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
 
86
  gtk_size_group_add_widget (retval, dummy);
 
87
 
 
88
  return retval;
 
89
}
 
90
 
 
91
gboolean
 
92
gd_main_toolbar_get_show_modes (GdMainToolbar *self)
 
93
{
 
94
  return self->priv->show_modes;
 
95
}
 
96
 
 
97
void
 
98
gd_main_toolbar_set_show_modes (GdMainToolbar *self,
 
99
                                gboolean show_modes)
 
100
{
 
101
  if (self->priv->show_modes == show_modes)
 
102
    return;
 
103
 
 
104
  self->priv->show_modes = show_modes;
 
105
  if (self->priv->show_modes)
 
106
    {
 
107
      gtk_widget_set_no_show_all (self->priv->labels_grid, TRUE);
 
108
      gtk_widget_hide (self->priv->labels_grid);
 
109
 
 
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);
 
113
    }
 
114
  else
 
115
    {
 
116
      gtk_widget_set_no_show_all (self->priv->modes_box, TRUE);
 
117
      gtk_widget_hide (self->priv->modes_box);
 
118
 
 
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);
 
122
    }
 
123
 
 
124
  g_object_notify (G_OBJECT (self), "show-modes");
 
125
}
 
126
 
 
127
static void
 
128
gd_main_toolbar_set_property (GObject      *object,
 
129
                              guint         prop_id,
 
130
                              const GValue *value,
 
131
                              GParamSpec   *pspec)
 
132
{
 
133
 
 
134
  GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
 
135
 
 
136
  switch (prop_id)
 
137
    {
 
138
    case PROP_SHOW_MODES:
 
139
      gd_main_toolbar_set_show_modes (GD_MAIN_TOOLBAR (self), g_value_get_boolean (value));
 
140
      break;
 
141
    default:
 
142
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
143
      break;
 
144
    }
 
145
}
 
146
 
 
147
static void
 
148
gd_main_toolbar_get_property (GObject    *object,
 
149
                              guint       prop_id,
 
150
                              GValue     *value,
 
151
                              GParamSpec *pspec)
 
152
{
 
153
  GdMainToolbar *self = GD_MAIN_TOOLBAR (object);
 
154
 
 
155
  switch (prop_id)
 
156
    {
 
157
    case PROP_SHOW_MODES:
 
158
      g_value_set_boolean (value, self->priv->show_modes);
 
159
      break;
 
160
    default:
 
161
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
162
      break;
 
163
    }
 
164
}
 
165
 
 
166
static void
 
167
gd_main_toolbar_constructed (GObject *obj)
 
168
{
 
169
  GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
 
170
  GtkToolbar *tb = GTK_TOOLBAR (obj);
 
171
  GtkWidget *grid;
 
172
 
 
173
  G_OBJECT_CLASS (gd_main_toolbar_parent_class)->constructed (obj);
 
174
 
 
175
  self->priv->vertical_size_group = get_vertical_size_group (self);
 
176
 
 
177
  /* left section */
 
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));
 
183
 
 
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);
 
189
 
 
190
  /* center section */
 
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));
 
200
 
 
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);
 
205
 
 
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);
 
209
 
 
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);
 
215
 
 
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);
 
222
 
 
223
  /* right section */
 
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));
 
229
 
 
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);
 
234
 
 
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));
 
238
}
 
239
 
 
240
static void
 
241
gd_main_toolbar_init (GdMainToolbar *self)
 
242
{
 
243
  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_MAIN_TOOLBAR, GdMainToolbarPrivate);
 
244
}
 
245
 
 
246
static void
 
247
gd_main_toolbar_class_init (GdMainToolbarClass *klass)
 
248
{
 
249
  GObjectClass *oclass;
 
250
 
 
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;
 
256
 
 
257
  g_object_class_install_property (oclass,
 
258
                                   PROP_SHOW_MODES,
 
259
                                   g_param_spec_boolean ("show-modes",
 
260
                                                         "Show Modes",
 
261
                                                         "Show Modes",
 
262
                                                         FALSE,
 
263
                                                         G_PARAM_READWRITE));
 
264
 
 
265
  g_type_class_add_private (klass, sizeof (GdMainToolbarPrivate));
 
266
}
 
267
 
 
268
void
 
269
gd_main_toolbar_clear (GdMainToolbar *self)
 
270
{
 
271
  /* reset labels */
 
272
  gtk_label_set_text (GTK_LABEL (self->priv->title_label), "");
 
273
  gtk_label_set_text (GTK_LABEL (self->priv->detail_label), "");
 
274
 
 
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);
 
282
}
 
283
 
 
284
/**
 
285
 * gd_main_toolbar_set_labels:
 
286
 * @self:
 
287
 * @primary: (allow-none):
 
288
 * @detail: (allow-none):
 
289
 *
 
290
 */
 
291
void
 
292
gd_main_toolbar_set_labels (GdMainToolbar *self,
 
293
                            const gchar *primary,
 
294
                            const gchar *detail)
 
295
{
 
296
  gchar *real_primary = NULL;
 
297
 
 
298
  if (primary != NULL)
 
299
    real_primary = g_markup_printf_escaped ("<b>%s</b>", primary);
 
300
 
 
301
  if (real_primary == NULL)
 
302
    {
 
303
      gtk_label_set_markup (GTK_LABEL (self->priv->title_label), "");
 
304
      gtk_widget_hide (self->priv->title_label);
 
305
    }
 
306
  else
 
307
    {
 
308
      gtk_label_set_markup (GTK_LABEL (self->priv->title_label), real_primary);
 
309
      gtk_widget_show (self->priv->title_label);
 
310
    }
 
311
 
 
312
  if (detail == NULL)
 
313
    {
 
314
      gtk_label_set_text (GTK_LABEL (self->priv->detail_label), "");
 
315
      gtk_widget_hide (self->priv->detail_label);
 
316
    }
 
317
  else
 
318
    {
 
319
      gtk_label_set_text (GTK_LABEL (self->priv->detail_label), detail);
 
320
      gtk_widget_show (self->priv->detail_label);
 
321
    }
 
322
 
 
323
  g_free (real_primary);
 
324
}
 
325
 
 
326
GtkWidget *
 
327
gd_main_toolbar_new (void)
 
328
{
 
329
  return g_object_new (GD_TYPE_MAIN_TOOLBAR, NULL);
 
330
}
 
331
 
 
332
/**
 
333
 * gd_main_toolbar_set_labels_menu:
 
334
 * @self:
 
335
 * @menu: (allow-none):
 
336
 *
 
337
 */
 
338
void
 
339
gd_main_toolbar_set_labels_menu (GdMainToolbar *self,
 
340
                                 GMenuModel    *menu)
 
341
{
 
342
  GtkWidget *button, *grid, *w;
 
343
 
 
344
  if (menu == NULL &&
 
345
      ((gtk_widget_get_parent (self->priv->labels_grid) == self->priv->center_grid) ||
 
346
       self->priv->center_menu_child == NULL))
 
347
    return;
 
348
 
 
349
  if (menu != NULL)
 
350
    {
 
351
      g_object_ref (self->priv->labels_grid);
 
352
      gtk_container_remove (GTK_CONTAINER (self->priv->center_grid),
 
353
                            self->priv->labels_grid);
 
354
 
 
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);
 
359
 
 
360
      w = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
 
361
      gtk_container_add (GTK_CONTAINER (grid), w);
 
362
 
 
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),
 
365
                                   "selection-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);
 
370
 
 
371
      gtk_container_add (GTK_CONTAINER (self->priv->center_grid), button);
 
372
    }
 
373
  else
 
374
    {
 
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);
 
379
 
 
380
      self->priv->center_menu = NULL;
 
381
      self->priv->center_menu_child = NULL;
 
382
 
 
383
      gtk_container_add (GTK_CONTAINER (self->priv->center_grid),
 
384
                         self->priv->labels_grid);
 
385
      g_object_unref (self->priv->labels_grid);
 
386
    }
 
387
 
 
388
  gtk_widget_show_all (self->priv->center_grid);
 
389
}
 
390
 
 
391
/**
 
392
 * gd_main_toolbar_add_mode:
 
393
 * @self:
 
394
 * @label:
 
395
 *
 
396
 * Returns: (transfer none):
 
397
 */
 
398
GtkWidget *
 
399
gd_main_toolbar_add_mode (GdMainToolbar *self,
 
400
                          const gchar *label)
 
401
{
 
402
  GtkWidget *button;
 
403
  GList *group;
 
404
 
 
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");
 
411
 
 
412
  group = gtk_container_get_children (GTK_CONTAINER (self->priv->modes_box));
 
413
  if (group != NULL)
 
414
    {
 
415
      gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data));
 
416
      g_list_free (group);
 
417
    }
 
418
 
 
419
  gtk_container_add (GTK_CONTAINER (self->priv->modes_box), button);
 
420
  gtk_widget_show (button);
 
421
 
 
422
  return button;
 
423
}
 
424
 
 
425
/**
 
426
 * gd_main_toolbar_add_button:
 
427
 * @self:
 
428
 * @icon_name: (allow-none):
 
429
 * @label: (allow-none):
 
430
 * @pack_start:
 
431
 *
 
432
 * Returns: (transfer none):
 
433
 */
 
434
GtkWidget *
 
435
gd_main_toolbar_add_button (GdMainToolbar *self,
 
436
                            const gchar *icon_name,
 
437
                            const gchar *label,
 
438
                            gboolean pack_start)
 
439
{
 
440
  GtkWidget *button = gd_header_simple_button_new ();
 
441
 
 
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);
 
444
 
 
445
  gd_main_toolbar_add_widget (self, button, pack_start);
 
446
 
 
447
  return button;
 
448
}
 
449
 
 
450
/**
 
451
 * gd_main_toolbar_add_menu:
 
452
 * @self:
 
453
 * @icon_name: (allow-none):
 
454
 * @label: (allow-none):
 
455
 * @pack_start:
 
456
 *
 
457
 * Returns: (transfer none):
 
458
 */
 
459
GtkWidget *
 
460
gd_main_toolbar_add_menu (GdMainToolbar *self,
 
461
                          const gchar *icon_name,
 
462
                          const gchar *label,
 
463
                          gboolean pack_start)
 
464
{
 
465
  GtkWidget *button = gd_header_menu_button_new ();
 
466
 
 
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);
 
469
 
 
470
  gd_main_toolbar_add_widget (self, button, pack_start);
 
471
 
 
472
  return button;
 
473
}
 
474
 
 
475
/**
 
476
 * gd_main_toolbar_add_toggle:
 
477
 * @self:
 
478
 * @icon_name: (allow-none):
 
479
 * @label: (allow-none):
 
480
 * @pack_start:
 
481
 *
 
482
 * Returns: (transfer none):
 
483
 */
 
484
GtkWidget *
 
485
gd_main_toolbar_add_toggle (GdMainToolbar *self,
 
486
                            const gchar *icon_name,
 
487
                            const gchar *label,
 
488
                            gboolean pack_start)
 
489
{
 
490
  GtkWidget *button = gd_header_toggle_button_new ();
 
491
 
 
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);
 
494
 
 
495
  gd_main_toolbar_add_widget (self, button, pack_start);
 
496
 
 
497
  return button;
 
498
}
 
499
 
 
500
/**
 
501
 * gd_main_toolbar_add_widget:
 
502
 * @self:
 
503
 * @widget:
 
504
 * @pack_start:
 
505
 *
 
506
 */
 
507
void
 
508
gd_main_toolbar_add_widget (GdMainToolbar *self,
 
509
                            GtkWidget *widget,
 
510
                            gboolean pack_start)
 
511
{
 
512
  if (pack_start)
 
513
    gtk_container_add (GTK_CONTAINER (self->priv->left_grid), widget);
 
514
  else
 
515
    gtk_container_add (GTK_CONTAINER (self->priv->right_grid), widget);
 
516
}