1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2013-2014 Red Hat, Inc.
3 *
4 * Authors:
5 * - Bastien Nocera <bnocera@redhat.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 /*
22 * Modified by the GTK+ Team and others 2013-2014. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
26 */
27
28 #include "config.h"
29
30 #include <gtk/gtk.h>
31 #include <glib/gi18n-lib.h>
32 #include "totem-main-toolbar.h"
33 #include "griloresources.h"
34
35 /*
36 * SECTION:totemmaintoolbar
37 * @Short_description: An toolbar with oft-used buttons.
38 * @Title: TotemMainToolbar
39 *
40 * #TotemMainToolbar is a toolbar that contains oft-used buttons such as toggles
41 * for select mode, and find mode, or a new button. The widget will also be
42 * styled properly when in specific mode.
43 *
44 * Since: 3.10
45 */
46
47 struct _TotemMainToolbarPrivate {
48 /* Template widgets */
49 GtkWidget *search_button;
50 GtkWidget *select_button;
51 GtkWidget *done_button;
52 GtkWidget *back_button;
53 GtkWidget *stack;
54
55 /* Visibility */
56 gboolean show_search_button;
57 gboolean show_select_button;
58
59 /* Modes */
60 gboolean search_mode;
61 gboolean select_mode;
62
63 /* Normal title */
64 GtkWidget *title_label;
65 GtkWidget *subtitle_label;
66
67 /* Custom title */
68 GtkWidget *custom_title;
69
70 /* Search results */
71 GtkWidget *search_results_label;
72 char *search_string;
73
74 /* Selection mode */
75 guint n_selected;
76 GtkWidget *selection_menu_button;
77 };
78
79 G_DEFINE_TYPE_WITH_CODE (TotemMainToolbar, totem_main_toolbar, GTK_TYPE_HEADER_BAR,
80 G_ADD_PRIVATE (TotemMainToolbar));
81
82 enum {
83 PROP_0,
84 PROP_TITLE,
85 PROP_SUBTITLE,
86 PROP_SEARCH_STRING,
87 PROP_N_SELECTED,
88 PROP_SEARCH_MODE,
89 PROP_SHOW_SEARCH_BUTTON,
90 PROP_SELECT_MODE,
91 PROP_SELECT_MODE_AVAILABLE,
92 PROP_SHOW_SELECT_BUTTON,
93 PROP_SHOW_BACK_BUTTON,
94 PROP_CUSTOM_TITLE,
95 PROP_SELECT_MENU_MODEL
96 };
97
98 #define DEFAULT_PAGE "title"
99 #define CUSTOM_TITLE_PAGE "custom-title"
100 #define SEARCH_RESULTS_PAGE "search-results"
101 #define SELECTION_PAGE "select"
102
103 static void
change_class(GtkWidget * widget,const char * class,gboolean add)104 change_class (GtkWidget *widget,
105 const char *class,
106 gboolean add)
107 {
108 GtkStyleContext *style;
109
110 style = gtk_widget_get_style_context (widget);
111 if (add)
112 gtk_style_context_add_class (style, class);
113 else
114 gtk_style_context_remove_class (style, class);
115 }
116
117 static void
update_toolbar_state(TotemMainToolbar * bar)118 update_toolbar_state (TotemMainToolbar *bar)
119 {
120 TotemMainToolbarPrivate *priv = bar->priv;
121
122 if (priv->select_mode)
123 {
124 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), SELECTION_PAGE);
125 gtk_widget_hide (priv->select_button);
126 gtk_widget_show (priv->done_button);
127
128 if (priv->n_selected == 0)
129 {
130 gtk_button_set_label (GTK_BUTTON (priv->selection_menu_button), _("Click on items to select them"));
131 }
132 else
133 {
134 char *label;
135
136 label = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d selected", "%d selected", priv->n_selected), priv->n_selected);
137 gtk_button_set_label (GTK_BUTTON (priv->selection_menu_button), label);
138 g_free (label);
139 }
140
141 change_class (GTK_WIDGET (bar), "selection-mode", TRUE);
142 }
143 else if (priv->search_mode)
144 {
145 if (!priv->search_string || *priv->search_string == '\0')
146 {
147 if (priv->custom_title)
148 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), CUSTOM_TITLE_PAGE);
149 else
150 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), DEFAULT_PAGE);
151 }
152 else
153 {
154 char *label;
155
156 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), SEARCH_RESULTS_PAGE);
157 label = g_strdup_printf (_("Results for “%s”"), priv->search_string);
158
159 gtk_label_set_label (GTK_LABEL (priv->search_results_label), label);
160 g_free (label);
161 }
162
163 if (priv->show_select_button)
164 gtk_widget_show (priv->select_button);
165 gtk_widget_hide (priv->done_button);
166
167 change_class (GTK_WIDGET (bar), "selection-mode", FALSE);
168 }
169 else
170 {
171 if (priv->custom_title == NULL)
172 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), DEFAULT_PAGE);
173 else
174 gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), CUSTOM_TITLE_PAGE);
175
176 if (priv->show_select_button)
177 gtk_widget_show (priv->select_button);
178 gtk_widget_hide (priv->done_button);
179 if (priv->show_search_button)
180 gtk_widget_show (priv->search_button);
181
182 change_class (GTK_WIDGET (bar), "selection-mode", FALSE);
183 }
184 }
185
186 static void
done_button_clicked_cb(GtkButton * button,TotemMainToolbar * bar)187 done_button_clicked_cb (GtkButton *button,
188 TotemMainToolbar *bar)
189 {
190 totem_main_toolbar_set_select_mode (bar, FALSE);
191 }
192
193 static void
back_button_clicked_cb(GtkButton * button,TotemMainToolbar * bar)194 back_button_clicked_cb (GtkButton *button,
195 TotemMainToolbar *bar)
196 {
197 g_signal_emit_by_name (G_OBJECT (bar), "back-clicked", NULL);
198 }
199
200 static void
totem_main_toolbar_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)201 totem_main_toolbar_set_property (GObject *object,
202 guint prop_id,
203 const GValue *value,
204 GParamSpec *pspec)
205 {
206 TotemMainToolbar *bar = TOTEM_MAIN_TOOLBAR (object);
207 TotemMainToolbarPrivate *priv = bar->priv;
208
209 switch (prop_id)
210 {
211 case PROP_TITLE:
212 totem_main_toolbar_set_title (bar, g_value_get_string (value));
213 break;
214
215 case PROP_SUBTITLE:
216 totem_main_toolbar_set_subtitle (bar, g_value_get_string (value));
217 break;
218
219 case PROP_SEARCH_STRING:
220 totem_main_toolbar_set_search_string (bar, g_value_get_string (value));
221 break;
222
223 case PROP_N_SELECTED:
224 totem_main_toolbar_set_n_selected (bar, g_value_get_uint (value));
225 break;
226
227 case PROP_SEARCH_MODE:
228 totem_main_toolbar_set_search_mode (bar, g_value_get_boolean (value));
229 break;
230
231 case PROP_SHOW_SEARCH_BUTTON:
232 priv->show_search_button = g_value_get_boolean (value);
233 gtk_widget_set_visible (priv->search_button, priv->show_search_button);
234 break;
235
236 case PROP_SELECT_MODE:
237 totem_main_toolbar_set_select_mode (bar, g_value_get_boolean (value));
238 break;
239
240 case PROP_SHOW_SELECT_BUTTON:
241 priv->show_select_button = g_value_get_boolean (value);
242 gtk_widget_set_visible (priv->select_button, priv->show_select_button);
243 break;
244
245 case PROP_SHOW_BACK_BUTTON:
246 gtk_widget_set_visible (priv->back_button, g_value_get_boolean (value));
247 break;
248
249 case PROP_CUSTOM_TITLE:
250 totem_main_toolbar_set_custom_title (bar, g_value_get_object (value));
251 break;
252
253 case PROP_SELECT_MENU_MODEL:
254 totem_main_toolbar_set_select_menu_model (bar, g_value_get_object (value));
255 break;
256
257 default:
258 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
259 break;
260 }
261 }
262
263 static void
totem_main_toolbar_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)264 totem_main_toolbar_get_property (GObject *object,
265 guint prop_id,
266 GValue *value,
267 GParamSpec *pspec)
268 {
269 TotemMainToolbar *bar = TOTEM_MAIN_TOOLBAR (object);
270 TotemMainToolbarPrivate *priv = bar->priv;
271
272 switch (prop_id)
273 {
274 case PROP_TITLE:
275 g_value_set_string (value, gtk_header_bar_get_title (GTK_HEADER_BAR (object)));
276 break;
277
278 case PROP_SUBTITLE:
279 g_value_set_string (value, gtk_header_bar_get_subtitle (GTK_HEADER_BAR (object)));
280 break;
281
282 case PROP_SEARCH_STRING:
283 g_value_set_string (value, totem_main_toolbar_get_search_string (bar));
284 break;
285
286 case PROP_N_SELECTED:
287 g_value_set_uint (value, totem_main_toolbar_get_n_selected (bar));
288 break;
289
290 case PROP_SEARCH_MODE:
291 g_value_set_boolean (value, totem_main_toolbar_get_search_mode (bar));
292 break;
293
294 case PROP_SHOW_SEARCH_BUTTON:
295 g_value_set_boolean (value, priv->show_search_button);
296 break;
297
298 case PROP_SELECT_MODE:
299 g_value_set_boolean (value, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->select_button)));
300 break;
301
302 case PROP_SHOW_SELECT_BUTTON:
303 g_value_set_boolean (value, priv->show_select_button);
304 break;
305
306 case PROP_SHOW_BACK_BUTTON:
307 g_value_set_boolean (value, gtk_widget_get_visible (priv->back_button));
308 break;
309
310 case PROP_CUSTOM_TITLE:
311 g_value_set_object (value, priv->custom_title);
312 break;
313
314 case PROP_SELECT_MENU_MODEL:
315 g_value_set_object (value, totem_main_toolbar_get_select_menu_model (bar));
316 break;
317
318 default:
319 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
320 break;
321 }
322 }
323
324 static void
totem_main_toolbar_finalize(GObject * object)325 totem_main_toolbar_finalize (GObject *object)
326 {
327 TotemMainToolbar *bar = TOTEM_MAIN_TOOLBAR (object);
328
329 g_free (bar->priv->search_string);
330
331 G_OBJECT_CLASS (totem_main_toolbar_parent_class)->finalize (object);
332 }
333
334 static void
totem_main_toolbar_class_init(TotemMainToolbarClass * klass)335 totem_main_toolbar_class_init (TotemMainToolbarClass *klass)
336 {
337 GObjectClass *object_class = G_OBJECT_CLASS (klass);
338 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
339
340 object_class->finalize = totem_main_toolbar_finalize;
341 object_class->set_property = totem_main_toolbar_set_property;
342 object_class->get_property = totem_main_toolbar_get_property;
343
344 g_object_class_install_property (object_class,
345 PROP_TITLE,
346 g_param_spec_string ("title",
347 "Title",
348 "The title",
349 NULL,
350 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
351
352 g_object_class_install_property (object_class,
353 PROP_SUBTITLE,
354 g_param_spec_string ("subtitle",
355 "Subtitle",
356 "The subtitle",
357 NULL,
358 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
359
360 g_object_class_install_property (object_class,
361 PROP_SEARCH_STRING,
362 g_param_spec_string ("search-string",
363 "Search String",
364 "The search string used in search mode",
365 NULL,
366 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
367
368 g_object_class_install_property (object_class,
369 PROP_N_SELECTED,
370 g_param_spec_uint ("n-selected",
371 "Number of Selected Items",
372 "The number of selected items",
373 0,
374 G_MAXUINT,
375 0,
376 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
377
378 g_object_class_install_property (object_class,
379 PROP_SEARCH_MODE,
380 g_param_spec_boolean ("search-mode",
381 "Search Mode",
382 "Whether the header bar is in search mode",
383 FALSE,
384 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
385
386 g_object_class_install_property (object_class,
387 PROP_SHOW_SEARCH_BUTTON,
388 g_param_spec_boolean ("show-search-button",
389 "Show Search Button",
390 "Whether the search button is visible",
391 FALSE,
392 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
393
394 g_object_class_install_property (object_class,
395 PROP_SELECT_MODE,
396 g_param_spec_boolean ("select-mode",
397 "Select Mode",
398 "Whether the header bar is in select mode",
399 FALSE,
400 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
401
402 g_object_class_install_property (object_class,
403 PROP_SHOW_SELECT_BUTTON,
404 g_param_spec_boolean ("show-select-button",
405 "Show Select Button",
406 "Whether the select button is visible",
407 FALSE,
408 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
409
410 g_object_class_install_property (object_class,
411 PROP_SHOW_BACK_BUTTON,
412 g_param_spec_boolean ("show-back-button",
413 "Show Back Button",
414 "Whether the back button is visible",
415 FALSE,
416 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
417
418 g_object_class_install_property (object_class,
419 PROP_CUSTOM_TITLE,
420 g_param_spec_object ("custom-title",
421 "Custom Title",
422 "Custom title widget to display",
423 GTK_TYPE_WIDGET,
424 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
425
426 g_object_class_install_property (object_class,
427 PROP_SELECT_MENU_MODEL,
428 g_param_spec_object ("select-menu-model",
429 "menu-model",
430 "The selection dropdown menu's model.",
431 G_TYPE_MENU_MODEL,
432 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
433
434 g_signal_new ("back-clicked",
435 G_OBJECT_CLASS_TYPE (klass),
436 0,
437 0,
438 NULL, NULL,
439 g_cclosure_marshal_generic,
440 G_TYPE_NONE, 0, G_TYPE_NONE);
441
442 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/totem/grilo/totemmaintoolbar.ui");
443 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, search_button);
444 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, select_button);
445 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, selection_menu_button);
446 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, done_button);
447 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, back_button);
448 gtk_widget_class_bind_template_child_private (widget_class, TotemMainToolbar, stack);
449 }
450
451 static GtkWidget *
create_title_box(const char * title,const char * subtitle,GtkWidget ** ret_title_label,GtkWidget ** ret_subtitle_label)452 create_title_box (const char *title,
453 const char *subtitle,
454 GtkWidget **ret_title_label,
455 GtkWidget **ret_subtitle_label)
456 {
457 GtkWidget *label_box;
458
459 GtkWidget *title_label;
460 GtkWidget *subtitle_label;
461 GtkStyleContext *context;
462
463 label_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
464 gtk_widget_set_valign (label_box, GTK_ALIGN_CENTER);
465 gtk_widget_show (label_box);
466
467 title_label = gtk_label_new (title);
468 context = gtk_widget_get_style_context (title_label);
469 gtk_style_context_add_class (context, "title");
470 gtk_label_set_line_wrap (GTK_LABEL (title_label), FALSE);
471 gtk_label_set_single_line_mode (GTK_LABEL (title_label), TRUE);
472 gtk_label_set_ellipsize (GTK_LABEL (title_label), PANGO_ELLIPSIZE_END);
473 gtk_box_pack_start (GTK_BOX (label_box), title_label, FALSE, FALSE, 0);
474 gtk_widget_show (title_label);
475
476 subtitle_label = gtk_label_new (subtitle);
477 context = gtk_widget_get_style_context (subtitle_label);
478 gtk_style_context_add_class (context, "subtitle");
479 gtk_style_context_add_class (context, "dim-label");
480 gtk_label_set_line_wrap (GTK_LABEL (subtitle_label), FALSE);
481 gtk_label_set_single_line_mode (GTK_LABEL (subtitle_label), TRUE);
482 gtk_label_set_ellipsize (GTK_LABEL (subtitle_label), PANGO_ELLIPSIZE_END);
483 gtk_box_pack_start (GTK_BOX (label_box), subtitle_label, FALSE, FALSE, 0);
484 gtk_widget_set_no_show_all (subtitle_label, TRUE);
485
486 if (ret_title_label)
487 *ret_title_label = title_label;
488 if (ret_subtitle_label)
489 *ret_subtitle_label = subtitle_label;
490
491 return label_box;
492 }
493
494
495 static void
totem_main_toolbar_init(TotemMainToolbar * bar)496 totem_main_toolbar_init (TotemMainToolbar *bar)
497 {
498 GtkWidget *title_widget;
499
500 bar->priv = totem_main_toolbar_get_instance_private (bar);
501
502 gtk_widget_init_template (GTK_WIDGET (bar));
503
504 gtk_widget_set_no_show_all (bar->priv->search_button, TRUE);
505 gtk_widget_set_no_show_all (bar->priv->select_button, TRUE);
506
507 /* Back button */
508 g_signal_connect (G_OBJECT (bar->priv->back_button), "clicked",
509 G_CALLBACK (back_button_clicked_cb), bar);
510
511 /* Titles */
512 title_widget = create_title_box ("", "", &bar->priv->title_label, &bar->priv->subtitle_label);
513 gtk_stack_add_named (GTK_STACK (bar->priv->stack), title_widget, DEFAULT_PAGE);
514 /* Custom title page will be added as needed in _set_custom_title() */
515
516 title_widget = create_title_box ("Results", NULL, &bar->priv->search_results_label, NULL);
517 gtk_stack_add_named (GTK_STACK (bar->priv->stack), title_widget, SEARCH_RESULTS_PAGE);
518 /* The drop-down is added using _set_select_menu_model() */
519
520 /* Select and Search buttons */
521 g_signal_connect (G_OBJECT (bar->priv->done_button), "clicked",
522 G_CALLBACK (done_button_clicked_cb), bar);
523 g_object_bind_property (bar->priv->search_button, "active",
524 bar, "search-mode", 0);
525 g_object_bind_property (bar->priv->select_button, "active",
526 bar, "select-mode", 0);
527 };
528
529 /**
530 * totem_main_toolbar_new:
531 *
532 * Creates a #TotemMainToolbar.
533 *
534 * Return value: a new #TotemMainToolbar
535 *
536 * Since: 3.10
537 **/
538 GtkWidget *
totem_main_toolbar_new(void)539 totem_main_toolbar_new (void)
540 {
541 return GTK_WIDGET (g_object_new (TOTEM_TYPE_MAIN_TOOLBAR, NULL));
542 }
543
544 /**
545 * totem_main_toolbar_set_search_mode:
546 * @bar: a #TotemMainToolbar
547 * @search_mode: Whether the search mode is on or off.
548 *
549 * Sets the new search mode toggling the search button on or
550 * off as needed.
551 *
552 * Since: 3.10
553 **/
554 void
totem_main_toolbar_set_search_mode(TotemMainToolbar * bar,gboolean search_mode)555 totem_main_toolbar_set_search_mode (TotemMainToolbar *bar,
556 gboolean search_mode)
557 {
558 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
559
560 if (bar->priv->search_mode == search_mode)
561 return;
562
563 bar->priv->search_mode = search_mode;
564 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bar->priv->search_button),
565 bar->priv->search_mode);
566 update_toolbar_state (bar);
567 if (search_mode == FALSE)
568 totem_main_toolbar_set_search_string (bar, "");
569 g_object_notify (G_OBJECT (bar), "search-mode");
570 }
571
572 gboolean
totem_main_toolbar_get_search_mode(TotemMainToolbar * bar)573 totem_main_toolbar_get_search_mode (TotemMainToolbar *bar)
574 {
575 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), FALSE);
576
577 return bar->priv->search_mode;
578 }
579
580 void
totem_main_toolbar_set_select_mode(TotemMainToolbar * bar,gboolean select_mode)581 totem_main_toolbar_set_select_mode (TotemMainToolbar *bar,
582 gboolean select_mode)
583 {
584 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
585
586 if (bar->priv->select_mode == select_mode)
587 return;
588
589 bar->priv->select_mode = select_mode;
590 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bar->priv->select_button),
591 bar->priv->select_mode);
592 update_toolbar_state (bar);
593 g_object_notify (G_OBJECT (bar), "select-mode");
594 }
595
596 gboolean
totem_main_toolbar_get_select_mode(TotemMainToolbar * bar)597 totem_main_toolbar_get_select_mode (TotemMainToolbar *bar)
598 {
599 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), FALSE);
600
601 return bar->priv->select_mode;
602 }
603
604 void
totem_main_toolbar_set_title(TotemMainToolbar * bar,const char * title)605 totem_main_toolbar_set_title (TotemMainToolbar *bar,
606 const char *title)
607 {
608 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
609
610 gtk_label_set_text (GTK_LABEL (bar->priv->title_label), title);
611 gtk_header_bar_set_title (GTK_HEADER_BAR (bar), title);
612 }
613
614 const char *
totem_main_toolbar_get_title(TotemMainToolbar * bar)615 totem_main_toolbar_get_title (TotemMainToolbar *bar)
616 {
617 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), NULL);
618
619 return gtk_header_bar_get_title (GTK_HEADER_BAR (bar));
620 }
621
622 void
totem_main_toolbar_set_subtitle(TotemMainToolbar * bar,const char * subtitle)623 totem_main_toolbar_set_subtitle (TotemMainToolbar *bar,
624 const char *subtitle)
625 {
626 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
627
628 gtk_label_set_text (GTK_LABEL (bar->priv->subtitle_label), subtitle);
629 gtk_header_bar_set_subtitle (GTK_HEADER_BAR (bar), subtitle);
630 }
631
632 const char *
totem_main_toolbar_get_subtitle(TotemMainToolbar * bar)633 totem_main_toolbar_get_subtitle (TotemMainToolbar *bar)
634 {
635 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), NULL);
636
637 return gtk_header_bar_get_subtitle (GTK_HEADER_BAR (bar));
638 }
639
640 void
totem_main_toolbar_set_search_string(TotemMainToolbar * bar,const char * search_string)641 totem_main_toolbar_set_search_string (TotemMainToolbar *bar,
642 const char *search_string)
643 {
644 char *tmp;
645
646 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
647
648 tmp = bar->priv->search_string;
649 bar->priv->search_string = g_strdup (search_string);
650 g_free (tmp);
651
652 update_toolbar_state (bar);
653 g_object_notify (G_OBJECT (bar), "search-string");
654 }
655
656 const char *
totem_main_toolbar_get_search_string(TotemMainToolbar * bar)657 totem_main_toolbar_get_search_string (TotemMainToolbar *bar)
658 {
659 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), NULL);
660
661 return bar->priv->search_string;
662 }
663
664 void
totem_main_toolbar_set_n_selected(TotemMainToolbar * bar,guint n_selected)665 totem_main_toolbar_set_n_selected (TotemMainToolbar *bar,
666 guint n_selected)
667 {
668 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
669
670 if (bar->priv->n_selected == n_selected)
671 return;
672
673 bar->priv->n_selected = n_selected;
674
675 update_toolbar_state (bar);
676 g_object_notify (G_OBJECT (bar), "n-selected");
677 }
678
679 guint
totem_main_toolbar_get_n_selected(TotemMainToolbar * bar)680 totem_main_toolbar_get_n_selected (TotemMainToolbar *bar)
681 {
682 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), 0);
683
684 return bar->priv->n_selected;
685 }
686
687 void
totem_main_toolbar_pack_start(TotemMainToolbar * bar,GtkWidget * child)688 totem_main_toolbar_pack_start (TotemMainToolbar *bar,
689 GtkWidget *child)
690 {
691 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
692
693 gtk_header_bar_pack_start (GTK_HEADER_BAR (bar), child);
694 }
695
696 void
totem_main_toolbar_pack_end(TotemMainToolbar * bar,GtkWidget * child)697 totem_main_toolbar_pack_end (TotemMainToolbar *bar,
698 GtkWidget *child)
699 {
700 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
701
702 gtk_header_bar_pack_end (GTK_HEADER_BAR (bar), child);
703 }
704
705 void
totem_main_toolbar_set_select_menu_model(TotemMainToolbar * bar,GMenuModel * model)706 totem_main_toolbar_set_select_menu_model (TotemMainToolbar *bar,
707 GMenuModel *model)
708 {
709 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
710
711 gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (bar->priv->selection_menu_button), model);
712 }
713
714 GMenuModel *
totem_main_toolbar_get_select_menu_model(TotemMainToolbar * bar)715 totem_main_toolbar_get_select_menu_model (TotemMainToolbar *bar)
716 {
717 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), NULL);
718
719 return gtk_menu_button_get_menu_model (GTK_MENU_BUTTON (bar->priv->selection_menu_button));
720 }
721
722 void
totem_main_toolbar_set_custom_title(TotemMainToolbar * bar,GtkWidget * title_widget)723 totem_main_toolbar_set_custom_title (TotemMainToolbar *bar,
724 GtkWidget *title_widget)
725 {
726 TotemMainToolbarPrivate *priv;
727
728 g_return_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar));
729 if (title_widget)
730 g_return_if_fail (GTK_IS_WIDGET (title_widget));
731
732 priv = bar->priv;
733
734 /* No need to do anything if the custom widget stays the same */
735 if (priv->custom_title == title_widget)
736 return;
737
738 if (priv->custom_title)
739 {
740 GtkWidget *custom = priv->custom_title;
741
742 priv->custom_title = NULL;
743 gtk_container_remove (GTK_CONTAINER (bar->priv->stack), custom);
744 }
745
746 if (title_widget != NULL)
747 {
748 priv->custom_title = title_widget;
749
750 gtk_stack_add_named (GTK_STACK (bar->priv->stack), title_widget, CUSTOM_TITLE_PAGE);
751 gtk_widget_show (title_widget);
752
753 update_toolbar_state (bar);
754 }
755 else
756 {
757 gtk_stack_set_visible_child_name (GTK_STACK (bar->priv->stack), DEFAULT_PAGE);
758 }
759
760 g_object_notify (G_OBJECT (bar), "custom-title");
761 }
762
763 GtkWidget *
totem_main_toolbar_get_custom_title(TotemMainToolbar * bar)764 totem_main_toolbar_get_custom_title (TotemMainToolbar *bar)
765 {
766 g_return_val_if_fail (TOTEM_IS_MAIN_TOOLBAR (bar), NULL);
767
768 return bar->priv->custom_title;
769 }
770