[nautilus/wip/csoriano/flow] f



commit c4541449e86b05f6a54b8e5ae8c3bfc1d780bd59
Author: Carlos Soriano <csoriano gnome org>
Date:   Wed Dec 14 16:33:55 2016 +0100

    f

 src/nautilus-view-icon-controller.c |  423 ++++++++++++++++++++++++++--------
 src/nautilus-view-icon-ui.c         |   13 +
 src/nautilus-view-icon-ui.h         |    3 +
 src/nautilus-view-model.c           |    8 +-
 4 files changed, 343 insertions(+), 104 deletions(-)
---
diff --git a/src/nautilus-view-icon-controller.c b/src/nautilus-view-icon-controller.c
index 3ae0cb5..5d996c4 100644
--- a/src/nautilus-view-icon-controller.c
+++ b/src/nautilus-view-icon-controller.c
@@ -4,6 +4,7 @@
 #include "nautilus-view-model.h"
 #include "nautilus-files-view.h"
 #include "nautilus-file.h"
+#include "nautilus-metadata.h"
 #include "nautilus-window-slot.h"
 #include "nautilus-directory.h"
 #include "nautilus-global-preferences.h"
@@ -22,21 +23,214 @@ struct _NautilusViewIconController
 
 G_DEFINE_TYPE (NautilusViewIconController, nautilus_view_icon_controller, NAUTILUS_TYPE_FILES_VIEW)
 
-static gint
-get_default_zoom_level ()
+typedef struct
 {
-    NautilusCanvasZoomLevel default_zoom_level;
+    const NautilusFileSortType sort_type;
+    const gchar *metadata_name;
+    const gchar *action_target_name;
+    gboolean reversed;
+} SortConstants;
 
-    default_zoom_level = g_settings_get_enum (nautilus_icon_view_preferences,
-                                              NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL);
+static const SortConstants sorts_constants[] =
+{
+    {
+        NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
+        "name",
+        "name",
+        FALSE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
+        "name",
+        "name-desc",
+        TRUE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_SIZE,
+        "size",
+        "size",
+        TRUE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_TYPE,
+        "type",
+        "type",
+        FALSE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_MTIME,
+        "modification date",
+        "modification-date",
+        FALSE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_MTIME,
+        "modification date",
+        "modification-date-desc",
+        TRUE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_ATIME,
+        "access date",
+        "access-date",
+        FALSE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_ATIME,
+        "access date",
+        "access-date-desc",
+        TRUE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
+        "trashed",
+        "trash-time",
+        TRUE,
+    },
+    {
+        NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE,
+        NULL,
+        "search-relevance",
+        TRUE,
+    }
+};
 
-    return default_zoom_level;
+static const SortConstants *
+get_sorts_constants_from_action_target_name (const gchar *action_target_name)
+{
+    int i;
+
+    for (i = 0; i < G_N_ELEMENTS (sorts_constants); i++)
+    {
+        if (g_strcmp0 (sorts_constants[i].action_target_name, action_target_name) == 0)
+        {
+             return &sorts_constants[i];
+        }
+    }
+
+    return &sorts_constants[0];
+}
+
+static const SortConstants *
+get_sorts_constants_from_sort_type (NautilusFileSortType sort_type,
+                                   gboolean             reversed)
+{
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS (sorts_constants); i++)
+    {
+        if (sort_type == sorts_constants[i].sort_type
+            && reversed == sorts_constants[i].reversed)
+        {
+            return &sorts_constants[i];
+        }
+    }
+
+    return &sorts_constants[0];
+}
+
+static const SortConstants *
+get_sorts_constants_from_metadata_text (const char *metadata_name,
+                                       gboolean    reversed)
+{
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS (sorts_constants); i++)
+    {
+        if (g_strcmp0 (sorts_constants[i].metadata_name, metadata_name) == 0
+            && reversed == sorts_constants[i].reversed)
+        {
+            return &sorts_constants[i];
+        }
+    }
+
+    return &sorts_constants[0];
+}
+
+static const SortConstants *
+get_default_sort_order (NautilusFile *file)
+{
+    NautilusFileSortType sort_type;
+    NautilusFileSortType default_sort_order;
+    gboolean reversed;
+
+    default_sort_order = g_settings_get_enum (nautilus_preferences,
+                                              NAUTILUS_PREFERENCES_DEFAULT_SORT_ORDER);
+    reversed = g_settings_get_boolean (nautilus_preferences,
+                                       NAUTILUS_PREFERENCES_DEFAULT_SORT_IN_REVERSE_ORDER);
+
+    /* If this is a special folder (e.g. search or recent), override the sort
+     * order and reversed flag with values appropriate for the folder */
+    sort_type = nautilus_file_get_default_sort_type (file, &reversed);
+
+    if (sort_type == NAUTILUS_FILE_SORT_NONE)
+    {
+        sort_type = CLAMP (default_sort_order,
+                           NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
+                           NAUTILUS_FILE_SORT_BY_ATIME);
+    }
+
+    return get_sorts_constants_from_sort_type (sort_type, reversed);
+}
+
+static const SortConstants *
+get_directory_sort_by (NautilusFile *file)
+{
+    const SortConstants *default_sort;
+    g_autofree char *sort_by = NULL;
+    gboolean reversed;
+
+    default_sort = get_default_sort_order (file);
+    g_return_val_if_fail (default_sort != NULL, NULL);
+
+    sort_by = nautilus_file_get_metadata (file,
+                                          NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY,
+                                          default_sort->metadata_name);
+
+    reversed = nautilus_file_get_boolean_metadata (file,
+                                                   NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
+                                                   default_sort->reversed);
+
+    return get_sorts_constants_from_metadata_text (sort_by, reversed);
 }
 
 static void
-set_sort_order_from_metadata_and_preferences (NautilusViewIconController *self)
+set_directory_sort_metadata (NautilusFile        *file,
+                             const SortConstants *sort)
 {
+    const SortConstants *default_sort;
+
+    default_sort= get_default_sort_order (file);
+
+    nautilus_file_set_metadata (file,
+                                NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY,
+                                default_sort->metadata_name,
+                                sort->metadata_name);
+    nautilus_file_set_boolean_metadata (file,
+                                        NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
+                                        default_sort->reversed,
+                                        sort->reversed);
+}
+
+static void
+update_sort_order_from_metadata_and_preferences (NautilusViewIconController *self)
+{
+    const SortConstants *default_directory_sort;
+    NautilusViewModelSortData sort_data;
+    GActionGroup *view_action_group;
+
+    default_directory_sort = get_directory_sort_by (nautilus_files_view_get_directory_as_file 
(NAUTILUS_FILES_VIEW (self)));
+    view_action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self));
+
+    sort_data.sort_type = default_directory_sort->sort_type;
+    sort_data.reversed = default_directory_sort->reversed;
+    sort_data.directories_first = nautilus_files_view_should_sort_directories_first (NAUTILUS_FILES_VIEW 
(self));
 
+    nautilus_view_model_set_sort_type (self->model, &sort_data);
+
+    g_action_group_change_action_state (view_action_group,
+                                        "sort",
+                                        g_variant_new_string (get_sorts_constants_from_sort_type 
(default_directory_sort->sort_type, default_directory_sort->reversed)->action_target_name));
 }
 
 static void
@@ -44,7 +238,16 @@ real_begin_loading (NautilusFilesView *files_view)
 {
     NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (files_view);
 
-    set_sort_order_from_metadata_and_preferences (self);
+    // TODO: This calls sort once, and update_context_menus calls update_actions which calls
+    // the action again
+    update_sort_order_from_metadata_and_preferences (self);
+
+    //TODO move this to the files view class begin_loading and hook up?
+
+    /* We could have changed to the trash directory or to searching, and then
+     * we need to update the menus */
+    nautilus_files_view_update_context_menus (files_view);
+    nautilus_files_view_update_toolbar_menus (files_view);
 }
 
 static void
@@ -111,16 +314,44 @@ real_remove_file (NautilusFilesView *files_view,
     }
 }
 
+static GQueue *
+convert_glist_to_queue (GList *list)
+{
+    GList *l;
+    GQueue *queue;
+
+    queue = g_queue_new();
+    for (l = list; l != NULL; l = l->next)
+    {
+        g_queue_push_tail (queue, l->data);
+    }
+
+  return queue;
+}
+
 static void
 real_set_selection (NautilusFilesView *files_view,
-                    GList             *selection)
+                    GList             *selection_files)
 {
+    GQueue *selection_queue;
+    NautilusFile *file;
+
+    for (l = selection_files; l != NULL; l = l->next)
+    {
+        file = NAUTILUS_FILE (l->data);
+
+        gtk_flow_box_select_child (l->data);
+    }
+    nautilus_view_icon_ui_select_children (self->view_ui, selection_models);
     nautilus_files_view_notify_selection_changed (files_view);
+
+    g_queue_free (selection_queue);
 }
 
 static void
 real_select_all (NautilusFilesView *files_view)
 {
+    gtk_flow_box_select_all (GTK_FLOW_BOX (self->view_ui));
 }
 
 static void
@@ -128,10 +359,68 @@ real_reveal_selection (NautilusFilesView *files_view)
 {
 }
 
+static gboolean
+showing_recent_directory (NautilusFilesView *view)
+{
+    NautilusFile *file;
+
+    file = nautilus_files_view_get_directory_as_file (view);
+    if (file != NULL)
+    {
+        return nautilus_file_is_in_recent (file);
+    }
+    return FALSE;
+}
+
+static gboolean
+showing_search_directory (NautilusFilesView *view)
+{
+    NautilusFile *file;
+
+    file = nautilus_files_view_get_directory_as_file (view);
+    if (file != NULL)
+    {
+        return nautilus_file_is_in_search (file);
+    }
+    return FALSE;
+}
+
 static void
 real_update_actions_state (NautilusFilesView *files_view)
 {
+    GAction *action;
+    GActionGroup *view_action_group;
+
     NAUTILUS_FILES_VIEW_CLASS (nautilus_view_icon_controller_parent_class)->update_actions_state 
(files_view);
+
+    view_action_group = nautilus_files_view_get_action_group (files_view);
+
+    /* When we change the sort action state, even using the same value, it triggers
+     * the sort action changed handler, which reveals the selection, since we expect
+     * the selection to be visible when the user changes the sort order. But we may
+     * need to update the actions state for others reason than an actual sort change,
+     * so we need to prevent to trigger the sort action changed handler for those cases.
+     * To achieve this, check if the action state value actually changed before setting
+     * it
+     */
+#if 0
+    sort_state = g_action_group_get_action_state (view_action_group, "sort");
+
+    if (g_strcmp0 (g_variant_get_string (sort_state, NULL),
+                   NAUTILUS_CANVAS_VIEW (view)->details->sort->action_target_name) != 0)
+    {
+        g_action_group_change_action_state (view_action_group,
+                                            "sort",
+                                            g_variant_new_string (NAUTILUS_CANVAS_VIEW 
(view)->details->sort->action_target_name));
+    }
+
+    g_variant_unref (sort_state);
+
+#endif
+    action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group), "sort");
+    g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                 !showing_recent_directory (files_view) &&
+                                 !showing_search_directory (files_view));
 }
 
 static void
@@ -184,6 +473,17 @@ get_icon_size_for_zoom_level (NautilusCanvasZoomLevel zoom_level)
     g_return_val_if_reached (NAUTILUS_CANVAS_ICON_SIZE_STANDARD);
 }
 
+static gint
+get_default_zoom_level ()
+{
+    NautilusCanvasZoomLevel default_zoom_level;
+
+    default_zoom_level = g_settings_get_enum (nautilus_icon_view_preferences,
+                                              NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL);
+
+    return default_zoom_level;
+}
+
 static void
 set_icon_size (NautilusViewIconController *self,
                gint                        icon_size)
@@ -307,111 +607,33 @@ convert_file_glist_to_item_model_array (NautilusViewIconController *self,
     return array;
 }
 
-typedef struct
-{
-    const NautilusFileSortType sort_type;
-    const gchar *metadata_name;
-    const gchar *action_target_name;
-    gboolean reversed;
-} SortConstants;
-
-static const SortConstants sorts_constants[] =
-{
-    {
-        NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
-        "name",
-        "name",
-        FALSE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_DISPLAY_NAME,
-        "name",
-        "name-desc",
-        TRUE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_SIZE,
-        "size",
-        "size",
-        TRUE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_TYPE,
-        "type",
-        "type",
-        FALSE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_MTIME,
-        "modification date",
-        "modification-date",
-        FALSE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_MTIME,
-        "modification date",
-        "modification-date-desc",
-        TRUE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_ATIME,
-        "access date",
-        "access-date",
-        FALSE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_ATIME,
-        "access date",
-        "access-date-desc",
-        TRUE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_TRASHED_TIME,
-        "trashed",
-        "trash-time",
-        TRUE,
-    },
-    {
-        NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE,
-        NULL,
-        "search-relevance",
-        TRUE,
-    }
-};
-
-static SortConstants *
-get_sort_constants_from_action_target_name (const gchar *action_target_name)
-{
-    int i;
-
-    for (i = 0; i < G_N_ELEMENTS (sorts_constants); i++)
-    {
-        if (g_strcmp0 (sorts_constants[i].action_target_name, action_target_name) == 0)
-        {
-             return &sorts_constants[i];
-        }
-    }
-
-    return &sorts_constants[0];
-}
 static void
 action_sort_order_changed (GSimpleAction *action,
                            GVariant      *value,
                            gpointer       user_data)
 {
     const gchar *target_name;
-    SortConstants *sort_constants;
+    const SortConstants *sorts_constants;
     NautilusViewModelSortData sort_data;
     NautilusViewIconController *self;
+    NautilusFile *file;
+
+    // Don't resort if the action is in the same state as before
+    if (g_strcmp0 (g_variant_get_string (value, NULL), g_variant_get_string (g_action_get_state (G_ACTION 
(action)), NULL)) == 0)
+    {
+        return;
+    }
 
     self = NAUTILUS_VIEW_ICON_CONTROLLER (user_data);
     target_name = g_variant_get_string (value, NULL);
-    sort_constants = get_sort_constants_from_action_target_name (target_name);
-    sort_data.sort_type = sort_constants->sort_type;
-    sort_data.reversed = sort_constants->reversed;
+    sorts_constants = get_sorts_constants_from_action_target_name (target_name);
+    sort_data.sort_type = sorts_constants->sort_type;
+    sort_data.reversed = sorts_constants->reversed;
     sort_data.directories_first = nautilus_files_view_should_sort_directories_first (NAUTILUS_FILES_VIEW 
(self));
 
     nautilus_view_model_set_sort_type (self->model, &sort_data);
+    set_directory_sort_metadata (nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (self)),
+                                 sorts_constants);
 
     g_simple_action_set_state (action, value);
 }
@@ -467,6 +689,7 @@ action_zoom_to_level (GSimpleAction *action,
 
     set_zoom_level (self, g_variant_get_int32 (state));
     g_simple_action_set_state (G_SIMPLE_ACTION (action), state);
+    g_print ("set action state\n");
 }
 
 static void
diff --git a/src/nautilus-view-icon-ui.c b/src/nautilus-view-icon-ui.c
index e40e227..e3255ec 100644
--- a/src/nautilus-view-icon-ui.c
+++ b/src/nautilus-view-icon-ui.c
@@ -193,3 +193,16 @@ nautilus_view_icon_ui_new (NautilusViewIconController *controller)
                          NULL);
 }
 
+void
+nautilus_view_icon_ui_select_children (NautilusViewIconUi *self,
+                                       GQueue             *files)
+{
+    GList *l;
+    NautilusFile *file;
+
+    for (l = g_queue_peek_head_link (files); l != NULL; l = l->next)
+    {
+        file = NAUTILUS_FILE (l->data);
+        gtk_flow_box_select_child (l->data);
+    }
+}
diff --git a/src/nautilus-view-icon-ui.h b/src/nautilus-view-icon-ui.h
index 5361acc..be87b84 100644
--- a/src/nautilus-view-icon-ui.h
+++ b/src/nautilus-view-icon-ui.h
@@ -31,6 +31,9 @@ G_DECLARE_FINAL_TYPE (NautilusViewIconUi, nautilus_view_icon_ui, NAUTILUS, VIEW_
 
 NautilusViewIconUi * nautilus_view_icon_ui_new (NautilusViewIconController *controller);
 
+void nautilus_view_icon_ui_select_children (NautilusViewIconUi *self,
+                                            GQueue             *queue);
+
 G_END_DECLS
 
 #endif /* NAUTILUS_VIEW_ICON_UI_H */
diff --git a/src/nautilus-view-model.c b/src/nautilus-view-model.c
index edbbbff..ec0d8f7 100644
--- a/src/nautilus-view-model.c
+++ b/src/nautilus-view-model.c
@@ -113,12 +113,12 @@ compare_data_func (gconstpointer a,
     NautilusFile *file_b;
 
     file_a = nautilus_view_item_model_get_file (NAUTILUS_VIEW_ITEM_MODEL ((gpointer) a));
-    file_b = nautilus_view_item_model_get_file (NAUTILUS_VIEW_ITEM_MODEL ((gpointer) a));
+    file_b = nautilus_view_item_model_get_file (NAUTILUS_VIEW_ITEM_MODEL ((gpointer) b));
 
     return nautilus_file_compare_for_sort (file_a, file_b,
                                            self->sort_data->sort_type,
-                                           self->sort_data->reversed,
-                                           self->sort_data->directories_first);
+                                           self->sort_data->directories_first,
+                                           self->sort_data->reversed);
 }
 
 NautilusViewModel *
@@ -141,7 +141,7 @@ nautilus_view_model_set_sort_type (NautilusViewModel         *self,
     self->sort_data->reversed = sort_data->reversed;
     self->sort_data->directories_first = sort_data->directories_first;
 
-    g_list_store_sort (self, compare_data_func, self);
+    g_list_store_sort (self->internal_model, compare_data_func, self);
 }
 
 GListStore *


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