[nautilus] toolbar: use g_simple_action_set_state_hint() for sort action



commit b4ca64a4877d954eb287d7b563fab16da06d2663
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Mon Jan 26 12:18:51 2015 +0000

    toolbar: use g_simple_action_set_state_hint() for sort action
    
    This way we can avoid directly poking at the toolbar.

 configure.ac               |    2 +-
 src/nautilus-canvas-view.c |   46 ++++++++++++++++++++++++++++++++++---------
 src/nautilus-toolbar.c     |   29 ++++++++++++++++-----------
 src/nautilus-toolbar.h     |    3 --
 4 files changed, 54 insertions(+), 26 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 728a652..4d29127 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ(2.54)
 
 dnl ===========================================================================
 
-m4_define(glib_minver,                 2.35.3)
+m4_define(glib_minver,                 2.43.4)
 m4_define(gnome_desktop_minver,        3.0.0)
 m4_define(pango_minver,                1.28.3)
 m4_define(gtk_minver,                  3.13.2)
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index e938718..98e2c2c 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -72,10 +72,13 @@ enum
 
 static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 
+typedef gboolean (* SortCriterionMatchFunc) (NautilusFile *file);
+
 typedef struct {
        const NautilusFileSortType sort_type;
        const char *metadata_text;
        const char *action_target_name;
+       SortCriterionMatchFunc match_func;
 } SortCriterion;
 
 typedef enum {
@@ -137,12 +140,14 @@ static const SortCriterion sort_criteria[] = {
        {
                NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
                "trashed",
-               "trash-time"
+               "trash-time",
+               nautilus_file_is_in_trash
        },
        {
                NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE,
                NULL,
                "search-relevance",
+               nautilus_file_is_in_search
        }
 };
 
@@ -1023,6 +1028,34 @@ const GActionEntry canvas_view_entries[] = {
 };
 
 static void
+update_sort_action_state_hint (NautilusCanvasView *canvas_view)
+{
+       NautilusFile *file;
+       GVariantBuilder builder;
+       GActionGroup *action_group;
+       GAction *action;
+       GVariant *state_hint;
+       gint idx;
+
+       file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (canvas_view));
+       g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
+
+       for (idx = 0; idx < G_N_ELEMENTS (sort_criteria); idx++) {
+               if (sort_criteria[idx].match_func == NULL ||
+                   (file != NULL && sort_criteria[idx].match_func (file)))
+                       g_variant_builder_add (&builder, "s", sort_criteria[idx].action_target_name);
+       }
+
+       state_hint = g_variant_builder_end (&builder);
+
+       action_group = nautilus_view_get_action_group (NAUTILUS_VIEW (canvas_view));
+       action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "sort");
+       g_simple_action_set_state_hint (G_SIMPLE_ACTION (action), state_hint);
+
+       g_variant_unref (state_hint);
+}
+
+static void
 nautilus_canvas_view_update_actions_state (NautilusView *view)
 {
        GActionGroup *view_action_group;
@@ -1052,12 +1085,13 @@ nautilus_canvas_view_update_actions_state (NautilusView *view)
                keep_aligned = nautilus_canvas_container_is_keep_aligned (get_canvas_container (canvas_view));
                g_action_change_state (action, g_variant_new_boolean (keep_aligned));
        }
+
+       update_sort_action_state_hint (canvas_view);
 }
 
 static void
 nautilus_canvas_view_update_toolbar_menus (NautilusView *view)
 {
-       NautilusFile *file;
        NautilusToolbar *toolbar;
        NautilusCanvasContainer *canvas_container;
        gint zoom_level;
@@ -1065,14 +1099,6 @@ nautilus_canvas_view_update_toolbar_menus (NautilusView *view)
        NAUTILUS_VIEW_CLASS (nautilus_canvas_view_parent_class)->update_toolbar_menus (view);
 
        toolbar = NAUTILUS_TOOLBAR (nautilus_window_get_toolbar (nautilus_view_get_window (view)));
-
-       file = nautilus_view_get_directory_as_file (NAUTILUS_VIEW (view));
-       if (file != NULL && nautilus_file_is_in_trash (file))
-               nautilus_toolbar_show_sort_trash_time (toolbar);
-
-       if (file != NULL && nautilus_file_is_in_search (file))
-               nautilus_toolbar_show_sort_search_relevance (toolbar);
-
        canvas_container = get_canvas_container (NAUTILUS_CANVAS_VIEW (view));
        zoom_level = nautilus_canvas_container_get_zoom_level (canvas_container);
 
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 4a2052a..66a9994 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -570,6 +570,10 @@ nautilus_toolbar_reset_menus (NautilusToolbar *self)
        NautilusWindowSlot *slot;
        NautilusView *view;
        GActionGroup *view_action_group;
+       GVariant *sort_hint;
+       GVariantIter iter;
+       gboolean sort_trash, sort_search;
+       const gchar *hint;
 
        /* Allow actions from the current view to be activated through
         * the view menu and action menu of the toolbar */
@@ -585,20 +589,21 @@ nautilus_toolbar_reset_menus (NautilusToolbar *self)
        gtk_widget_set_visible (self->priv->sort_menu,
                                g_action_group_has_action (view_action_group, "sort"));
 
-       gtk_widget_hide (self->priv->sort_trash_time);
-       gtk_widget_hide (self->priv->sort_search_relevance);
-}
+       sort_hint = g_action_group_get_action_state_hint (view_action_group, "sort");
+       sort_trash = sort_search = FALSE;
 
-void
-nautilus_toolbar_show_sort_trash_time (NautilusToolbar *self)
-{
-       gtk_widget_show (self->priv->sort_trash_time);
-}
+       g_variant_iter_init (&iter, sort_hint);
+       while (g_variant_iter_next (&iter, "&s", &hint)) {
+               if (g_strcmp0 (hint, "trash-time") == 0)
+                       sort_trash = TRUE;
+               if (g_strcmp0 (hint, "search-relevance") == 0)
+                       sort_search = TRUE;
+       }
 
-void
-nautilus_toolbar_show_sort_search_relevance (NautilusToolbar *self)
-{
-       gtk_widget_show (self->priv->sort_search_relevance);
+       g_variant_unref (sort_hint);
+
+       gtk_widget_set_visible (self->priv->sort_trash_time, sort_trash);
+       gtk_widget_set_visible (self->priv->sort_search_relevance, sort_search);
 }
 
 void
diff --git a/src/nautilus-toolbar.h b/src/nautilus-toolbar.h
index a2caf49..10b77e5 100644
--- a/src/nautilus-toolbar.h
+++ b/src/nautilus-toolbar.h
@@ -76,7 +76,4 @@ void nautilus_toolbar_reset_menus (NautilusToolbar *self);
 void nautilus_toolbar_view_menu_widget_set_zoom_level (NautilusToolbar *self,
                                                       gdouble level);
 
-void nautilus_toolbar_show_sort_trash_time (NautilusToolbar *self);
-void nautilus_toolbar_show_sort_search_relevance (NautilusToolbar *self);
-
 #endif /* __NAUTILUS_TOOLBAR_H__ */


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