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