Fully support GNOME's inode/directory mechanism

This commit is contained in:
2022-01-12 11:12:01 +01:00
parent f632510d2a
commit 757bc9beaa
3 changed files with 27 additions and 11 deletions

View File

@@ -1550,12 +1550,9 @@ on_model_files_changed(FivIoModel *model, FivBrowser *self)
{
g_return_if_fail(model == self->model);
int selected = -1;
gchar *selected_uri = NULL;
if (self->selected) {
if (self->selected)
selected_uri = g_strdup(self->selected->uri);
self->selected = NULL;
}
// TODO(p): Later implement arguments.
thumbnailers_abort(self);
@@ -1566,16 +1563,12 @@ on_model_files_changed(FivIoModel *model, FivBrowser *self)
for (guint i = 0; i < files->len; i++) {
g_array_append_val(self->entries,
((Entry) {.thumbnail = NULL, .uri = files->pdata[i]}));
if (!g_strcmp0(selected_uri, files->pdata[i]))
selected = i;
files->pdata[i] = NULL;
}
g_ptr_array_free(files, TRUE);
// Beware that the pointer may shift with the storage.
fiv_browser_select(self, selected_uri);
g_free(selected_uri);
if (selected >= 0)
self->selected = &g_array_index(self->entries, Entry, selected);
reload_thumbnails(self);
thumbnailers_start(self);
@@ -1594,3 +1587,24 @@ fiv_browser_new(FivIoModel *model)
on_model_files_changed(self->model, self);
return GTK_WIDGET(self);
}
void
fiv_browser_select(FivBrowser *self, const char *uri)
{
g_return_if_fail(FIV_IS_BROWSER(self));
self->selected = NULL;
gtk_widget_queue_draw(GTK_WIDGET(self));
if (!uri)
return;
for (guint i = 0; i < self->entries->len; i++) {
const Entry *entry = &g_array_index(self->entries, Entry, i);
if (!g_strcmp0(entry->uri, uri)) {
self->selected = entry;
break;
}
}
// TODO(p): Scroll to selection.
}