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
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);
return i;
}
- return 0;
+ return GTK_INVALID_LIST_POSITION;
}
/*** GListModel ***/
{
GtkFileSystemModel *model = GTK_FILE_SYSTEM_MODEL (list_model);
- return model->files->len - 1;
+ return model->files->len;
}
static gpointer
/* 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);
}
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;
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);
{
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));
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
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);
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;
}
i = node_get_for_file (model, file);
- if (i == 0)
+ if (i == GTK_INVALID_LIST_POSITION)
return NULL;
node = get_node (model, i);