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