Avoid needless data duplication
And turn the initial load hack into somewhat clean-looking.
This commit is contained in:
parent
5e10f0ba54
commit
00fa76cb69
42
fiv.c
42
fiv.c
|
@ -603,10 +603,9 @@ struct {
|
||||||
gchar *directory; ///< URI of the currently browsed directory
|
gchar *directory; ///< URI of the currently browsed directory
|
||||||
GList *directory_back; ///< History paths as URIs going backwards
|
GList *directory_back; ///< History paths as URIs going backwards
|
||||||
GList *directory_forward; ///< History paths as URIs going forwards
|
GList *directory_forward; ///< History paths as URIs going forwards
|
||||||
GPtrArray *files; ///< "directory" contents as URIs
|
|
||||||
|
|
||||||
gchar *uri; ///< Current image URI, if any
|
gchar *uri; ///< Current image URI, if any
|
||||||
gint files_index; ///< Where "uri" is within "files"
|
gint files_index; ///< Where "uri" is within the model's files
|
||||||
|
|
||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
GtkWidget *menu;
|
GtkWidget *menu;
|
||||||
|
@ -691,9 +690,12 @@ parent_uri(GFile *child_file)
|
||||||
static void
|
static void
|
||||||
update_files_index(void)
|
update_files_index(void)
|
||||||
{
|
{
|
||||||
|
gsize files_len = 0;
|
||||||
|
FivIoModelEntry *const *files = fiv_io_model_get_files(g.model, &files_len);
|
||||||
|
|
||||||
g.files_index = -1;
|
g.files_index = -1;
|
||||||
for (guint i = 0; i < g.files->len; i++)
|
for (guint i = 0; i < files_len; i++)
|
||||||
if (!g_strcmp0(g.uri, g_ptr_array_index(g.files, i)))
|
if (!g_strcmp0(g.uri, files[i]->uri))
|
||||||
g.files_index = i;
|
g.files_index = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,19 +784,13 @@ on_model_files_changed(FivIoModel *model, G_GNUC_UNUSED gpointer user_data)
|
||||||
{
|
{
|
||||||
g_return_if_fail(model == g.model);
|
g_return_if_fail(model == g.model);
|
||||||
|
|
||||||
gsize len = 0;
|
gsize files_len = 0;
|
||||||
FivIoModelEntry *const *files = fiv_io_model_get_files(g.model, &len);
|
(void) fiv_io_model_get_files(g.model, &files_len);
|
||||||
g_ptr_array_free(g.files, TRUE);
|
|
||||||
g.files = g_ptr_array_new_full(len, g_free);
|
|
||||||
for (gsize i = 0; i < len; i++)
|
|
||||||
g_ptr_array_add(g.files, g_strdup(files[i]->uri));
|
|
||||||
|
|
||||||
update_files_index();
|
update_files_index();
|
||||||
|
|
||||||
gtk_widget_set_sensitive(
|
gtk_widget_set_sensitive(g.toolbar[TOOLBAR_FILE_PREVIOUS], files_len > 1);
|
||||||
g.toolbar[TOOLBAR_FILE_PREVIOUS], g.files->len > 1);
|
gtk_widget_set_sensitive(g.toolbar[TOOLBAR_FILE_NEXT], files_len > 1);
|
||||||
gtk_widget_set_sensitive(
|
|
||||||
g.toolbar[TOOLBAR_FILE_NEXT], g.files->len > 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -874,8 +870,8 @@ open_image(const char *uri)
|
||||||
// So that load_directory() itself can be used for reloading.
|
// So that load_directory() itself can be used for reloading.
|
||||||
gchar *parent = parent_uri(file);
|
gchar *parent = parent_uri(file);
|
||||||
g_object_unref(file);
|
g_object_unref(file);
|
||||||
if (!g.files->len /* hack to always load the directory after launch */ ||
|
if (!fiv_io_model_get_location(g.model) || !g.directory ||
|
||||||
!g.directory || strcmp(parent, g.directory))
|
strcmp(parent, g.directory))
|
||||||
load_directory_without_switching(parent);
|
load_directory_without_switching(parent);
|
||||||
else
|
else
|
||||||
update_files_index();
|
update_files_index();
|
||||||
|
@ -948,18 +944,22 @@ on_open(void)
|
||||||
static void
|
static void
|
||||||
on_previous(void)
|
on_previous(void)
|
||||||
{
|
{
|
||||||
|
gsize files_len = 0;
|
||||||
|
FivIoModelEntry *const *files = fiv_io_model_get_files(g.model, &files_len);
|
||||||
if (g.files_index >= 0) {
|
if (g.files_index >= 0) {
|
||||||
int previous = (g.files->len + g.files_index - 1) % g.files->len;
|
int previous = (files_len + g.files_index - 1) % files_len;
|
||||||
open_image(g_ptr_array_index(g.files, previous));
|
open_image(files[previous]->uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_next(void)
|
on_next(void)
|
||||||
{
|
{
|
||||||
|
gsize files_len = 0;
|
||||||
|
FivIoModelEntry *const *files = fiv_io_model_get_files(g.model, &files_len);
|
||||||
if (g.files_index >= 0) {
|
if (g.files_index >= 0) {
|
||||||
int next = (g.files_index + 1) % g.files->len;
|
int next = (g.files_index + 1) % files_len;
|
||||||
open_image(g_ptr_array_index(g.files, next));
|
open_image(files[next]->uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2378,7 +2378,7 @@ main(int argc, char *argv[])
|
||||||
// interpret multiple command line arguments differently, as a collection.
|
// interpret multiple command line arguments differently, as a collection.
|
||||||
// However, single-element collections are unrepresentable this way.
|
// However, single-element collections are unrepresentable this way.
|
||||||
// Should we allow multiple targets only in a special new mode?
|
// Should we allow multiple targets only in a special new mode?
|
||||||
g.files = g_ptr_array_new_full(0, g_free);
|
g.files_index = -1;
|
||||||
if (args) {
|
if (args) {
|
||||||
const gchar *target = *args;
|
const gchar *target = *args;
|
||||||
if (args[1]) {
|
if (args[1]) {
|
||||||
|
|
Loading…
Reference in New Issue