filesystemmodel: Retire GtkFileSystemItem

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.
This commit is contained in:
Georges Basile Stavracas Neto 2022-10-09 18:52:12 -03:00 committed by Matthias Clasen
parent 4e3fbd0b0f
commit f520801626
7 changed files with 196 additions and 316 deletions

View 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);

View 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;
}

View 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__ */

View 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]);
}
}

View 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

View 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)

View File

@ -170,13 +170,15 @@
<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>
@ -187,9 +189,9 @@
<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>
@ -223,10 +225,14 @@
<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>
@ -253,13 +259,13 @@
<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>
@ -287,13 +293,13 @@
<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>
@ -318,15 +324,15 @@
<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>
@ -338,9 +344,7 @@
</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>