filesystemmodel: Retire GtkFileSystemItem
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Sun, 9 Oct 2022 21:52:12 +0000 (18:52 -0300)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 21 Oct 2022 02:34:40 +0000 (22:34 -0400)
This has to be the shortest-living object in GTK history!

It helped us greatly during the transition to GtkColumnView, but
now we can remove it in favour of GFileInfo directly. Perhaps I
could have never introduced GtkFileSystemItem in the first place,
but we're 30 commits deep and it's too late to just redo the whole
thing that will get us exactly here anyway.

gtk/gtkfilechooserwidget.c
gtk/gtkfilesystemmodel.c
gtk/gtkfilesystemmodel.h
gtk/gtkfilethumbnail.c
gtk/gtkfilethumbnail.h
gtk/gtksearchenginemodel.c
gtk/ui/gtkfilechooserwidget.ui

index 697f27882c6fcaf62095c18deed58dc1f97026b7..d2dead1f41d8bde88483faf728b6f51732ae4710 100644 (file)
@@ -1025,19 +1025,17 @@ selection_check (GtkFileChooserWidget *impl,
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
       GFileInfo *info;
       gboolean is_folder;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      info = _gtk_file_system_item_get_file_info (item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
       is_folder = _gtk_file_info_consider_as_directory (info);
 
       all_folders &= is_folder;
       all_files &= !is_folder;
       n_selected++;
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 
   g_assert (n_selected == 0 || !(all_files && all_folders));
@@ -1134,15 +1132,15 @@ add_to_shortcuts_cb (GSimpleAction *action,
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
+      GFileInfo *info;
       GFile *file;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      file = _gtk_file_system_item_get_file (item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+      file = _gtk_file_info_get_file (info);
 
       _gtk_bookmarks_manager_insert_bookmark (impl->bookmarks_manager, file, 0, NULL);
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 }
 
@@ -1227,17 +1225,15 @@ delete_file_cb (GSimpleAction *action,
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
       GFileInfo *info;
       GFile *file;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      file = _gtk_file_system_item_get_file (item);
-      info = _gtk_file_system_item_get_file_info (item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+      file = _gtk_file_info_get_file (info);
 
       confirm_delete (impl, file, info);
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 }
 
@@ -1257,17 +1253,17 @@ trash_file_cb (GSimpleAction *action,
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
+      GFileInfo *info;
       GError *error = NULL;
       GFile *file;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      file = _gtk_file_system_item_get_file (item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+      file = _gtk_file_info_get_file (info);
 
       if (!g_file_trash (file, NULL, &error))
         error_trashing_file (impl, file, error);
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 }
 
@@ -1341,10 +1337,10 @@ rename_file_cb (GSimpleAction *action,
                 gpointer       data)
 {
   GtkFileChooserWidget *impl = data;
-  GtkFileSystemItem *item;
   GtkBitsetIter iter;
   GdkRectangle rect;
   GtkBitset *bitset;
+  GFileInfo *info;
   GFile *file;
   double x, y;
   guint position;
@@ -1357,8 +1353,10 @@ rename_file_cb (GSimpleAction *action,
   /* insensitive until we change the name */
   gtk_widget_set_sensitive (impl->rename_file_rename_button, FALSE);
 
-  item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), position);
-  file = _gtk_file_system_item_get_file (item);
+  info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), position);
+  file = _gtk_file_info_get_file (info);
+  g_clear_object (&info);
+
   impl->rename_file_source_file = g_object_ref (file);
   rect = (GdkRectangle) { 0, 0, 1, 1 };
 
@@ -1935,6 +1933,9 @@ column_view_get_file_date (GtkListItem *item,
   GtkFileChooserWidget *impl;
   glong time;
 
+  if (!info)
+    return NULL;
+
   impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (item),
                                                            GTK_TYPE_FILE_CHOOSER_WIDGET));
   g_assert (impl != NULL);
@@ -1950,6 +1951,16 @@ column_view_get_file_date (GtkListItem *item,
   return my_g_format_date_for_display (impl, time);
 }
 
+static char *
+column_view_get_file_display_name (GtkListItem *item,
+                                   GFileInfo   *info)
+{
+  if (info)
+    return g_strdup (g_file_info_get_display_name (info));
+  else
+    return NULL;
+}
+
 static char *
 column_view_get_file_time (GtkListItem *item,
                            GFileInfo   *info)
@@ -1957,6 +1968,9 @@ column_view_get_file_time (GtkListItem *item,
   GtkFileChooserWidget *impl;
   glong time;
 
+  if (!info)
+    return NULL;
+
   impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (item),
                                                            GTK_TYPE_FILE_CHOOSER_WIDGET));
   g_assert (impl != NULL);
@@ -1978,7 +1992,7 @@ column_view_get_file_type (GtkListItem *item,
 {
   GtkFileChooserWidget *impl;
 
-  if (_gtk_file_info_consider_as_directory (info))
+  if (!info || _gtk_file_info_consider_as_directory (info))
     return NULL;
 
   impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (item),
@@ -1989,20 +2003,19 @@ column_view_get_file_type (GtkListItem *item,
 }
 
 static char *
-column_view_get_location (GtkListItem *list_item)
+column_view_get_location (GtkListItem *list_item,
+                          GFileInfo   *info)
 {
   GtkFileChooserWidget *impl;
-  GtkFileSystemItem *item;
   GFile *home_location;
   GFile *dir_location;
   GFile *file;
   char *location;
 
-  item = gtk_list_item_get_item (list_item);
-  if (!item)
+  if (!info)
     return NULL;
 
-  file = _gtk_file_system_item_get_file (item);
+  file = _gtk_file_info_get_file (info);
 
   home_location = g_file_new_for_path (g_get_home_dir ());
   if (file)
@@ -2013,10 +2026,8 @@ column_view_get_location (GtkListItem *list_item)
   if (dir_location && file_is_recent_uri (dir_location))
     {
       const char *target_uri;
-      GFileInfo *info;
       GFile *target;
 
-      info = _gtk_file_system_item_get_file_info (item);
       target_uri = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
       target = g_file_new_for_uri (target_uri);
       g_object_unref (dir_location);
@@ -2056,7 +2067,7 @@ static char *
 column_view_get_size (GtkListItem *item,
                       GFileInfo   *info)
 {
-  if (!_gtk_file_info_consider_as_directory (info))
+  if (info && !_gtk_file_info_consider_as_directory (info))
     return g_format_size (g_file_info_get_size (info));
   else
     return NULL;
@@ -2075,14 +2086,13 @@ column_view_get_time_visible (GtkListItem *item)
 }
 
 static char *
-column_view_get_tooltip_text (GtkListItem *list_item)
+column_view_get_tooltip_text (GtkListItem *list_item,
+                              GFileInfo   *info)
 {
   GtkFileChooserWidget *impl;
-  GtkFileSystemItem *item;
   GFile *file;
 
-  item = gtk_list_item_get_item (list_item);
-  if (!item)
+  if (!info)
     return NULL;
 
   impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (list_item),
@@ -2092,7 +2102,7 @@ column_view_get_tooltip_text (GtkListItem *list_item)
   if (impl->operation_mode == OPERATION_MODE_BROWSE)
     return NULL;
 
-  file = _gtk_file_system_item_get_file (item);
+  file = _gtk_file_info_get_file (info);
 
   return g_file_get_path (file);
 }
@@ -2587,16 +2597,16 @@ static void
 put_recent_folder_in_pathbar (GtkFileChooserWidget *impl,
                               guint                 position)
 {
-  GtkFileSystemItem *item;
+  GFileInfo *info;
 
-  item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), position);
-  g_assert (item != NULL);
+  info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), position);
+  g_assert (info != NULL);
 
   _gtk_path_bar_set_file (GTK_PATH_BAR (impl->browse_path_bar),
-                          _gtk_file_system_item_get_file (item),
+                          _gtk_file_info_get_file (info),
                           FALSE);
 
-  g_clear_object (&item);
+  g_clear_object (&info);
 }
 
 /* Sets the location bar in the appropriate mode according to the
@@ -3562,7 +3572,6 @@ show_and_select_files (GtkFileChooserWidget *impl,
                        GSList               *files)
 {
   GtkFileSystemModel *fsmodel;
-  gboolean enabled_hidden, removed_filters;
   gboolean selected_a_file;
   GSList *walk;
 
@@ -3573,22 +3582,29 @@ show_and_select_files (GtkFileChooserWidget *impl,
 
   g_assert (fsmodel == impl->browse_files_model);
 
-  enabled_hidden = impl->show_hidden;
-  removed_filters = (impl->current_filter == NULL);
-
   selected_a_file = FALSE;
 
   for (walk = files; walk; walk = walk->next)
     {
-      GtkFileSystemItem *item;
-      GFile *file = walk->data;
+      GFileInfo *info;
+      GFile *file;
+      guint i;
+
+      file = walk->data;
 
       /* Is it a hidden file? */
 
-      item = _gtk_file_system_model_get_item_for_file (fsmodel, file);
-      if (!item)
+      info = _gtk_file_system_model_get_info_for_file (fsmodel, file);
+      if (!info)
         continue;
 
+      /* TODO: Reimplement showing hidden files and removing filters */
+#if 0
+      gboolean enabled_hidden, removed_filters;
+
+      enabled_hidden = impl->show_hidden;
+      removed_filters = (impl->current_filter == NULL);
+
       if (!_gtk_file_system_item_is_visible (item))
         {
           GFileInfo *info = _gtk_file_system_item_get_file_info (item);
@@ -3618,32 +3634,30 @@ show_and_select_files (GtkFileChooserWidget *impl,
         }
 
       /* Okay, can we select the file now? */
-      item = _gtk_file_system_model_get_item_for_file (fsmodel, file);
+      item = _gtk_file_system_model_get_info_for_file (fsmodel, file);
       if (!item)
         continue;
+#endif
 
-      if (_gtk_file_system_item_is_visible (item))
+      /* TODO: "accidentally" quadratic! */
+
+      for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (impl->selection_model)); i++)
         {
-          guint i;
+          GFileInfo *info2;
 
-          /* TODO: "accidentally" quadratic! */
+          info2 = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
 
-          for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (impl->selection_model)); i++)
+          if (info2 == info)
             {
-              GtkFileSystemItem *item2 = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-
-              if (item2 == item)
-                {
-                  gtk_selection_model_select_item (impl->selection_model,
-                                                   i,
-                                                   FALSE);
-                  g_clear_object (&item2);
-                  selected_a_file = TRUE;
-                  break;
-                }
-
-              g_clear_object (&item2);
+              gtk_selection_model_select_item (impl->selection_model,
+                                               i,
+                                               FALSE);
+              g_clear_object (&info);
+              selected_a_file = TRUE;
+              break;
             }
+
+          g_clear_object (&info);
         }
     }
 
@@ -4153,13 +4167,10 @@ update_chooser_entry (GtkFileChooserWidget *impl)
     {
       if (impl->operation_mode == OPERATION_MODE_BROWSE)
         {
-          GtkFileSystemItem *item;
           GFileInfo *info;
           gboolean change_entry;
 
-          item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), first);
-          info = _gtk_file_system_item_get_file_info (item);
-          g_clear_object (&item);
+          info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), first);
 
           g_free (impl->browse_files_last_selected_name);
           impl->browse_files_last_selected_name =
@@ -4186,19 +4197,21 @@ update_chooser_entry (GtkFileChooserWidget *impl)
                 _gtk_file_chooser_entry_select_filename (GTK_FILE_CHOOSER_ENTRY (impl->location_entry));
             }
 
+          g_clear_object (&info);
+
           return;
         }
       else if (impl->operation_mode == OPERATION_MODE_RECENT
                && impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
         {
-          GtkFileSystemItem *item;
+          GFileInfo *info;
           GFile *folder;
 
           /* Set the base folder on the name entry, so it will do completion relative to the correct recent-folder */
 
-          item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), first);
-          folder = _gtk_file_system_item_get_file (item);
-          g_clear_object (&item);
+          info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), first);
+          folder = _gtk_file_info_get_file (info);
+          g_clear_object (&info);
 
           _gtk_file_chooser_entry_set_base_folder (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), folder);
           return;
@@ -4616,12 +4629,12 @@ gtk_file_chooser_widget_unselect_file (GtkFileChooser *chooser,
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
+      GFileInfo *info;
       GFile *f;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      f = _gtk_file_system_item_get_file (item);
-      g_clear_object (&item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+      f = _gtk_file_info_get_file (info);
+      g_clear_object (&info);
 
       if (g_file_equal (f, file))
         break;
@@ -4649,14 +4662,10 @@ gtk_file_chooser_widget_select_all (GtkFileChooser *chooser)
 
       for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (impl->selection_model)); i++)
         {
-          GtkFileSystemItem *item;
           GFileInfo *info;
           gboolean is_folder;
 
-          item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-          info = _gtk_file_system_item_get_file_info (item);
-          g_clear_object (&item);
-
+          info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
           is_folder = _gtk_file_info_consider_as_directory (info);
 
           if ((is_folder && impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) ||
@@ -4664,6 +4673,8 @@ gtk_file_chooser_widget_select_all (GtkFileChooser *chooser)
             gtk_selection_model_select_item (impl->selection_model, i, FALSE);
           else
             gtk_selection_model_unselect_item (impl->selection_model, i);
+
+          g_clear_object (&info);
         }
     }
 }
@@ -4836,12 +4847,12 @@ gtk_file_chooser_widget_get_files (GtkFileChooser *chooser)
            gtk_bitset_iter_is_valid (&iter);
            gtk_bitset_iter_next (&iter, &i))
         {
-          GtkFileSystemItem *item;
+          GFileInfo *info;
           GFile *file;
 
-          item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-          file = _gtk_file_system_item_get_file (item);
-          g_clear_object (&item);
+          info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+          file = _gtk_file_info_get_file (info);
+          g_clear_object (&info);
 
           if (!file_from_entry || !g_file_equal (file_from_entry, file))
             g_list_store_append (result, file);
@@ -5039,16 +5050,16 @@ gtk_file_chooser_widget_get_shortcut_folders (GtkFileChooser *chooser)
 static void
 switch_to_selected_folder (GtkFileChooserWidget *impl)
 {
-  GtkFileSystemItem *item;
+  GFileInfo *info;
   GFile *file;
 
   g_assert (!impl->select_multiple);
   g_assert (GTK_IS_SINGLE_SELECTION (impl->selection_model));
 
-  item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (impl->selection_model));
-  g_assert (item != NULL);
+  info = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (impl->selection_model));
+  g_assert (info != NULL);
 
-  file = _gtk_file_system_item_get_file (item);
+  file = _gtk_file_info_get_file (info);
   change_folder_and_display_error (impl, file, FALSE);
 }
 
@@ -5058,16 +5069,13 @@ switch_to_selected_folder (GtkFileChooserWidget *impl)
 static const char *
 get_display_name_from_file_list (GtkFileChooserWidget *impl)
 {
-  GtkFileSystemItem *item;
   GFileInfo *info;
 
   g_assert (!impl->select_multiple);
   g_assert (GTK_IS_SINGLE_SELECTION (impl->selection_model));
 
-  item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (impl->selection_model));
-  g_assert (item != NULL);
-
-  info = _gtk_file_system_item_get_file_info (item);
+  info = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (impl->selection_model));
+  g_assert (info != NULL);
 
   return g_file_info_get_display_name (info);
 }
@@ -5791,15 +5799,15 @@ get_selected_files (GtkFileChooserWidget *impl)
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
+      GFileInfo *info;
       GFile *file;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      file = _gtk_file_system_item_get_file (item);
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
+      file = _gtk_file_info_get_file (info);
 
       result = g_slist_prepend (result, g_object_ref (file));
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 
   return result;
@@ -5819,15 +5827,12 @@ get_selected_infos (GtkFileChooserWidget *impl)
        gtk_bitset_iter_is_valid (&iter);
        gtk_bitset_iter_next (&iter, &i))
     {
-      GtkFileSystemItem *item;
       GFileInfo *info;
 
-      item = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
-      info = _gtk_file_system_item_get_file_info (item);
-
+      info = g_list_model_get_item (G_LIST_MODEL (impl->selection_model), i);
       result = g_slist_prepend (result, g_object_ref (info));
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 
   return result;
@@ -6273,16 +6278,14 @@ column_view_row_activated_cb (GtkColumnView        *column_view,
                               guint                 position,
                               GtkFileChooserWidget *self)
 {
-  GtkFileSystemItem *item;
   GFileInfo *info;
 
-  item = g_list_model_get_item (G_LIST_MODEL (self->selection_model),
+  info = g_list_model_get_item (G_LIST_MODEL (self->selection_model),
                                 position);
-  info = _gtk_file_system_item_get_file_info (item);
 
   if (_gtk_file_info_consider_as_directory (info))
     {
-      GFile *file = _gtk_file_system_item_get_file (item);
+      GFile *file = _gtk_file_info_get_file (info);
       change_folder_and_display_error (self, file, FALSE);
     }
   else if (self->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
@@ -6291,7 +6294,7 @@ column_view_row_activated_cb (GtkColumnView        *column_view,
       gtk_widget_activate_default (GTK_WIDGET (self));
     }
 
-  g_clear_object (&item);
+  g_clear_object (&info);
 }
 
 static void
@@ -6935,6 +6938,7 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
   gtk_widget_class_bind_template_callback (widget_class, click_cb);
   gtk_widget_class_bind_template_callback (widget_class, long_press_cb);
   gtk_widget_class_bind_template_callback (widget_class, column_view_get_file_date);
+  gtk_widget_class_bind_template_callback (widget_class, column_view_get_file_display_name);
   gtk_widget_class_bind_template_callback (widget_class, column_view_get_file_time);
   gtk_widget_class_bind_template_callback (widget_class, column_view_get_file_type);
   gtk_widget_class_bind_template_callback (widget_class, column_view_get_location);
index 9989c235343a57fa4653c8163c050f73ab83356e..06da0ba33e6d3cc1a6c9cc8f782b4189afb6e944 100644 (file)
@@ -126,7 +126,6 @@ struct _FileModelNode
 {
   GFile *               file;           /* file represented by this node or NULL for editable */
   GFileInfo *           info;           /* info for this file or NULL if unknown */
-  GtkFileSystemItem *   item;           /* item for the GListModel implementation */
 
   guint                 row;            /* if valid (see model->n_valid_indexes), visible nodes before and including
                                         * this one - see the "Structure" comment above.
@@ -648,89 +647,10 @@ gtk_file_system_model_iface_init (GtkTreeModelIface *iface)
 
 /*** GListModel ***/
 
-struct _GtkFileSystemItem {
-  GObject parent;
-
-  FileModelNode *node; /* unonwned */
-};
-
-typedef struct _GtkFileSystemItemClass
-{
-  GObjectClass parent_class;
-} GtkFileSystemItemClass;
-
-G_DEFINE_TYPE (GtkFileSystemItem, _gtk_file_system_item, G_TYPE_OBJECT)
-
-enum {
-  PROP_0,
-  PROP_FILE,
-  PROP_FILE_INFO,
-  PROP_NAME,
-  N_PROPS,
-};
-
-static GParamSpec *item_properties[N_PROPS] = { NULL, };
-
-static void
-_gtk_file_system_item_get_property (GObject    *object,
-                                    guint       prop_id,
-                                    GValue     *value,
-                                    GParamSpec *pspec)
-{
-  GtkFileSystemItem *self = GTK_FILE_SYSTEM_ITEM (object);
-
-  switch (prop_id)
-    {
-    case PROP_FILE:
-      g_value_set_object (value, self->node->file);
-      break;
-
-    case PROP_FILE_INFO:
-      g_value_set_object (value, self->node->info);
-      break;
-
-    case PROP_NAME:
-      g_value_set_string (value, g_file_info_get_display_name (self->node->info));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-_gtk_file_system_item_class_init (GtkFileSystemItemClass *klass)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  object_class->get_property = _gtk_file_system_item_get_property;
-
-  item_properties[PROP_FILE] =
-    g_param_spec_object ("file", NULL, NULL,
-                         G_TYPE_FILE,
-                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
-
-  item_properties[PROP_FILE_INFO] =
-    g_param_spec_object ("file-info", NULL, NULL,
-                         G_TYPE_FILE_INFO,
-                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
-
-  item_properties[PROP_NAME] =
-    g_param_spec_string ("name", NULL, NULL, "",
-                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
-
-  g_object_class_install_properties (object_class, N_PROPS, item_properties);
-}
-
-static void
-_gtk_file_system_item_init (GtkFileSystemItem *self)
-{
-}
-
 static GType
 list_model_get_item_type (GListModel *list_model)
 {
-  return GTK_TYPE_FILE_SYSTEM_ITEM;
+  return G_TYPE_FILE_INFO;
 }
 
 static guint
@@ -754,7 +674,7 @@ list_model_get_item (GListModel *list_model,
     return NULL;
 
   node = get_node (model, position + 1);
-  return g_object_ref (node->item);
+  return g_object_ref (node->info);
 }
 
 static void
@@ -813,7 +733,6 @@ gtk_file_system_model_finalize (GObject *object)
       int v;
 
       FileModelNode *node = get_node (model, i);
-      g_clear_object (&node->item);
       g_clear_object (&node->file);
       g_clear_object (&node->info);
 
@@ -1560,6 +1479,26 @@ _gtk_file_system_model_get_iter_for_file (GtkFileSystemModel *model,
   return TRUE;
 }
 
+
+GFileInfo *
+_gtk_file_system_model_get_info_for_file (GtkFileSystemModel *model,
+                                          GFile              *file)
+{
+  FileModelNode *node;
+  guint i;
+
+  g_return_val_if_fail (GTK_IS_FILE_SYSTEM_MODEL (model), FALSE);
+  g_return_val_if_fail (G_IS_FILE (file), FALSE);
+
+  i = node_get_for_file (model, file);
+
+  if (i == 0)
+    return NULL;
+
+  node = get_node (model, i);
+  return node->info;
+}
+
 /* When an element is added or removed to the model->files array, we need to
  * update the model->file_lookup mappings of (node, index), as the indexes
  * change.  This function adds the specified increment to the index in that pair
@@ -1622,14 +1561,6 @@ add_file (GtkFileSystemModel *model,
 
   position = model->files->len - 1;
 
-  /* 'node' is now invalid, fetch the actual node from the array - this
-   * will all go away when we finish the transition to GtkColumnView
-   * and drop the GtkTreeModel code.
-   */
-  node = get_node (model, position);
-  node->item = g_object_new (GTK_TYPE_FILE_SYSTEM_ITEM, NULL);
-  node->item->node = node;
-
   if (!model->frozen)
     node_compute_visibility_and_filters (model, model->files->len -1);
 
@@ -1668,8 +1599,6 @@ remove_file (GtkFileSystemModel *model,
 
   node_invalidate_index (model, id);
 
-  g_clear_object (&node->item);
-
   g_hash_table_remove (model->file_lookup, file);
   g_object_unref (node->file);
   adjust_file_lookup (model, id, -1);
@@ -1901,36 +1830,3 @@ _gtk_file_system_model_get_directory (GtkFileSystemModel *model)
   return model->dir;
 }
 
-GFile *
-_gtk_file_system_item_get_file (GtkFileSystemItem *item)
-{
-  return item->node->file;
-}
-
-GFileInfo *
-_gtk_file_system_item_get_file_info (GtkFileSystemItem *item)
-{
-  return item->node->info;
-}
-
-gboolean
-_gtk_file_system_item_is_visible (GtkFileSystemItem *item)
-{
-  return item->node->visible;
-}
-
-GtkFileSystemItem *
-_gtk_file_system_model_get_item_for_file(GtkFileSystemModel *model,
-                                         GFile              *file)
-{
-  FileModelNode *node;
-  guint i;
-
-  i = node_get_for_file (model, file);
-
-  if (i == 0)
-    return NULL;
-
-  node = get_node (model, i);
-  return node->item;
-}
index d73e9e811de6c9382f04657bcf7c18aa3fb30e93..d107a659e597d223c35fc32bd2d257754e85abf3 100644 (file)
@@ -33,14 +33,6 @@ typedef struct _GtkFileSystemModel      GtkFileSystemModel;
 
 GType _gtk_file_system_model_get_type (void) G_GNUC_CONST;
 
-#define GTK_TYPE_FILE_SYSTEM_ITEM             (_gtk_file_system_item_get_type ())
-#define GTK_FILE_SYSTEM_ITEM(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_SYSTEM_ITEM, GtkFileSystemItem))
-#define GTK_IS_FILE_SYSTEM_ITEM(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_SYSTEM_ITEM))
-
-typedef struct _GtkFileSystemItem      GtkFileSystemItem;
-
-GType _gtk_file_system_item_get_type (void) G_GNUC_CONST;
-
 typedef gboolean (*GtkFileSystemModelGetValue)   (GtkFileSystemModel *model,
                                                   GFile              *file,
                                                   GFileInfo          *info,
@@ -69,6 +61,8 @@ GFileInfo *         _gtk_file_system_model_get_info         (GtkFileSystemModel
 gboolean            _gtk_file_system_model_get_iter_for_file(GtkFileSystemModel *model,
                                                             GtkTreeIter        *iter,
                                                             GFile              *file);
+GFileInfo *         _gtk_file_system_model_get_info_for_file(GtkFileSystemModel *model,
+                                                            GFile              *file);
 GFile *             _gtk_file_system_model_get_file         (GtkFileSystemModel *model,
                                                             GtkTreeIter        *iter);
 const GValue *      _gtk_file_system_model_get_value        (GtkFileSystemModel *model,
@@ -100,15 +94,6 @@ void                _gtk_file_system_model_set_filter_folders (GtkFileSystemMode
 void                _gtk_file_system_model_set_filter       (GtkFileSystemModel *model,
                                                              GtkFileFilter      *filter);
 
-GFile *             _gtk_file_system_item_get_file          (GtkFileSystemItem  *item);
-
-GFileInfo *         _gtk_file_system_item_get_file_info     (GtkFileSystemItem  *item);
-
-gboolean            _gtk_file_system_item_is_visible        (GtkFileSystemItem  *item);
-
-GtkFileSystemItem * _gtk_file_system_model_get_item_for_file(GtkFileSystemModel *model,
-                                                            GFile              *file);
-
 G_END_DECLS
 
 #endif /* __GTK_FILE_SYSTEM_MODEL_H__ */
index 633b6be912cd16a78380f5f0684a30905f1cab74..d8a5171119d0d6e88328384dc487314f9a4b812b 100644 (file)
@@ -36,8 +36,8 @@ struct _GtkFileThumbnail
 
   GtkWidget *image;
 
-  GtkFileSystemItem *item;
   GCancellable *cancellable;
+  GFileInfo *info;
 };
 
 typedef struct
@@ -49,7 +49,7 @@ G_DEFINE_FINAL_TYPE (GtkFileThumbnail, _gtk_file_thumbnail, GTK_TYPE_WIDGET)
 
 enum {
   PROP_0,
-  PROP_ITEM,
+  PROP_INFO,
   N_PROPS,
 };
 
@@ -71,18 +71,16 @@ static gboolean
 update_image (GtkFileThumbnail *self)
 {
   GtkIconTheme *icon_theme;
-  GFileInfo *info;
   GIcon *icon;
   int scale;
 
-  info = _gtk_file_system_item_get_file_info (self->item);
-  if (!g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_ICON))
+  if (!g_file_info_has_attribute (self->info, G_FILE_ATTRIBUTE_STANDARD_ICON))
     return FALSE;
 
   scale = gtk_widget_get_scale_factor (GTK_WIDGET (self));
   icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (GTK_WIDGET (self)));
 
-  icon = _gtk_file_info_get_icon (info, ICON_SIZE, scale, icon_theme);
+  icon = _gtk_file_info_get_icon (self->info, ICON_SIZE, scale, icon_theme);
 
   gtk_image_set_from_gicon (GTK_IMAGE (self->image), icon);
 
@@ -100,16 +98,14 @@ thumbnail_queried_cb (GObject      *object,
   GtkFileThumbnail *self = user_data; /* might be unreffed if operation was cancelled */
   GFile *file = G_FILE (object);
   GFileInfo *queried;
-  GFileInfo *info;
 
   queried = g_file_query_info_finish (file, result, NULL);
   if (queried == NULL)
     return;
 
-  info = _gtk_file_system_item_get_file_info (self->item);
-  copy_attribute (info, queried, G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
-  copy_attribute (info, queried, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED);
-  copy_attribute (info, queried, G_FILE_ATTRIBUTE_STANDARD_ICON);
+  copy_attribute (self->info, queried, G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
+  copy_attribute (self->info, queried, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED);
+  copy_attribute (self->info, queried, G_FILE_ATTRIBUTE_STANDARD_ICON);
 
   update_image (self);
 
@@ -128,23 +124,21 @@ cancel_thumbnail (GtkFileThumbnail *self)
 static void
 get_thumbnail (GtkFileThumbnail *self)
 {
-  if (!self->item)
+  if (!self->info)
     return;
 
   if (!update_image (self))
     {
-      GFileInfo *info;
       GFile *file;
 
-      info = _gtk_file_system_item_get_file_info (self->item);
-      if (g_file_info_has_attribute (info, "filechooser::queried"))
+      if (g_file_info_has_attribute (self->info, "filechooser::queried"))
         return;
 
       g_assert (self->cancellable == NULL);
       self->cancellable = g_cancellable_new ();
 
-      file = _gtk_file_system_item_get_file (self->item);
-      g_file_info_set_attribute_boolean (info, "filechooser::queried", TRUE);
+      file = _gtk_file_info_get_file (self->info);
+      g_file_info_set_attribute_boolean (self->info, "filechooser::queried", TRUE);
       g_file_query_info_async (file,
                                G_FILE_ATTRIBUTE_THUMBNAIL_PATH ","
                                G_FILE_ATTRIBUTE_THUMBNAILING_FAILED ","
@@ -162,7 +156,7 @@ _gtk_file_thumbnail_dispose (GObject *object)
 {
   GtkFileThumbnail *self = (GtkFileThumbnail *)object;
 
-  _gtk_file_thumbnail_set_item (self, NULL);
+  _gtk_file_thumbnail_set_info (self, NULL);
 
   g_clear_pointer (&self->image, gtk_widget_unparent);
 
@@ -179,8 +173,8 @@ _gtk_file_thumbnail_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM:
-      g_value_set_object (value, self->item);
+    case PROP_INFO:
+      g_value_set_object (value, self->info);
       break;
 
     default:
@@ -198,8 +192,8 @@ _gtk_file_thumbnail_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM:
-      _gtk_file_thumbnail_set_item (self, g_value_get_object (value));
+    case PROP_INFO:
+      _gtk_file_thumbnail_set_info (self, g_value_get_object (value));
       break;
 
     default:
@@ -217,9 +211,9 @@ _gtk_file_thumbnail_class_init (GtkFileThumbnailClass *klass)
   object_class->get_property = _gtk_file_thumbnail_get_property;
   object_class->set_property = _gtk_file_thumbnail_set_property;
 
-  properties[PROP_ITEM] =
-    g_param_spec_object ("item", NULL, NULL,
-                         GTK_TYPE_FILE_SYSTEM_ITEM,
+  properties[PROP_INFO] =
+    g_param_spec_object ("file-info", NULL, NULL,
+                         G_TYPE_FILE_INFO,
                          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
@@ -236,26 +230,26 @@ _gtk_file_thumbnail_init (GtkFileThumbnail *self)
   gtk_widget_set_parent (self->image, GTK_WIDGET (self));
 }
 
-GtkFileSystemItem *
-_gtk_file_thumbnail_get_item (GtkFileThumbnail *self)
+GFileInfo *
+_gtk_file_thumbnail_get_info (GtkFileThumbnail *self)
 {
   g_assert (GTK_IS_FILE_THUMBNAIL (self));
 
-  return self->item;
+  return self->info;
 }
 
 void
-_gtk_file_thumbnail_set_item (GtkFileThumbnail  *self,
-                              GtkFileSystemItem *item)
+_gtk_file_thumbnail_set_info (GtkFileThumbnail *self,
+                              GFileInfo        *info)
 {
   g_assert (GTK_IS_FILE_THUMBNAIL (self));
-  g_assert (item == NULL || GTK_IS_FILE_SYSTEM_ITEM (item));
+  g_assert (info == NULL || G_IS_FILE_INFO (info));
 
-  if (g_set_object (&self->item, item))
+  if (g_set_object (&self->info, info))
     {
       cancel_thumbnail (self);
       get_thumbnail (self);
-      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ITEM]);
+      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_INFO]);
     }
 }
 
index 12ffadefb0d01621ba631948ebbef4806799445d..c9c5741d3fcffa38625e7c6264c562e6dc24d856 100644 (file)
@@ -36,9 +36,9 @@ typedef struct _GtkFileThumbnail      GtkFileThumbnail;
 
 GType _gtk_file_thumbnail_get_type (void) G_GNUC_CONST;
 
-GtkFileSystemItem *_gtk_file_thumbnail_get_item (GtkFileThumbnail *self);
-void _gtk_file_thumbnail_set_item (GtkFileThumbnail  *self,
-                                   GtkFileSystemItem *item);
+GFileInfo *_gtk_file_thumbnail_get_info (GtkFileThumbnail *self);
+void _gtk_file_thumbnail_set_info (GtkFileThumbnail *self,
+                                   GFileInfo        *info);
 
 G_END_DECLS
 
index 18fde279bc3631cc1c71a42448bdbe3b30f00c22..6d174b1ed03966dabb0da5fbd3c718143f21345b 100644 (file)
@@ -24,6 +24,7 @@
 #include <gdk/gdk.h>
 
 #include "gtksearchenginemodelprivate.h"
+#include "gtkfilechooserutils.h"
 #include "gtkprivate.h"
 
 #include <string.h>
@@ -86,25 +87,21 @@ do_search (gpointer data)
 
   for (guint i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (model->model)); i++)
     {
-      GtkFileSystemItem *item;
-      GFileInfo *info;
-
-      item = g_list_model_get_item (G_LIST_MODEL (model->model), i);
-      info = _gtk_file_system_item_get_file_info (item);
+      GFileInfo *info = g_list_model_get_item (G_LIST_MODEL (model->model), i);
 
       if (info_matches_query (model->query, info))
         {
           GFile *file;
           GtkSearchHit *hit;
 
-          file = _gtk_file_system_item_get_file (item);
+          file = _gtk_file_info_get_file (info);
           hit = g_new (GtkSearchHit, 1);
           hit->file = g_object_ref (file);
           hit->info = g_object_ref (info);
           hits = g_list_prepend (hits, hit);
         }
 
-      g_clear_object (&item);
+      g_clear_object (&info);
     }
 
   if (hits)
index 98cf0c2a4915dcc5bb03414e8de0d9dc24d7e95a..ab8d446367c686e47b0571d17a59d6434b7485a8 100644 (file)
     <property name="child">
       <object class="GtkBox">
         <binding name="tooltip-text">
-          <closure type="gchararray" function="column_view_get_tooltip_text" />
+          <closure type="gchararray" function="column_view_get_tooltip_text">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
         <child>
           <object class="GtkFileThumbnail">
             <property name="margin-start">6</property>
             <property name="margin-end">6</property>
-            <binding name="item">
+            <binding name="file-info">
               <lookup name="item">GtkListItem</lookup>
             </binding>
           </object>
             <property name="xalign">0</property>
             <property name="min-chars">10</property>
             <binding name="text">
-              <lookup type="GtkFileSystemItem" name="name">
+              <closure type="gchararray" function="column_view_get_file_display_name">
                 <lookup name="item">GtkListItem</lookup>
-              </lookup>
+              </closure>
             </binding>
           </object>
         </child>
         <property name="margin-start">6</property>
         <property name="margin-end">6</property>
         <binding name="text">
-          <closure type="gchararray" function="column_view_get_location" />
+          <closure type="gchararray" function="column_view_get_location">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
         <binding name="tooltip-text">
-          <closure type="gchararray" function="column_view_get_tooltip_text" />
+          <closure type="gchararray" function="column_view_get_tooltip_text">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
       </object>
     </property>
         <property name="xalign">0</property>
         <binding name="label">
           <closure type="gchararray" function="column_view_get_size">
-            <lookup type="GtkFileSystemItem" name="file-info">
-              <lookup name="item">GtkListItem</lookup>
-            </lookup>
+            <lookup name="item">GtkListItem</lookup>
           </closure>
         </binding>
         <binding name="tooltip-text">
-          <closure type="gchararray" function="column_view_get_tooltip_text" />
+          <closure type="gchararray" function="column_view_get_tooltip_text">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
       </object>
     </property>
         <property name="xalign">0</property>
         <binding name="label">
           <closure type="gchararray" function="column_view_get_file_type">
-            <lookup type="GtkFileSystemItem" name="file-info">
-              <lookup name="item">GtkListItem</lookup>
-            </lookup>
+            <lookup name="item">GtkListItem</lookup>
           </closure>
         </binding>
         <binding name="tooltip-text">
-          <closure type="gchararray" function="column_view_get_tooltip_text" />
+          <closure type="gchararray" function="column_view_get_tooltip_text">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
       </object>
     </property>
       <object class="GtkBox">
         <property name="spacing">6</property>
         <binding name="tooltip-text">
-          <closure type="gchararray" function="column_view_get_tooltip_text" />
+          <closure type="gchararray" function="column_view_get_tooltip_text">
+            <lookup name="item">GtkListItem</lookup>
+          </closure>
         </binding>
         <child>
           <object class="GtkLabel">
             <binding name="label">
               <closure type="gchararray" function="column_view_get_file_date">
-                <lookup type="GtkFileSystemItem" name="file-info">
-                  <lookup name="item">GtkListItem</lookup>
-                </lookup>
+                <lookup name="item">GtkListItem</lookup>
               </closure>
             </binding>
           </object>
             </binding>
             <binding name="label">
               <closure type="gchararray" function="column_view_get_file_time">
-                <lookup type="GtkFileSystemItem" name="file-info">
-                  <lookup name="item">GtkListItem</lookup>
-                </lookup>
+                <lookup name="item">GtkListItem</lookup>
               </closure>
             </binding>
           </object>