[nautilus/wip/gbsneto/view-menu] toolbar: bind the window slot icon to view button



commit b1c306e57e147b5d9a721ef52c5ef951b7a946c4
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Aug 11 14:55:43 2015 -0300

    toolbar: bind the window slot icon to view button
    
    NautilusWindowSlot currently performs a check on the
    window action state in order to determine the correct
    icon for the view button.
    
    Since we're trying to isolate the view, hardcoded checks
    agains the action state should be avoided.
    
    Fix that by binding the newly added NautilusWindowSlot::icon
    property to the view button's icon.

 src/nautilus-toolbar-ui.xml |    6 ++++
 src/nautilus-toolbar.c      |   61 ++++++++++++++++++++++++-------------------
 src/nautilus-toolbar.h      |    4 +++
 src/nautilus-window.c       |    2 +
 4 files changed, 46 insertions(+), 27 deletions(-)
---
diff --git a/src/nautilus-toolbar-ui.xml b/src/nautilus-toolbar-ui.xml
index a417667..52d5d63 100644
--- a/src/nautilus-toolbar-ui.xml
+++ b/src/nautilus-toolbar-ui.xml
@@ -104,6 +104,12 @@
         <style>
           <class name="image-button"/>
         </style>
+        <child>
+          <object class="GtkImage" id="view_icon">
+            <property name="visible">True</property>
+            <property name="icon-size">1</property>
+          </object>
+        </child>
         <child internal-child="accessible">
           <object class="AtkObject">
             <property name="accessible-name" translatable="yes">View menu</property>
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 3e33d28..3607c90 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -72,6 +72,7 @@ struct _NautilusToolbarPrivate {
         GtkWidget *operations_revealer;
         GtkWidget *operations_icon;
        GtkWidget *view_menu_widget;
+        GtkWidget *view_icon;
        GtkWidget *sort_menu;
        GtkWidget *sort_trash_time;
        GtkWidget *sort_search_relevance;
@@ -86,6 +87,10 @@ struct _NautilusToolbarPrivate {
        GtkWidget *back_button;
 
         NautilusProgressInfoManager *progress_manager;
+
+        /* active slot & bindings */
+        NautilusWindowSlot *active_slot;
+        GBinding *icon_binding;
 };
 
 enum {
@@ -263,31 +268,6 @@ show_menu (NautilusToolbar *self,
 }
 
 static void
-action_view_mode_state_changed (GActionGroup *action_group,
-                               gchar *action_name,
-                               GVariant *value,
-                               gpointer user_data)
-{
-       NautilusToolbar *self = user_data;
-       const gchar *view_mode = g_variant_get_string (value, NULL);
-       const gchar *name;
-       GtkWidget *image;
-
-       if (g_strcmp0 (view_mode, "list") == 0) {
-               name = "view-list-symbolic";
-       } else if (g_strcmp0 (view_mode, "grid") == 0) {
-               name = "view-grid-symbolic";
-       } else {
-               g_assert_not_reached ();
-       }
-
-       image = gtk_image_new ();
-       gtk_button_set_image (GTK_BUTTON (self->priv->view_button), image);
-       gtk_image_set_from_icon_name (GTK_IMAGE (image), name,
-                                     GTK_ICON_SIZE_MENU);
-}
-
-static void
 action_reload_enabled_changed (GActionGroup *action_group,
                               gchar *action_name,
                               gboolean enabled,
@@ -318,8 +298,6 @@ nautilus_toolbar_set_window (NautilusToolbar *self,
                          G_CALLBACK (action_stop_enabled_changed), self);
        g_signal_connect (self->priv->window, "action-enabled-changed::reload",
                          G_CALLBACK (action_reload_enabled_changed), self);
-       g_signal_connect (self->priv->window, "action-state-changed::view-mode",
-                         G_CALLBACK (action_view_mode_state_changed), self);
 }
 
 #define MENU_POPUP_TIMEOUT 1200
@@ -901,6 +879,7 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_container);
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, operations_revealer);
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_button);
+        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, view_icon);
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, action_button);
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, path_bar_container);
        gtk_widget_class_bind_template_child_private (widget_class, NautilusToolbar, 
location_entry_container);
@@ -1000,3 +979,31 @@ nautilus_toolbar_set_show_location_entry (NautilusToolbar *self,
                g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_LOCATION_ENTRY]);
        }
 }
+
+void
+nautilus_toolbar_set_active_slot (NautilusToolbar    *toolbar,
+                                  NautilusWindowSlot *slot)
+{
+        g_return_if_fail (NAUTILUS_IS_TOOLBAR (toolbar));
+
+        if (toolbar->priv->icon_binding) {
+                g_clear_pointer (&toolbar->priv->icon_binding, g_binding_unbind);
+        }
+
+        if (toolbar->priv->active_slot != slot) {
+                toolbar->priv->active_slot = slot;
+
+                if (slot) {
+                        GIcon *icon;
+
+                        icon = nautilus_window_slot_get_icon (slot);
+
+                        gtk_image_set_from_gicon (GTK_IMAGE (toolbar->priv->view_icon), icon, 
GTK_ICON_SIZE_BUTTON);
+
+                        toolbar->priv->icon_binding = g_object_bind_property (slot, "icon",
+                                                                              toolbar->priv->view_icon, 
"gicon",
+                                                                              G_BINDING_DEFAULT);
+                }
+
+        }
+}
diff --git a/src/nautilus-toolbar.h b/src/nautilus-toolbar.h
index f281b95..9f0b3ea 100644
--- a/src/nautilus-toolbar.h
+++ b/src/nautilus-toolbar.h
@@ -27,6 +27,7 @@
 
 #include <gtk/gtk.h>
 
+#include "nautilus-window-slot.h"
 
 #define NAUTILUS_TYPE_TOOLBAR nautilus_toolbar_get_type()
 #define NAUTILUS_TOOLBAR(obj) \
@@ -72,4 +73,7 @@ void nautilus_toolbar_set_show_location_entry (NautilusToolbar *self,
                                               gboolean show_location_entry);
 void nautilus_toolbar_reset_menus (NautilusToolbar *self);
 
+void       nautilus_toolbar_set_active_slot    (NautilusToolbar    *toolbar,
+                                                NautilusWindowSlot *slot);
+
 #endif /* __NAUTILUS_TOOLBAR_H__ */
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 6daebbf..99667d1 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -2278,6 +2278,8 @@ nautilus_window_set_active_slot (NautilusWindow *window, NautilusWindowSlot *new
                /* inform sidebar panels */
                 nautilus_window_report_location_change (window);
 
+                nautilus_toolbar_set_active_slot (NAUTILUS_TOOLBAR (window->priv->toolbar), new_slot);
+
                /* inform slot & view */
                 g_signal_emit_by_name (new_slot, "active");
        }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]