1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 
3 /*
4  * Nemo
5  *
6  * Copyright (C) 2011, Red Hat, Inc.
7  *
8  * Nemo is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of the
11  * License, or (at your option) any later version.
12  *
13  * Nemo is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Suite 500, MA 02110-1335, USA.
21  *
22  * Author: Cosimo Cecchi <cosimoc@redhat.com>
23  *
24  */
25 
26 #include <config.h>
27 
28 #include "nemo-toolbar.h"
29 
30 #include "nemo-location-bar.h"
31 #include "nemo-pathbar.h"
32 #include "nemo-window-private.h"
33 #include "nemo-actions.h"
34 #include <glib/gi18n.h>
35 #include <libnemo-private/nemo-global-preferences.h>
36 #include <libnemo-private/nemo-ui-utilities.h>
37 
38 struct _NemoToolbarPriv {
39 	GtkWidget *toolbar;
40 
41 	GtkActionGroup *action_group;
42 	GtkUIManager *ui_manager;
43 
44     GtkWidget *previous_button;
45     GtkWidget *next_button;
46     GtkWidget *up_button;
47     GtkWidget *refresh_button;
48     GtkWidget *home_button;
49     GtkWidget *computer_button;
50     GtkWidget *toggle_location_button;
51     GtkWidget *open_terminal_button;
52     GtkWidget *new_folder_button;
53     GtkWidget *search_button;
54     GtkWidget *icon_view_button;
55     GtkWidget *list_view_button;
56     GtkWidget *compact_view_button;
57     GtkWidget *show_thumbnails_button;
58 
59     GtkToolItem *navigation_box;
60     GtkToolItem *refresh_box;
61     GtkToolItem *location_box;
62     GtkToolItem *tools_box;
63     GtkToolItem *view_box;
64 
65 	GtkWidget *path_bar;
66 	GtkWidget *location_bar;
67     GtkWidget *root_bar;
68     GtkWidget *stack;
69 
70 	gboolean show_main_bar;
71 	gboolean show_location_entry;
72     gboolean show_root_bar;
73 };
74 
75 enum {
76 	PROP_ACTION_GROUP = 1,
77 	PROP_SHOW_LOCATION_ENTRY,
78 	PROP_SHOW_MAIN_BAR,
79 	NUM_PROPERTIES
80 };
81 
82 static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
83 
84 G_DEFINE_TYPE (NemoToolbar, nemo_toolbar, GTK_TYPE_BOX);
85 
86 static void
nemo_toolbar_update_root_state(NemoToolbar * self)87 nemo_toolbar_update_root_state (NemoToolbar *self)
88 {
89     if (geteuid() == 0 && g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_ROOT_WARNING)) {
90         if (self->priv->show_root_bar != TRUE) {
91             self->priv->show_root_bar = TRUE;
92         }
93     } else {
94         self->priv->show_root_bar = FALSE;
95     }
96 }
97 
98 static void
toolbar_update_appearance(NemoToolbar * self)99 toolbar_update_appearance (NemoToolbar *self)
100 {
101 	GtkWidget *widgetitem;
102 	gboolean icon_toolbar;
103 	gboolean show_location_entry;
104 
105     nemo_toolbar_update_root_state (self);
106 
107 	show_location_entry = self->priv->show_location_entry;
108 
109 	gtk_widget_set_visible (GTK_WIDGET(self->priv->toolbar),
110 				self->priv->show_main_bar);
111 
112     if (show_location_entry) {
113         gtk_stack_set_visible_child_name (GTK_STACK (self->priv->stack), "location_bar");
114     } else {
115         gtk_stack_set_visible_child_name (GTK_STACK (self->priv->stack), "path_bar");
116     }
117 
118     gtk_widget_set_visible (self->priv->root_bar,
119                 self->priv->show_root_bar);
120 
121         /* Please refer to the element name, not the action name after the forward slash, otherwise the prefs will not work*/
122 
123     widgetitem = self->priv->previous_button;
124     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_PREVIOUS_ICON_TOOLBAR);
125     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
126     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
127 
128     widgetitem = self->priv->next_button;
129     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_NEXT_ICON_TOOLBAR);
130     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
131     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
132 
133     widgetitem = self->priv->up_button;
134     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_UP_ICON_TOOLBAR);
135     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
136     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
137 
138     widgetitem = self->priv->refresh_button;
139     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_RELOAD_ICON_TOOLBAR);
140     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
141     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
142 
143     widgetitem = self->priv->home_button;
144     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_HOME_ICON_TOOLBAR);
145     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
146     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
147 
148     widgetitem = self->priv->computer_button;
149     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_COMPUTER_ICON_TOOLBAR);
150     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
151     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
152 
153     widgetitem = self->priv->search_button;
154     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_SEARCH_ICON_TOOLBAR);
155     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
156     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
157 
158     widgetitem = self->priv->new_folder_button;
159     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_NEW_FOLDER_ICON_TOOLBAR);
160     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
161     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
162 
163     widgetitem = self->priv->open_terminal_button;
164     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_OPEN_IN_TERMINAL_TOOLBAR);
165     if (icon_toolbar == FALSE ) {gtk_widget_hide (widgetitem); }
166     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
167 
168     widgetitem = self->priv->toggle_location_button;
169     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_EDIT_ICON_TOOLBAR);
170     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
171     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
172 
173     widgetitem = self->priv->icon_view_button;
174     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_ICON_VIEW_ICON_TOOLBAR);
175     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
176     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
177 
178     widgetitem = self->priv->list_view_button;
179     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_LIST_VIEW_ICON_TOOLBAR);
180     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
181     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
182 
183     widgetitem = self->priv->compact_view_button;
184     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_COMPACT_VIEW_ICON_TOOLBAR);
185     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
186     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
187 
188     widgetitem = self->priv->show_thumbnails_button;
189     icon_toolbar = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_SHOW_THUMBNAILS_TOOLBAR);
190     if ( icon_toolbar == FALSE ) { gtk_widget_hide (widgetitem); }
191     else {gtk_widget_show (GTK_WIDGET(widgetitem));}
192 
193     if (gtk_widget_get_visible(self->priv->previous_button) == FALSE &&
194         gtk_widget_get_visible(self->priv->next_button) == FALSE &&
195         gtk_widget_get_visible(self->priv->up_button) == FALSE)
196     {
197         gtk_widget_hide(GTK_WIDGET (self->priv->navigation_box));
198     } else {
199         gtk_widget_show(GTK_WIDGET (self->priv->navigation_box));
200     }
201 
202     if (gtk_widget_get_visible(self->priv->home_button) == FALSE &&
203         gtk_widget_get_visible(self->priv->computer_button) == FALSE)
204     {
205         gtk_widget_hide(GTK_WIDGET (self->priv->location_box));
206     } else {
207         gtk_widget_show(GTK_WIDGET (self->priv->location_box));
208     }
209 
210     if (gtk_widget_get_visible(self->priv->refresh_button) == FALSE)
211     {
212         gtk_widget_hide(GTK_WIDGET (self->priv->refresh_box));
213     } else {
214         gtk_widget_show(GTK_WIDGET (self->priv->refresh_box));
215     }
216 
217     if (gtk_widget_get_visible(self->priv->search_button) == FALSE &&
218         gtk_widget_get_visible(self->priv->new_folder_button) == FALSE &&
219         gtk_widget_get_visible(self->priv->open_terminal_button) == FALSE &&
220         gtk_widget_get_visible(self->priv->toggle_location_button) == FALSE &&
221         gtk_widget_get_visible(self->priv->show_thumbnails_button) == FALSE)
222     {
223         gtk_widget_hide(GTK_WIDGET (self->priv->tools_box));
224     } else {
225         gtk_widget_show(GTK_WIDGET (self->priv->tools_box));
226     }
227 
228     if (gtk_widget_get_visible(self->priv->icon_view_button) == FALSE &&
229         gtk_widget_get_visible(self->priv->list_view_button) == FALSE &&
230         gtk_widget_get_visible(self->priv->compact_view_button) == FALSE)
231     {
232         gtk_widget_hide(GTK_WIDGET (self->priv->view_box));
233     } else {
234         gtk_widget_show(GTK_WIDGET (self->priv->view_box));
235     }
236 }
237 
238 static void
setup_root_info_bar(NemoToolbar * self)239 setup_root_info_bar (NemoToolbar *self) {
240 
241     GtkWidget *root_bar = gtk_info_bar_new ();
242     gtk_info_bar_set_message_type (GTK_INFO_BAR (root_bar), GTK_MESSAGE_ERROR);
243     GtkWidget *content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (root_bar));
244 
245     GtkWidget *label = gtk_label_new (_("Elevated Privileges"));
246     gtk_widget_show (label);
247     gtk_container_add (GTK_CONTAINER (content_area), label);
248 
249     self->priv->root_bar = root_bar;
250     gtk_box_pack_start (GTK_BOX (self), self->priv->root_bar, TRUE, TRUE, 0);
251 }
252 
253 static GtkWidget *
toolbar_create_toolbutton(NemoToolbar * self,gboolean create_toggle,const gchar * name)254 toolbar_create_toolbutton (NemoToolbar *self,
255                 gboolean create_toggle,
256                 const gchar *name)
257 {
258     GtkWidget *button;
259     GtkWidget *image;
260     GtkAction *action;
261 
262     if (create_toggle)
263     {
264         button = gtk_toggle_button_new ();
265     } else {
266         button = gtk_button_new ();
267     }
268 
269     image = gtk_image_new ();
270 
271     gtk_button_set_image (GTK_BUTTON (button), image);
272     action = gtk_action_group_get_action (self->priv->action_group, name);
273     gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action);
274     gtk_button_set_label (GTK_BUTTON (button), NULL);
275     gtk_widget_set_tooltip_text (button, gtk_action_get_tooltip (action));
276 
277     return button;
278 }
279 
280 static void
nemo_toolbar_constructed(GObject * obj)281 nemo_toolbar_constructed (GObject *obj)
282 {
283 	NemoToolbar *self = NEMO_TOOLBAR (obj);
284 	GtkWidget *toolbar;
285     GtkWidget *hbox;
286     GtkToolItem *tool_box;
287     GtkWidget *box;
288 	GtkStyleContext *context;
289 
290 	G_OBJECT_CLASS (nemo_toolbar_parent_class)->constructed (obj);
291 
292 	gtk_style_context_set_junction_sides (gtk_widget_get_style_context (GTK_WIDGET (self)),
293 					      GTK_JUNCTION_BOTTOM);
294 
295     self->priv->show_location_entry = g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_SHOW_LOCATION_ENTRY);
296 
297 	/* add the UI */
298 	self->priv->ui_manager = gtk_ui_manager_new ();
299 	gtk_ui_manager_insert_action_group (self->priv->ui_manager, self->priv->action_group, 0);
300 
301 	toolbar = gtk_toolbar_new ();
302 	self->priv->toolbar = toolbar;
303     gtk_box_pack_start (GTK_BOX (self), self->priv->toolbar, TRUE, TRUE, 0);
304 
305 	context = gtk_widget_get_style_context (GTK_WIDGET(toolbar));
306 	gtk_style_context_add_class (context, GTK_STYLE_CLASS_PRIMARY_TOOLBAR);
307 
308     /* Back/Forward/Up */
309     self->priv->navigation_box = gtk_tool_item_new ();
310     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
311 
312     self->priv->previous_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_BACK);
313     gtk_container_add (GTK_CONTAINER (box), self->priv->previous_button);
314 
315     self->priv->next_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_FORWARD);
316     gtk_container_add (GTK_CONTAINER (box), self->priv->next_button);
317 
318     self->priv->up_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_UP);
319     gtk_container_add (GTK_CONTAINER (box), self->priv->up_button);
320 
321     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
322     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
323 
324     gtk_container_add (GTK_CONTAINER (self->priv->navigation_box), GTK_WIDGET (box));
325     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (self->priv->navigation_box));
326 
327     gtk_widget_show_all (GTK_WIDGET (self->priv->navigation_box));
328     gtk_widget_set_margin_right (GTK_WIDGET (self->priv->navigation_box), 6);
329 
330     /* Refresh */
331     self->priv->refresh_box = gtk_tool_item_new ();
332     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
333 
334     self->priv->refresh_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_RELOAD);
335     gtk_container_add (GTK_CONTAINER (box), self->priv->refresh_button);
336     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
337 
338     gtk_container_add (GTK_CONTAINER (self->priv->refresh_box), GTK_WIDGET (box));
339     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (self->priv->refresh_box));
340 
341     gtk_widget_show_all (GTK_WIDGET (self->priv->refresh_box));
342     gtk_widget_set_margin_right (GTK_WIDGET (self->priv->refresh_box), 6);
343 
344     /* Home/Computer */
345     self->priv->location_box = gtk_tool_item_new ();
346     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
347 
348     self->priv->home_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_HOME);
349     gtk_container_add (GTK_CONTAINER (box), self->priv->home_button);
350 
351     self->priv->computer_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_COMPUTER);
352     gtk_container_add (GTK_CONTAINER (box), self->priv->computer_button);
353 
354     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
355     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
356 
357     gtk_container_add (GTK_CONTAINER (self->priv->location_box), GTK_WIDGET (box));
358     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (self->priv->location_box));
359 
360     gtk_widget_show_all (GTK_WIDGET (self->priv->location_box));
361     gtk_widget_set_margin_right (GTK_WIDGET (self->priv->location_box), 6);
362 
363     /* Container to hold the location and pathbars */
364     self->priv->stack = gtk_stack_new();
365     gtk_stack_set_transition_type (GTK_STACK (self->priv->stack), GTK_STACK_TRANSITION_TYPE_CROSSFADE);
366     gtk_stack_set_transition_duration (GTK_STACK (self->priv->stack), 150);
367 
368     /* Regular Path Bar */
369     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
370     gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (self->priv->stack), TRUE, TRUE, 0);
371 
372     self->priv->path_bar = g_object_new (NEMO_TYPE_PATH_BAR, NULL);
373     gtk_stack_add_named(GTK_STACK (self->priv->stack), GTK_WIDGET (self->priv->path_bar), "path_bar");
374 
375     /* Entry-Like Location Bar */
376     self->priv->location_bar = nemo_location_bar_new ();
377     gtk_stack_add_named(GTK_STACK (self->priv->stack), GTK_WIDGET (self->priv->location_bar), "location_bar");
378     gtk_widget_show_all (hbox);
379 
380     tool_box = gtk_tool_item_new ();
381     gtk_tool_item_set_expand (tool_box, TRUE);
382     gtk_container_add (GTK_CONTAINER (tool_box), hbox);
383     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (tool_box));
384     gtk_widget_show (GTK_WIDGET (tool_box));
385 
386     /* Search/Open in Terminal/New Folder/Toggle Location */
387     self->priv->tools_box = gtk_tool_item_new ();
388     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
389 
390     self->priv->toggle_location_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_TOGGLE_LOCATION);
391     gtk_container_add (GTK_CONTAINER (box), self->priv->toggle_location_button);
392 
393     self->priv->open_terminal_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_OPEN_IN_TERMINAL);
394     gtk_container_add (GTK_CONTAINER (box), self->priv->open_terminal_button);
395 
396     self->priv->new_folder_button = toolbar_create_toolbutton (self, FALSE, NEMO_ACTION_NEW_FOLDER);
397     gtk_container_add (GTK_CONTAINER (box), self->priv->new_folder_button);
398 
399     self->priv->search_button = toolbar_create_toolbutton (self, TRUE, NEMO_ACTION_SEARCH);
400     gtk_container_add (GTK_CONTAINER (box), self->priv->search_button);
401 
402     self->priv->show_thumbnails_button = toolbar_create_toolbutton (self, TRUE, NEMO_ACTION_SHOW_THUMBNAILS);
403     gtk_container_add (GTK_CONTAINER (box), self->priv->show_thumbnails_button);
404 
405     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
406     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
407 
408     gtk_container_add (GTK_CONTAINER (self->priv->tools_box), GTK_WIDGET (box));
409     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (self->priv->tools_box));
410 
411     gtk_widget_show_all (GTK_WIDGET (self->priv->tools_box));
412     gtk_widget_set_margin_left (GTK_WIDGET (self->priv->tools_box), 6);
413 
414     setup_root_info_bar (self);
415 
416     /* View Select */
417     self->priv->view_box = gtk_tool_item_new ();
418     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
419 
420     self->priv->icon_view_button = toolbar_create_toolbutton (self, TRUE, NEMO_ACTION_ICON_VIEW);
421     gtk_container_add (GTK_CONTAINER (box), self->priv->icon_view_button);
422 
423     self->priv->list_view_button = toolbar_create_toolbutton (self, TRUE, NEMO_ACTION_LIST_VIEW);
424     gtk_container_add (GTK_CONTAINER (box), self->priv->list_view_button);
425 
426     self->priv->compact_view_button = toolbar_create_toolbutton (self, TRUE, NEMO_ACTION_COMPACT_VIEW);
427     gtk_container_add (GTK_CONTAINER (box), self->priv->compact_view_button);
428 
429     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_RAISED);
430     gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LINKED);
431 
432     gtk_container_add (GTK_CONTAINER (self->priv->view_box), GTK_WIDGET (box));
433     gtk_container_add (GTK_CONTAINER (self->priv->toolbar), GTK_WIDGET (self->priv->view_box));
434 
435     gtk_widget_show_all (GTK_WIDGET (self->priv->view_box));
436     gtk_widget_set_margin_left (GTK_WIDGET (self->priv->view_box), 6);
437 
438     /* nemo patch */
439     g_signal_connect_swapped (nemo_preferences,
440                   "changed::" NEMO_PREFERENCES_SHOW_PREVIOUS_ICON_TOOLBAR,
441                   G_CALLBACK (toolbar_update_appearance), self);
442     g_signal_connect_swapped (nemo_preferences,
443                   "changed::" NEMO_PREFERENCES_SHOW_NEXT_ICON_TOOLBAR,
444                   G_CALLBACK (toolbar_update_appearance), self);
445     g_signal_connect_swapped (nemo_preferences,
446                   "changed::" NEMO_PREFERENCES_SHOW_UP_ICON_TOOLBAR,
447                   G_CALLBACK (toolbar_update_appearance), self);
448     g_signal_connect_swapped (nemo_preferences,
449                   "changed::" NEMO_PREFERENCES_SHOW_EDIT_ICON_TOOLBAR,
450                   G_CALLBACK (toolbar_update_appearance), self);
451     g_signal_connect_swapped (nemo_preferences,
452                   "changed::" NEMO_PREFERENCES_SHOW_RELOAD_ICON_TOOLBAR,
453                   G_CALLBACK (toolbar_update_appearance), self);
454     g_signal_connect_swapped (nemo_preferences,
455                   "changed::" NEMO_PREFERENCES_SHOW_HOME_ICON_TOOLBAR,
456                   G_CALLBACK (toolbar_update_appearance), self);
457     g_signal_connect_swapped (nemo_preferences,
458                   "changed::" NEMO_PREFERENCES_SHOW_COMPUTER_ICON_TOOLBAR,
459                   G_CALLBACK (toolbar_update_appearance), self);
460     g_signal_connect_swapped (nemo_preferences,
461                   "changed::" NEMO_PREFERENCES_SHOW_SEARCH_ICON_TOOLBAR,
462                   G_CALLBACK (toolbar_update_appearance), self);
463     g_signal_connect_swapped (nemo_preferences,
464                   "changed::" NEMO_PREFERENCES_SHOW_NEW_FOLDER_ICON_TOOLBAR,
465                   G_CALLBACK (toolbar_update_appearance), self);
466     g_signal_connect_swapped (nemo_preferences,
467                   "changed::" NEMO_PREFERENCES_SHOW_OPEN_IN_TERMINAL_TOOLBAR,
468                   G_CALLBACK (toolbar_update_appearance), self);
469     g_signal_connect_swapped (nemo_preferences,
470                   "changed::" NEMO_PREFERENCES_SHOW_ICON_VIEW_ICON_TOOLBAR,
471                   G_CALLBACK (toolbar_update_appearance), self);
472     g_signal_connect_swapped (nemo_preferences,
473                   "changed::" NEMO_PREFERENCES_SHOW_LIST_VIEW_ICON_TOOLBAR,
474                   G_CALLBACK (toolbar_update_appearance), self);
475     g_signal_connect_swapped (nemo_preferences,
476                   "changed::" NEMO_PREFERENCES_SHOW_COMPACT_VIEW_ICON_TOOLBAR,
477                   G_CALLBACK (toolbar_update_appearance), self);
478     g_signal_connect_swapped (nemo_preferences,
479                   "changed::" NEMO_PREFERENCES_SHOW_SHOW_THUMBNAILS_TOOLBAR,
480                   G_CALLBACK (toolbar_update_appearance), self);
481     g_signal_connect_swapped (nemo_preferences,
482                   "changed::" NEMO_PREFERENCES_SHOW_IMAGE_FILE_THUMBNAILS,
483                   G_CALLBACK (toolbar_update_appearance), self);
484 
485 	toolbar_update_appearance (self);
486 }
487 
488 static void
nemo_toolbar_init(NemoToolbar * self)489 nemo_toolbar_init (NemoToolbar *self)
490 {
491 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NEMO_TYPE_TOOLBAR,
492 						  NemoToolbarPriv);
493 	self->priv->show_main_bar = TRUE;
494 }
495 
496 static void
nemo_toolbar_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)497 nemo_toolbar_get_property (GObject *object,
498 			       guint property_id,
499 			       GValue *value,
500 			       GParamSpec *pspec)
501 {
502 	NemoToolbar *self = NEMO_TOOLBAR (object);
503 
504 	switch (property_id) {
505 	case PROP_SHOW_LOCATION_ENTRY:
506 		g_value_set_boolean (value, self->priv->show_location_entry);
507 		break;
508 	case PROP_SHOW_MAIN_BAR:
509 		g_value_set_boolean (value, self->priv->show_main_bar);
510 		break;
511 	default:
512 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
513 		break;
514 	}
515 }
516 
517 static void
nemo_toolbar_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)518 nemo_toolbar_set_property (GObject *object,
519 			       guint property_id,
520 			       const GValue *value,
521 			       GParamSpec *pspec)
522 {
523 	NemoToolbar *self = NEMO_TOOLBAR (object);
524 
525 	switch (property_id) {
526 	case PROP_ACTION_GROUP:
527 		self->priv->action_group = g_value_dup_object (value);
528 		break;
529 	case PROP_SHOW_LOCATION_ENTRY:
530 		nemo_toolbar_set_show_location_entry (self, g_value_get_boolean (value));
531 		break;
532 	case PROP_SHOW_MAIN_BAR:
533 		nemo_toolbar_set_show_main_bar (self, g_value_get_boolean (value));
534 		break;
535 	default:
536 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
537 		break;
538 	}
539 }
540 
541 static void
nemo_toolbar_dispose(GObject * obj)542 nemo_toolbar_dispose (GObject *obj)
543 {
544 	NemoToolbar *self = NEMO_TOOLBAR (obj);
545 
546 	g_clear_object (&self->priv->action_group);
547 
548 	g_signal_handlers_disconnect_by_func (nemo_preferences,
549 					      toolbar_update_appearance, self);
550 
551 	G_OBJECT_CLASS (nemo_toolbar_parent_class)->dispose (obj);
552 }
553 
554 static void
nemo_toolbar_class_init(NemoToolbarClass * klass)555 nemo_toolbar_class_init (NemoToolbarClass *klass)
556 {
557 	GObjectClass *oclass;
558 
559 	oclass = G_OBJECT_CLASS (klass);
560 	oclass->get_property = nemo_toolbar_get_property;
561 	oclass->set_property = nemo_toolbar_set_property;
562 	oclass->constructed = nemo_toolbar_constructed;
563 	oclass->dispose = nemo_toolbar_dispose;
564 
565 	properties[PROP_ACTION_GROUP] =
566 		g_param_spec_object ("action-group",
567 				     "The action group",
568 				     "The action group to get actions from",
569 				     GTK_TYPE_ACTION_GROUP,
570 				     G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
571 				     G_PARAM_STATIC_STRINGS);
572 	properties[PROP_SHOW_LOCATION_ENTRY] =
573 		g_param_spec_boolean ("show-location-entry",
574 				      "Whether to show the location entry",
575 				      "Whether to show the location entry instead of the pathbar",
576 				      FALSE,
577 				      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
578 	properties[PROP_SHOW_MAIN_BAR] =
579 		g_param_spec_boolean ("show-main-bar",
580 				      "Whether to show the main bar",
581 				      "Whether to show the main toolbar",
582 				      TRUE,
583 				      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
584 
585 	g_type_class_add_private (klass, sizeof (NemoToolbarClass));
586 	g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
587 }
588 
589 GtkWidget *
nemo_toolbar_new(GtkActionGroup * action_group)590 nemo_toolbar_new (GtkActionGroup *action_group)
591 {
592 	return g_object_new (NEMO_TYPE_TOOLBAR,
593 			     "action-group", action_group,
594 			     "orientation", GTK_ORIENTATION_VERTICAL,
595 			     NULL);
596 }
597 
598 GtkWidget *
nemo_toolbar_get_path_bar(NemoToolbar * self)599 nemo_toolbar_get_path_bar (NemoToolbar *self)
600 {
601 	return self->priv->path_bar;
602 }
603 
604 GtkWidget *
nemo_toolbar_get_location_bar(NemoToolbar * self)605 nemo_toolbar_get_location_bar (NemoToolbar *self)
606 {
607 	return self->priv->location_bar;
608 }
609 
610 gboolean
nemo_toolbar_get_show_location_entry(NemoToolbar * self)611 nemo_toolbar_get_show_location_entry (NemoToolbar *self)
612 {
613 	return self->priv->show_location_entry;
614 }
615 
616 void
nemo_toolbar_set_show_main_bar(NemoToolbar * self,gboolean show_main_bar)617 nemo_toolbar_set_show_main_bar (NemoToolbar *self,
618 				    gboolean show_main_bar)
619 {
620 	if (show_main_bar != self->priv->show_main_bar) {
621 		self->priv->show_main_bar = show_main_bar;
622 		toolbar_update_appearance (self);
623 
624 		g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_MAIN_BAR]);
625 	}
626 }
627 
628 void
nemo_toolbar_set_show_location_entry(NemoToolbar * self,gboolean show_location_entry)629 nemo_toolbar_set_show_location_entry (NemoToolbar *self,
630 					  gboolean show_location_entry)
631 {
632 	if (show_location_entry != self->priv->show_location_entry) {
633 		self->priv->show_location_entry = show_location_entry;
634 		toolbar_update_appearance (self);
635 
636 		g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_LOCATION_ENTRY]);
637 	}
638 }
639