[nautilus/wip/csoriano/flow] f



commit fdadf38af630aa9c1b2d401408aaacd3d664308e
Author: Carlos Soriano <csoriano gnome org>
Date:   Wed Dec 7 17:27:11 2016 +0100

    f

 src/Makefile.am                     |    2 +
 src/nautilus-files-view.c           |   24 +---
 src/nautilus-files-view.h           |    2 -
 src/nautilus-view-icon-controller.c |  206 +++++++++++++++++++++++------------
 src/nautilus-view-icon-controller.h |    2 +-
 src/nautilus-view-icon-ui.c         |    8 +-
 src/nautilus-view-item-model.c      |    4 +-
 src/nautilus-view-model.c           |  145 ++++++++++++++++++++++++
 src/nautilus-view-model.h           |   28 +++++
 9 files changed, 325 insertions(+), 96 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index d98a2c8..84bf864 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -222,6 +222,8 @@ nautilus_no_main_sources = \
        nautilus-view-icon-ui.h                 \
        nautilus-view-item-model.c              \
        nautilus-view-item-model.h              \
+       nautilus-view-model.c                   \
+       nautilus-view-model.h                   \
        nautilus-window-slot.c                  \
        nautilus-window-slot.h                  \
        nautilus-window-slot-dnd.c              \
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index e7a5f5e..9ed1eff 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -7710,8 +7710,10 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
     gboolean show_sort_trash, show_sort_access, show_sort_modification, sort_available;
     const gchar *hint;
     g_autofree gchar *zoom_level_percent = NULL;
+    NautilusFile *file;
 
     view_action_group = nautilus_files_view_get_action_group (view);
+    file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view));
 
     gtk_widget_set_visible (view->details->visible_columns,
                             g_action_group_has_action (view_action_group, "visible-columns"));
@@ -7719,6 +7721,8 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
     sort_available = g_action_group_get_action_enabled (view_action_group, "sort");
     show_sort_trash = show_sort_modification = show_sort_access = FALSE;
     gtk_widget_set_visible (view->details->sort_menu, sort_available);
+    gtk_widget_set_visible (view->details->sort_trash_time,
+                            nautilus_file_is_in_trash (file));
 
     /* We want to make insensitive available actions but that are not current
      * available due to the directory
@@ -7728,24 +7732,6 @@ nautilus_files_view_reset_view_menu (NautilusFilesView *view)
     gtk_widget_set_sensitive (view->details->zoom_controls_box,
                               !nautilus_files_view_is_empty (view));
 
-    if (sort_available)
-    {
-        variant = g_action_group_get_action_state_hint (view_action_group, "sort");
-        g_variant_iter_init (&iter, variant);
-
-        while (g_variant_iter_next (&iter, "&s", &hint))
-        {
-            if (g_strcmp0 (hint, "trash-time") == 0)
-            {
-                show_sort_trash = TRUE;
-            }
-        }
-
-        g_variant_unref (variant);
-    }
-
-    gtk_widget_set_visible (view->details->sort_trash_time, show_sort_trash);
-
     zoom_level_percent = g_strdup_printf ("%.0f%%", nautilus_files_view_get_zoom_level_percentage (view) * 
100.0);
     gtk_label_set_label (GTK_LABEL (view->details->zoom_level_label), zoom_level_percent);
 }
@@ -9284,7 +9270,7 @@ nautilus_files_view_new (guint               id,
     {
         case NAUTILUS_VIEW_GRID_ID:
         {
-            view = nautilus_view_icon_controller_new (slot);
+            view = NAUTILUS_FILES_VIEW (nautilus_view_icon_controller_new (slot));
         }
         break;
 
diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h
index e465afb..57908dc 100644
--- a/src/nautilus-files-view.h
+++ b/src/nautilus-files-view.h
@@ -350,8 +350,6 @@ char *            nautilus_files_view_get_title                  (NautilusFilesV
 gboolean          nautilus_files_view_supports_zooming           (NautilusFilesView      *view);
 void              nautilus_files_view_bump_zoom_level            (NautilusFilesView      *view,
                                                                   int                     zoom_increment);
-void              nautilus_files_view_zoom_to_level              (NautilusFilesView      *view,
-                                                                  gint                    level);
 gboolean          nautilus_files_view_can_zoom_in                (NautilusFilesView      *view);
 gboolean          nautilus_files_view_can_zoom_out               (NautilusFilesView      *view);
 void              nautilus_files_view_update_menus               (NautilusFilesView      *view);
diff --git a/src/nautilus-view-icon-controller.c b/src/nautilus-view-icon-controller.c
index e3df3c9..9a9be01 100644
--- a/src/nautilus-view-icon-controller.c
+++ b/src/nautilus-view-icon-controller.c
@@ -1,6 +1,7 @@
 #include "nautilus-view-icon-controller.h"
 #include "nautilus-view-icon-ui.h"
 #include "nautilus-view-item-model.h"
+#include "nautilus-view-model.h"
 #include "nautilus-files-view.h"
 #include "nautilus-file.h"
 #include "nautilus-window-slot.h"
@@ -12,20 +13,15 @@ struct _NautilusViewIconController
     NautilusFilesView parent_instance;
 
     NautilusViewIconUi *view_ui;
-    GListModel *model;
+    NautilusViewModel *model;
 
-    GtkWidget *view_icon;
+    GIcon *view_icon;
     GActionGroup *action_group;
     gint zoom_level;
 };
 
 G_DEFINE_TYPE (NautilusViewIconController, nautilus_view_icon_controller, NAUTILUS_TYPE_FILES_VIEW)
 
-enum {
-  PROP_0,
-  N_PROPS
-};
-
 static gint
 get_default_zoom_level ()
 {
@@ -34,7 +30,7 @@ get_default_zoom_level ()
     default_zoom_level = g_settings_get_enum (nautilus_icon_view_preferences,
                                               NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL);
 
-    return NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE;
+    return default_zoom_level;
 }
 
 static void
@@ -85,7 +81,7 @@ real_is_empty (NautilusFilesView *files_view)
 {
     NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (files_view);
 
-    return g_list_model_get_n_items (self->model) == 0;
+    return g_list_model_get_n_items (G_LIST_MODEL (self->model)) == 0;
 }
 
 static void
@@ -157,14 +153,6 @@ real_bump_zoom_level (NautilusFilesView *files_view,
 }
 
 static guint
-real_get_zoom_level (NautilusFilesView *files_view)
-{
-    NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (files_view);
-
-    return self->zoom_level;
-}
-
-static guint
 get_icon_size_for_zoom_level (NautilusCanvasZoomLevel zoom_level)
 {
     switch (zoom_level)
@@ -203,7 +191,7 @@ set_icon_size (NautilusViewIconController *self,
     NautilusViewItemModel *current_item_model;
     guint i = 0;
 
-    while ((current_item_model = NAUTILUS_VIEW_ITEM_MODEL (g_list_model_get_item (self->model, i))))
+    while ((current_item_model = NAUTILUS_VIEW_ITEM_MODEL (g_list_model_get_item (G_LIST_MODEL 
(self->model), i))))
     {
         nautilus_view_item_model_set_icon_size (current_item_model,
                                                 get_icon_size_for_zoom_level (self->zoom_level));
@@ -219,11 +207,6 @@ set_zoom_level (NautilusViewIconController *self,
 
     set_icon_size (self, get_icon_size_for_zoom_level (new_level));
 }
-static void
-real_zoom_to_level (NautilusFilesView *files_view,
-                    guint              new_level)
-{
-}
 
 static void
 real_restore_standard_zoom_level (NautilusFilesView *files_view)
@@ -324,6 +307,115 @@ 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;
+    NautilusViewModelSortData sort_data;
+
+    g_assert (NAUTILUS_IS_CANVAS_VIEW (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.reverse = sort_constants.reverse;
+    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_simple_action_set_state (action, value);
+}
+
 static void
 real_add_files (NautilusFilesView *files_view,
                 GList             *files,
@@ -337,11 +429,13 @@ real_add_files (NautilusFilesView *files_view,
     g_print ("add files %d\n", g_list_length (files));
     array = convert_file_glist_to_item_model_array (self, files);
     g_list_store_splice (G_LIST_STORE (self->model),
-                         g_list_model_get_n_items (self->model),
+                         g_list_model_get_n_items (G_LIST_MODEL (self->model)),
                          0, array, g_list_length (files));
     clock_t end = clock ();
     double elapsed_time = (end - start) / (double) CLOCKS_PER_SEC;
-    g_print ("add file finished %d %f\n", g_list_model_get_n_items (self->model), elapsed_time);
+    g_print ("add file finished %d %f\n",
+             g_list_model_get_n_items (G_LIST_MODEL (self->model)),
+             elapsed_time);
 }
 
 
@@ -369,7 +463,7 @@ action_zoom_to_level (GSimpleAction *action,
                       GVariant      *state,
                       gpointer       user_data)
 {
-    NautilusViewIconUi *self = NAUTILUS_VIEW_ICON_CONTROLLER (user_data);
+    NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (user_data);
 
     set_zoom_level (self, g_variant_get_int32 (state));
     g_simple_action_set_state (G_SIMPLE_ACTION (action), state);
@@ -378,43 +472,13 @@ action_zoom_to_level (GSimpleAction *action,
 static void
 finalize (GObject *object)
 {
-  NautilusViewIconController *self = (NautilusViewIconController *)object;
-
   G_OBJECT_CLASS (nautilus_view_icon_controller_parent_class)->finalize (object);
 }
 
-static void
-get_property (GObject    *object,
-              guint       prop_id,
-              GValue     *value,
-              GParamSpec *pspec)
-{
-  NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (object);
-
-  switch (prop_id)
-    {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
 
-static void
-set_property (GObject      *object,
-              guint         prop_id,
-              const GValue *value,
-              GParamSpec   *pspec)
-{
-  NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (object);
-
-  switch (prop_id)
-    {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-const GActionEntry view_icon_ui_entries[] =
+const GActionEntry view_icon_actions[] =
 {
+    { "sort", NULL, "s", "'name'", action_sort_order_changed },
     { "zoom-to-level", NULL, NULL, "3", action_zoom_to_level }
 };
 
@@ -423,8 +487,9 @@ constructed (GObject *object)
 {
     NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (object);
     GtkWidget *content_widget;
+    GActionGroup *view_action_group;
 
-    self->model = g_list_store_new (NAUTILUS_TYPE_VIEW_ITEM_MODEL);
+    self->model = nautilus_view_model_new ();
     self->view_ui = nautilus_view_icon_ui_new (self);
     gtk_widget_show (GTK_WIDGET (self->view_ui));
     self->view_icon = g_themed_icon_new ("view-grid-symbolic");
@@ -434,15 +499,20 @@ constructed (GObject *object)
 
     self->action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self));
     g_action_map_add_action_entries (G_ACTION_MAP (self->action_group),
-                                     view_icon_ui_entries,
-                                     G_N_ELEMENTS (view_icon_ui_entries),
+                                     view_icon_actions,
+                                     G_N_ELEMENTS (view_icon_actions),
                                      self);
-    self->zoom_level = get_default_zoom_level ();
-    g_action_group_change_action_state (self->action_group,
-                                        "zoom-to-level",
-                                        g_variant_new_int32 (self->zoom_level));
 
-    gtk_widget_show_all (self);
+    gtk_widget_show_all (GTK_WIDGET (self));
+
+    view_action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self));
+    g_action_map_add_action_entries (G_ACTION_MAP (view_action_group),
+                                     view_icon_actions,
+                                     G_N_ELEMENTS (view_icon_actions),
+                                     self);
+    /* Keep the action synced with the actual value, so the toolbar can poll it */
+    g_action_group_change_action_state (nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self)),
+                                        "zoom-to-level", g_variant_new_int32 (self->zoom_level));
 }
 
 static void
@@ -452,8 +522,6 @@ nautilus_view_icon_controller_class_init (NautilusViewIconControllerClass *klass
   NautilusFilesViewClass *files_view_class = NAUTILUS_FILES_VIEW_CLASS (klass);
 
   object_class->finalize = finalize;
-  object_class->get_property = get_property;
-  object_class->set_property = set_property;
   object_class->constructed = constructed;
 
     files_view_class->add_files = real_add_files;
@@ -499,7 +567,7 @@ nautilus_view_icon_controller_new (NautilusWindowSlot *slot)
                        NULL);
 }
 
-GListModel *
+GListStore *
 nautilus_view_icon_controller_get_model (NautilusViewIconController *self)
 {
     g_return_val_if_fail (NAUTILUS_IS_VIEW_ICON_CONTROLLER (self), NULL);
diff --git a/src/nautilus-view-icon-controller.h b/src/nautilus-view-icon-controller.h
index c713633..9a9f23d 100644
--- a/src/nautilus-view-icon-controller.h
+++ b/src/nautilus-view-icon-controller.h
@@ -15,7 +15,7 @@ G_DECLARE_FINAL_TYPE (NautilusViewIconController, nautilus_view_icon_controller,
 
 NautilusViewIconController *nautilus_view_icon_controller_new (NautilusWindowSlot *slot);
 
-GListModel * nautilus_view_icon_controller_get_model (NautilusViewIconController *self);
+GListStore * nautilus_view_icon_controller_get_model (NautilusViewIconController *self);
 
 G_END_DECLS
 
diff --git a/src/nautilus-view-icon-ui.c b/src/nautilus-view-icon-ui.c
index 3ba4b35..e40e227 100644
--- a/src/nautilus-view-icon-ui.c
+++ b/src/nautilus-view-icon-ui.c
@@ -105,7 +105,7 @@ create_widget_func (gpointer item,
     NautilusViewIconItemUi *child;
 
     child = nautilus_view_icon_item_ui_new (item_model);
-    gtk_widget_show (child);
+    gtk_widget_show (GTK_WIDGET (child));
 
     return GTK_WIDGET (child);
 }
@@ -120,7 +120,7 @@ on_child_activated (GtkFlowBox      *flow_box,
     NautilusFile *file;
     g_autoptr (GList) list = NULL;
 
-    item_model = nautilus_view_icon_item_ui_get_model (child);
+    item_model = nautilus_view_icon_item_ui_get_model (NAUTILUS_VIEW_ICON_ITEM_UI (child));
     file = nautilus_view_item_model_get_file (item_model);
     list = g_list_append (list, file);
 
@@ -137,6 +137,7 @@ static void
 constructed (GObject *object)
 {
     NautilusViewIconUi *self = NAUTILUS_VIEW_ICON_UI (object);
+    GListStore *model;
 
     G_OBJECT_CLASS (nautilus_view_icon_ui_parent_class)->constructed (object);
 
@@ -152,8 +153,9 @@ constructed (GObject *object)
     gtk_widget_set_margin_bottom (GTK_WIDGET (self), 10);
     gtk_widget_set_margin_end (GTK_WIDGET (self), 10);
 
+    model = nautilus_view_icon_controller_get_model (self->controller);
     gtk_flow_box_bind_model (GTK_FLOW_BOX (self),
-                             nautilus_view_icon_controller_get_model (self->controller),
+                             G_LIST_MODEL (model),
                              create_widget_func, self, NULL);
 
     g_signal_connect (self, "child-activated", (GCallback) on_child_activated, self);
diff --git a/src/nautilus-view-item-model.c b/src/nautilus-view-item-model.c
index da90125..22f3b80 100644
--- a/src/nautilus-view-item-model.c
+++ b/src/nautilus-view-item-model.c
@@ -128,7 +128,7 @@ nautilus_view_item_model_new (NautilusFile *file,
 guint
 nautilus_view_item_model_get_icon_size (NautilusViewItemModel *self)
 {
-    g_return_if_fail (NAUTILUS_IS_VIEW_ITEM_MODEL (self));
+    g_return_val_if_fail (NAUTILUS_IS_VIEW_ITEM_MODEL (self), -1);
 
     return self->icon_size;
 }
@@ -147,7 +147,7 @@ nautilus_view_item_model_set_icon_size (NautilusViewItemModel *self,
 NautilusFile *
 nautilus_view_item_model_get_file (NautilusViewItemModel *self)
 {
-    g_return_if_fail (NAUTILUS_IS_VIEW_ITEM_MODEL (self));
+    g_return_val_if_fail (NAUTILUS_IS_VIEW_ITEM_MODEL (self), NULL);
 
     return self->file;
 }
diff --git a/src/nautilus-view-model.c b/src/nautilus-view-model.c
new file mode 100644
index 0000000..dbf3b27
--- /dev/null
+++ b/src/nautilus-view-model.c
@@ -0,0 +1,145 @@
+#include "nautilus-view-model.h"
+#include "nautilus-view-item-model.h"
+#include "nautilus-global-preferences.h"
+
+struct _NautilusViewModel
+{
+  Gobject parent_instance;
+
+  GListStore *internal_model;
+  NautilusViewModelSortData *sort_data;
+};
+
+G_DEFINE_TYPE (NautilusViewModel, nautilus_view_model, G_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  PROP_SORT_TYPE,
+  PROP_G_MODEL,
+  N_PROPS
+};
+
+static void
+finalize (GObject *object)
+{
+  G_OBJECT_CLASS (nautilus_view_model_parent_class)->finalize (object);
+}
+
+static void
+get_property (GObject    *object,
+              guint       prop_id,
+              GValue     *value,
+              GParamSpec *pspec)
+{
+  NautilusViewModel *self = NAUTILUS_VIEW_MODEL (object);
+
+    switch (prop_id)
+    {
+        case PROP_SORT_TYPE:
+        {
+            g_value_set_object (value, self->sort_type);
+        }
+        break;
+
+        case PROP_G_MODEL:
+        {
+            g_value_set_object (value, self->internal_model);
+        }
+        break;
+
+        default:
+        {
+            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
+    }
+}
+
+static void
+set_property (GObject      *object,
+              guint         prop_id,
+              const GValue *value,
+              GParamSpec   *pspec)
+{
+  NautilusViewModel *self = NAUTILUS_VIEW_MODEL (object);
+
+    switch (prop_id)
+    {
+        case PROP_SORT_TYPE:
+        {
+            nautilus_view_model_set_sort_type (self, g_value_get_object (value));
+        }
+        break;
+
+        default:
+        {
+            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        }
+    }
+}
+
+static void
+constructed (GObject *object)
+{
+    NautilusViewModel *self = NAUTILUS_VIEW_MODEL (object);
+
+    G_OBJECT_CLASS (nautilus_view_model_parent_class)->constructed (object);
+
+    self->model = g_list_store_new (NAUTILUS_TYPE_VIEW_ITEM_MODEL);
+}
+
+static void
+nautilus_view_model_class_init (NautilusViewModelClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = finalize;
+  object_class->get_property = get_property;
+  object_class->set_property = set_property;
+  object_class->constructed = constructed;
+}
+
+static void
+nautilus_view_model_init (NautilusViewModel *self)
+{
+}
+
+static gint
+compare_data_func (gconstpointer a,
+                   gconstpointer b,
+                   gpointer      user_data)
+{
+    NautilusViewModel *self = NAUTILUS_VIEW_MODEL (user_data);
+    NautilusFile *file_a;
+    NautilusFile *file_b;
+
+    file_a = nautilus_view_item_model_get_file (NAUTILUS_VIEW_ITEM_MODEL (a));
+    file_b = nautilus_view_item_model_get_file (NAUTILUS_VIEW_ITEM_MODEL (a));
+
+    return nautilus_file_compare_for_sort (file_a, file_b,
+                                           self->sort_data->sort_type,
+                                           self->sort_data->sort_reversed,
+                                           self->sort_data->sort_directories_first);
+}
+
+NautilusViewModel *
+nautilus_view_model_new ()
+{
+  return g_object_new (NAUTILUS_TYPE_VIEW_MODEL, NULL);
+}
+
+void
+nautilus_view_model_set_sort_type (NautilusViewModel         *self,
+                                   NautilusViewModelSortData *sort_data);
+{
+    if (self->sort_data)
+    {
+        g_free (self->sort_data);
+    }
+
+    self->sort_data = g_new (NautilusViewModelSortData, 1);
+    self->sort_data->sort_type = sort_data->sort_type;
+    self->sort_data->reverse = sort_data->reverse;
+    self->sort_data->directories_first = sort_data->directories_first;
+
+    g_list_store_sort (self, compare_data_func, self);
+}
diff --git a/src/nautilus-view-model.h b/src/nautilus-view-model.h
new file mode 100644
index 0000000..d9bd1a5
--- /dev/null
+++ b/src/nautilus-view-model.h
@@ -0,0 +1,28 @@
+#ifndef NAUTILUS_VIEW_MODEL_H
+#define NAUTILUS_VIEW_MODEL_H
+
+#include <glib.h>
+#include "nautilus-file.h"
+
+G_BEGIN_DECLS
+
+#define NAUTILUS_TYPE_VIEW_MODEL (nautilus_view_model_get_type())
+
+G_DECLARE_FINAL_TYPE (NautilusViewModel, nautilus_view_model, NAUTILUS, VIEW_MODEL, GObject)
+
+typedef struct
+{
+    NautilusFileSortType sort_type;
+    gboolean reversed;
+    gboolean directories_first;
+} NautilusViewModelSortData;
+
+NautilusViewModel * nautilus_view_model_new (void);
+
+void nautilus_view_model_set_sort_type (NautilusViewModel         *self,
+                                        NautilusViewModelSortData *sort_data);
+
+G_END_DECLS
+
+#endif /* NAUTILUS_VIEW_MODEL_H */
+


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