summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2022-04-07 00:17:45 +0100
committerAntónio Fernandes <antoniof@gnome.org>2023-01-10 01:49:12 +0000
commit45cd63d22ae8c4fd360cb3bb43620088a5f659c4 (patch)
tree3e874202e49ba0b74fa444ae0b0a68524980ef6b
parentdd4dbde1bcebe033b60859cdf1d351620788f0a5 (diff)
downloadnautilus-45cd63d22ae8c4fd360cb3bb43620088a5f659c4.tar.gz
list-view-item-ui: Show spinner while loading subfolders
The spinner is shown only after 1 second without the directory having finished loading, to avoid visual noise when directories loads quickly.
-rw-r--r--src/nautilus-list-view.c22
-rw-r--r--src/nautilus-name-cell.c53
-rw-r--r--src/nautilus-view-item.c27
-rw-r--r--src/nautilus-view-item.h2
-rw-r--r--src/resources/ui/nautilus-name-cell.ui8
5 files changed, 112 insertions, 0 deletions
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 3e5c9dbe3..47169b575 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -936,6 +936,18 @@ unload_file_timeout (gpointer data)
}
static void
+on_subdirectory_done_loading (NautilusDirectory *directory,
+ GtkTreeListRow *row)
+{
+ NautilusViewItem *item;
+
+ g_signal_handlers_disconnect_by_func (directory, on_subdirectory_done_loading, row);
+
+ item = NAUTILUS_VIEW_ITEM (gtk_tree_list_row_get_item (row));
+ nautilus_view_item_set_loading (item, FALSE);
+}
+
+static void
on_row_expanded_changed (GObject *gobject,
GParamSpec *pspec,
gpointer user_data)
@@ -961,9 +973,19 @@ on_row_expanded_changed (GObject *gobject,
{
nautilus_files_view_add_subdirectory (NAUTILUS_FILES_VIEW (self), directory);
}
+ if (!nautilus_directory_are_all_files_seen (directory))
+ {
+ nautilus_view_item_set_loading (item, TRUE);
+ g_signal_connect_object (directory,
+ "done-loading",
+ G_CALLBACK (on_subdirectory_done_loading),
+ row,
+ 0);
+ }
}
else
{
+ nautilus_view_item_set_loading (item, FALSE);
g_timeout_add_seconds (COLLAPSE_TO_UNLOAD_DELAY,
unload_file_timeout,
unload_delay_data_new (self, item, directory));
diff --git a/src/nautilus-name-cell.c b/src/nautilus-name-cell.c
index 567838dc4..155d0baf5 100644
--- a/src/nautilus-name-cell.c
+++ b/src/nautilus-name-cell.c
@@ -7,6 +7,8 @@
#include "nautilus-name-cell.h"
#include "nautilus-file-utilities.h"
+#define LOADING_TIMEOUT_SECONDS 1
+
struct _NautilusNameCell
{
NautilusViewCell parent_instance;
@@ -18,6 +20,7 @@ struct _NautilusNameCell
GtkWidget *expander;
GtkWidget *fixed_height_box;
+ GtkWidget *spinner;
GtkWidget *icon;
GtkWidget *label;
GtkWidget *emblems_box;
@@ -26,6 +29,7 @@ struct _NautilusNameCell
GtkWidget *path;
gboolean show_snippet;
+ guint loading_timeout_id;
};
G_DEFINE_TYPE (NautilusNameCell, nautilus_name_cell, NAUTILUS_TYPE_VIEW_CELL)
@@ -262,6 +266,52 @@ on_item_is_cut_changed (NautilusNameCell *self)
}
}
+static gboolean
+on_loading_timeout (gpointer user_data)
+{
+ NautilusNameCell *self = NAUTILUS_NAME_CELL (user_data);
+ gboolean is_loading;
+
+ g_object_get (nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)),
+ "is-loading", &is_loading,
+ NULL);
+ if (is_loading)
+ {
+ gtk_widget_set_visible (self->spinner, TRUE);
+ gtk_spinner_start (GTK_SPINNER (self->spinner));
+ }
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+on_item_is_loading_changed (GObject *object,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ NautilusNameCell *self = NAUTILUS_NAME_CELL (user_data);
+ gboolean is_loading;
+
+ if (object != G_OBJECT (nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self))))
+ {
+ return;
+ }
+
+ g_clear_handle_id (&self->loading_timeout_id, g_source_remove);
+ g_object_get (object, "is-loading", &is_loading, NULL);
+ if (is_loading)
+ {
+ self->loading_timeout_id = g_timeout_add_seconds (LOADING_TIMEOUT_SECONDS,
+ G_SOURCE_FUNC (on_loading_timeout),
+ self);
+ }
+ else
+ {
+ gtk_widget_set_visible (self->spinner, FALSE);
+ gtk_spinner_stop (GTK_SPINNER (self->spinner));
+ }
+}
+
static void
nautilus_name_cell_init (NautilusNameCell *self)
{
@@ -275,6 +325,8 @@ nautilus_name_cell_init (NautilusNameCell *self)
(GCallback) on_item_drag_accept_changed, self);
g_signal_group_connect_swapped (self->item_signal_group, "notify::is-cut",
(GCallback) on_item_is_cut_changed, self);
+ g_signal_group_connect_swapped (self->item_signal_group, "notify::is-loading",
+ (GCallback) on_item_is_loading_changed, self);
g_signal_group_connect_swapped (self->item_signal_group, "file-changed",
(GCallback) on_file_changed, self);
g_signal_connect_object (self->item_signal_group, "bind",
@@ -308,6 +360,7 @@ nautilus_name_cell_class_init (NautilusNameCellClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, expander);
gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, fixed_height_box);
+ gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, spinner);
gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, icon);
gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, label);
gtk_widget_class_bind_template_child (widget_class, NautilusNameCell, emblems_box);
diff --git a/src/nautilus-view-item.c b/src/nautilus-view-item.c
index 84423fa2d..31c11e3fe 100644
--- a/src/nautilus-view-item.c
+++ b/src/nautilus-view-item.c
@@ -12,6 +12,7 @@ struct _NautilusViewItem
guint icon_size;
gboolean is_cut;
gboolean drag_accept;
+ gboolean is_loading;
NautilusFile *file;
GtkWidget *item_ui;
};
@@ -25,6 +26,7 @@ enum
PROP_ICON_SIZE,
PROP_IS_CUT,
PROP_DRAG_ACCEPT,
+ PROP_IS_LOADING,
PROP_ITEM_UI,
N_PROPS
};
@@ -93,6 +95,12 @@ nautilus_view_item_get_property (GObject *object,
}
break;
+ case PROP_IS_LOADING:
+ {
+ g_value_set_boolean (value, self->is_loading);
+ }
+ break;
+
case PROP_ITEM_UI:
{
g_value_set_object (value, self->item_ui);
@@ -140,6 +148,12 @@ nautilus_view_item_set_property (GObject *object,
}
break;
+ case PROP_IS_LOADING:
+ {
+ self->is_loading = g_value_get_boolean (value);
+ }
+ break;
+
case PROP_ITEM_UI:
{
g_set_object (&self->item_ui, g_value_get_object (value));
@@ -186,6 +200,10 @@ nautilus_view_item_class_init (NautilusViewItemClass *klass)
"", "",
NAUTILUS_TYPE_FILE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ properties[PROP_IS_LOADING] = g_param_spec_boolean ("is-loading",
+ "", "",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
properties[PROP_ITEM_UI] = g_param_spec_object ("item-ui",
"", "",
GTK_TYPE_WIDGET,
@@ -246,6 +264,15 @@ nautilus_view_item_set_drag_accept (NautilusViewItem *self,
g_object_set (self, "drag-accept", drag_accept, NULL);
}
+void
+nautilus_view_item_set_loading (NautilusViewItem *self,
+ gboolean loading)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW_ITEM (self));
+
+ g_object_set (self, "is-loading", loading, NULL);
+}
+
NautilusFile *
nautilus_view_item_get_file (NautilusViewItem *self)
{
diff --git a/src/nautilus-view-item.h b/src/nautilus-view-item.h
index 9bdaff158..268b20929 100644
--- a/src/nautilus-view-item.h
+++ b/src/nautilus-view-item.h
@@ -28,6 +28,8 @@ void nautilus_view_item_set_cut (NautilusViewItem *self,
gboolean is_cut);
void nautilus_view_item_set_drag_accept (NautilusViewItem *self,
gboolean drag_accept);
+void nautilus_view_item_set_loading (NautilusViewItem *self,
+ gboolean is_loading);
NautilusFile * nautilus_view_item_get_file (NautilusViewItem *self);
diff --git a/src/resources/ui/nautilus-name-cell.ui b/src/resources/ui/nautilus-name-cell.ui
index bc755918d..49089e0e1 100644
--- a/src/resources/ui/nautilus-name-cell.ui
+++ b/src/resources/ui/nautilus-name-cell.ui
@@ -15,6 +15,14 @@
<property name="halign">fill</property>
<property name="valign">center</property>
<child>
+ <object class="GtkSpinner" id="spinner">
+ <property name="visible">False</property>
+ <property name="spinning">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
<object class="GtkBox" id="fixed_height_box">
<property name="orientation">vertical</property>
<property name="halign">center</property>