filesystemmodel: Drop tree model cruft
authorMatthias Clasen <mclasen@redhat.com>
Sat, 7 Jan 2023 17:19:13 +0000 (12:19 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 7 Jan 2023 17:22:25 +0000 (12:22 -0500)
We no longer need the placeholder item for the
editable, so drop it.

gtk/gtkfilesystemmodel.c

index c5b910880565379276c5e878ee316cd72f7ded0f..c085022e1958787cf3bd73428e5dda43f5316de6 100644 (file)
@@ -41,7 +41,7 @@ typedef struct _FileModelNode           FileModelNode;
 
 struct _FileModelNode
 {
-  GFile *               file;           /* file represented by this node or NULL for editable */
+  GFile *               file;           /* file represented by this node */
   GFileInfo *           info;           /* info for this file or NULL if unknown */
 
   guint                 row;            /* if valid (see model->n_valid_indexes), visible nodes before and including
@@ -254,21 +254,21 @@ static guint
 node_get_for_file (GtkFileSystemModel *model,
                    GFile              *file)
 {
-  guint i;
+  gpointer position;
+  int i;
 
-  i = GPOINTER_TO_UINT (g_hash_table_lookup (model->file_lookup, file));
-  if (i != 0)
-    return i;
+  if (g_hash_table_lookup_extended (model->file_lookup,
+                                    file, NULL,
+                                    &position))
+    return GPOINTER_TO_UINT (position);
 
-  /* Node 0 is the editable row and has no associated file or entry in the table, so we start counting from 1.
-   *
-   * The invariant here is that the files in model->files[n] for n < g_hash_table_size (model->file_lookup)
+  /* The invariant here is that the files in model->files[n] for n < g_hash_table_size (model->file_lookup)
    * are already added to the hash table. this loop merely rebuilds our (file -> index) mapping on demand.
    *
    * If we exit the loop, the next pending batch of mappings will be resolved when this function gets called again
    * with another file that is not yet in the mapping.
    */
-  for (i = g_hash_table_size (model->file_lookup) + 1; i < model->files->len; i++)
+  for (i = g_hash_table_size (model->file_lookup); i < model->files->len; i++)
     {
       FileModelNode *node = get_node (model, i);
 
@@ -277,7 +277,7 @@ node_get_for_file (GtkFileSystemModel *model,
         return i;
     }
 
-  return 0;
+  return GTK_INVALID_LIST_POSITION;
 }
 
 /*** GListModel ***/
@@ -293,7 +293,7 @@ list_model_get_n_items (GListModel *list_model)
 {
   GtkFileSystemModel *model = GTK_FILE_SYSTEM_MODEL (list_model);
 
-  return model->files->len - 1;
+  return model->files->len;
 }
 
 static gpointer
@@ -305,10 +305,10 @@ list_model_get_item (GListModel *list_model,
 
   /* The first items of GtkFileSystemModel is not really a file,
    * so ignore it. */
-  if (position + 1 >= model->files->len)
+  if (position >= model->files->len)
     return NULL;
 
-  node = get_node (model, position + 1);
+  node = get_node (model, position);
   return g_object_ref (node->info);
 }
 
@@ -355,8 +355,7 @@ gtk_file_system_model_refilter_all (GtkFileSystemModel *model)
 
   freeze_updates (model);
 
-  /* start at index 1, don't change the editable */
-  for (i = 1; i < model->files->len; i++)
+  for (i = 0; i < model->files->len; i++)
     node_compute_visibility_and_filters (model, i);
 
   model->filter_on_thaw = FALSE;
@@ -375,7 +374,8 @@ thaw_updates (GtkFileSystemModel *model)
   if (model->frozen > 0)
     return;
 
-  stuff_added = get_node (model, model->files->len - 1)->frozen_add;
+  stuff_added = model->files->len > 0 &&
+                get_node (model, model->files->len - 1)->frozen_add;
 
   if (model->filter_on_thaw)
     gtk_file_system_model_refilter_all (model);
@@ -402,7 +402,7 @@ add_file (GtkFileSystemModel *model,
 {
   FileModelNode *node;
   guint position;
-  
+
   g_return_if_fail (GTK_IS_FILE_SYSTEM_MODEL (model));
   g_return_if_fail (G_IS_FILE (file));
   g_return_if_fail (G_IS_FILE_INFO (info));
@@ -422,10 +422,9 @@ add_file (GtkFileSystemModel *model,
   position = model->files->len - 1;
 
   if (!model->frozen)
-    node_compute_visibility_and_filters (model, model->files->len -1);
+    node_compute_visibility_and_filters (model, position);
 
-  /* Ignore the first item */
-  g_list_model_items_changed (G_LIST_MODEL (model), position - 1, 0, 1);
+  g_list_model_items_changed (G_LIST_MODEL (model), position, 0, 1);
 }
 
 static void
@@ -655,7 +654,7 @@ gtk_file_system_model_update_file (GtkFileSystemModel *model,
   g_return_if_fail (G_IS_FILE_INFO (info));
 
   id = node_get_for_file (model, file);
-  if (id == 0)
+  if (id == GTK_INVALID_LIST_POSITION)
     {
       add_file (model, file, info);
       id = node_get_for_file (model, file);
@@ -811,9 +810,6 @@ _gtk_file_system_model_new (void)
   model = g_object_new (GTK_TYPE_FILE_SYSTEM_MODEL, NULL);
 
   model->files = g_array_sized_new (FALSE, FALSE, sizeof (FileModelNode), FILES_PER_QUERY);
-  /* add editable node at start */
-  g_array_set_size (model->files, 1);
-  memset (get_node (model, 0), 0, sizeof (FileModelNode));
 
   return model;
 }
@@ -971,7 +967,7 @@ _gtk_file_system_model_get_info_for_file (GtkFileSystemModel *model,
 
   i = node_get_for_file (model, file);
 
-  if (i == 0)
+  if (i == GTK_INVALID_LIST_POSITION)
     return NULL;
 
   node = get_node (model, i);