Sort files in the browser as well
This commit is contained in:
parent
5fea2245f1
commit
1c57eef05a
|
@ -768,6 +768,19 @@ fastiv_browser_init(FastivBrowser *self)
|
||||||
|
|
||||||
// --- Public interface --------------------------------------------------------
|
// --- Public interface --------------------------------------------------------
|
||||||
|
|
||||||
|
static gint
|
||||||
|
entry_compare(gconstpointer a, gconstpointer b)
|
||||||
|
{
|
||||||
|
const Entry *entry1 = a;
|
||||||
|
const Entry *entry2 = b;
|
||||||
|
GFile *location1 = g_file_new_for_path(entry1->filename);
|
||||||
|
GFile *location2 = g_file_new_for_path(entry2->filename);
|
||||||
|
gint result = fastiv_io_filecmp(location1, location2);
|
||||||
|
g_object_unref(location1);
|
||||||
|
g_object_unref(location2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fastiv_browser_load(
|
fastiv_browser_load(
|
||||||
FastivBrowser *self, FastivBrowserFilterCallback cb, const char *path)
|
FastivBrowser *self, FastivBrowserFilterCallback cb, const char *path)
|
||||||
|
@ -791,8 +804,6 @@ fastiv_browser_load(
|
||||||
break;
|
break;
|
||||||
if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY)
|
if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// TODO(p): Support being passed a sort function.
|
|
||||||
if (cb && !cb(g_file_info_get_name(info)))
|
if (cb && !cb(g_file_info_get_name(info)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -801,6 +812,8 @@ fastiv_browser_load(
|
||||||
}
|
}
|
||||||
g_object_unref(enumerator);
|
g_object_unref(enumerator);
|
||||||
|
|
||||||
// TODO(p): Sort the entries before.
|
// TODO(p): Support being passed a sort function.
|
||||||
|
g_array_sort(self->entries, entry_compare);
|
||||||
|
|
||||||
reload_thumbnails(self);
|
reload_thumbnails(self);
|
||||||
}
|
}
|
||||||
|
|
16
fastiv-io.c
16
fastiv-io.c
|
@ -1048,3 +1048,19 @@ fastiv_io_lookup_thumbnail(const gchar *target, FastivIoThumbnailSize size)
|
||||||
g_free(uri);
|
g_free(uri);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fastiv_io_filecmp(GFile *location1, GFile *location2)
|
||||||
|
{
|
||||||
|
if (g_file_has_prefix(location1, location2))
|
||||||
|
return +1;
|
||||||
|
if (g_file_has_prefix(location2, location1))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
gchar *name1 = g_file_get_parse_name(location1);
|
||||||
|
gchar *name2 = g_file_get_parse_name(location2);
|
||||||
|
int result = g_utf8_collate(name1, name2);
|
||||||
|
g_free(name1);
|
||||||
|
g_free(name2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -57,3 +57,5 @@ cairo_surface_t *fastiv_io_open_from_data(
|
||||||
const char *data, size_t len, const gchar *path, GError **error);
|
const char *data, size_t len, const gchar *path, GError **error);
|
||||||
cairo_surface_t *fastiv_io_lookup_thumbnail(
|
cairo_surface_t *fastiv_io_lookup_thumbnail(
|
||||||
const gchar *target, FastivIoThumbnailSize size);
|
const gchar *target, FastivIoThumbnailSize size);
|
||||||
|
|
||||||
|
int fastiv_io_filecmp(GFile *f1, GFile *f2);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include "fastiv-io.h" // fastiv_io_filecmp
|
||||||
#include "fastiv-sidebar.h"
|
#include "fastiv-sidebar.h"
|
||||||
|
|
||||||
struct _FastivSidebar {
|
struct _FastivSidebar {
|
||||||
|
@ -107,24 +108,12 @@ create_row(GFile *file, const char *icon_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
listbox_sort(
|
listbox_compare(
|
||||||
GtkListBoxRow *row1, GtkListBoxRow *row2, G_GNUC_UNUSED gpointer user_data)
|
GtkListBoxRow *row1, GtkListBoxRow *row2, G_GNUC_UNUSED gpointer user_data)
|
||||||
{
|
{
|
||||||
GFile *location1 =
|
return fastiv_io_filecmp(
|
||||||
g_object_get_qdata(G_OBJECT(row1), fastiv_sidebar_location_quark());
|
g_object_get_qdata(G_OBJECT(row1), fastiv_sidebar_location_quark()),
|
||||||
GFile *location2 =
|
g_object_get_qdata(G_OBJECT(row2), fastiv_sidebar_location_quark()));
|
||||||
g_object_get_qdata(G_OBJECT(row2), fastiv_sidebar_location_quark());
|
|
||||||
if (g_file_has_prefix(location1, location2))
|
|
||||||
return +1;
|
|
||||||
if (g_file_has_prefix(location2, location1))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
gchar *name1 = g_file_get_parse_name(location1);
|
|
||||||
gchar *name2 = g_file_get_parse_name(location2);
|
|
||||||
gint result = g_utf8_collate(name1, name2);
|
|
||||||
g_free(name1);
|
|
||||||
g_free(name2);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -371,7 +360,7 @@ fastiv_sidebar_init(FastivSidebar *self)
|
||||||
g_signal_connect(self->listbox, "row-activated",
|
g_signal_connect(self->listbox, "row-activated",
|
||||||
G_CALLBACK(on_open_breadcrumb), self);
|
G_CALLBACK(on_open_breadcrumb), self);
|
||||||
gtk_list_box_set_sort_func(
|
gtk_list_box_set_sort_func(
|
||||||
GTK_LIST_BOX(self->listbox), listbox_sort, self, NULL);
|
GTK_LIST_BOX(self->listbox), listbox_compare, self, NULL);
|
||||||
|
|
||||||
// Fill up what would otherwise be wasted space,
|
// Fill up what would otherwise be wasted space,
|
||||||
// as it is in the examples of Nautilus and Thunar.
|
// as it is in the examples of Nautilus and Thunar.
|
||||||
|
|
Loading…
Reference in New Issue