summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2021-11-25 16:42:07 +0000
committerAntónio Fernandes <antoniof@gnome.org>2021-12-06 00:24:52 +0000
commitcfdee53695ab8c0a2ac222523f0759cea358e018 (patch)
treef9ad2119478507f2bb48d1db6f523cf82b1355c5
parent57e3910e5ec9142f8b90c6ac6c6294f75f299371 (diff)
downloadnautilus-cfdee53695ab8c0a2ac222523f0759cea358e018.tar.gz
toolbar: Use list box for operations list
Using a GtkBox to display a dynamic list requires us to manually add and remove children, relying on the GtkContainer API, gone in GTK4. Instead, we can use GtkListBox, which we can pass a model and let it take care of creating and disposing of children for us. After the GTK4 switch, we should probably replace it with GtkListView to avoid the default behaviors of GtkListBox which we are adding workarounds for.
-rw-r--r--src/nautilus-toolbar.c36
-rw-r--r--src/resources/css/Adwaita.css7
-rw-r--r--src/resources/ui/nautilus-progress-info-widget.ui6
-rw-r--r--src/resources/ui/nautilus-toolbar.ui26
4 files changed, 46 insertions, 29 deletions
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index cd0cb368e..0addb85a6 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -90,7 +90,8 @@ struct _NautilusToolbar
GtkWidget *app_menu;
GtkWidget *operations_popover;
- GtkWidget *operations_container;
+ GtkWidget *operations_list;
+ GListStore *progress_infos_model;
GtkWidget *operations_revealer;
GtkWidget *operations_icon;
@@ -516,14 +517,10 @@ update_operations (NautilusToolbar *self)
{
GList *progress_infos;
GList *l;
- GtkWidget *progress;
gboolean should_show_progress_button = FALSE;
- gtk_container_foreach (GTK_CONTAINER (self->operations_container),
- (GtkCallback) gtk_widget_destroy,
- NULL);
-
disconnect_progress_infos (self);
+ g_list_store_remove_all (self->progress_infos_model);
progress_infos = get_filtered_progress_infos (self);
for (l = progress_infos; l != NULL; l = l->next)
@@ -537,10 +534,7 @@ update_operations (NautilusToolbar *self)
G_CALLBACK (on_progress_info_cancelled), self);
g_signal_connect_swapped (l->data, "progress-changed",
G_CALLBACK (on_progress_info_progress_changed), self);
- progress = nautilus_progress_info_widget_new (l->data);
- gtk_box_pack_start (GTK_BOX (self->operations_container),
- progress,
- FALSE, FALSE, 0);
+ g_list_store_append (self->progress_infos_model, l->data);
}
g_list_free (progress_infos);
@@ -887,6 +881,19 @@ on_location_entry_focus_changed (GObject *object,
}
}
+static GtkWidget *
+operations_list_create_widget (GObject *item,
+ gpointer user_data)
+{
+ NautilusProgressInfo *info = NAUTILUS_PROGRESS_INFO (item);
+ GtkWidget *widget;
+
+ widget = nautilus_progress_info_widget_new (info);
+ gtk_widget_show_all (widget);
+
+ return widget;
+}
+
static void
nautilus_toolbar_constructed (GObject *object)
{
@@ -912,6 +919,12 @@ nautilus_toolbar_constructed (GObject *object)
g_signal_connect (self->progress_manager, "has-viewers-changed",
G_CALLBACK (on_progress_has_viewers_changed), self);
+ self->progress_infos_model = g_list_store_new (NAUTILUS_TYPE_PROGRESS_INFO);
+ gtk_list_box_bind_model (GTK_LIST_BOX (self->operations_list),
+ G_LIST_MODEL (self->progress_infos_model),
+ (GtkListBoxCreateWidgetFunc) operations_list_create_widget,
+ NULL,
+ NULL);
update_operations (self);
self->back_button_longpress_gesture = gtk_gesture_long_press_new (self->back_button);
@@ -1149,6 +1162,7 @@ nautilus_toolbar_finalize (GObject *obj)
unschedule_operations_start (self);
unschedule_operations_button_attention_style (self);
+ g_clear_object (&self->progress_infos_model);
g_signal_handlers_disconnect_by_data (self->progress_manager, self);
g_clear_object (&self->progress_manager);
@@ -1212,7 +1226,7 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_button);
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_icon);
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_popover);
- gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_container);
+ gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_list);
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, operations_revealer);
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, view_button);
gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, view_toggle_button);
diff --git a/src/resources/css/Adwaita.css b/src/resources/css/Adwaita.css
index 68c3e424c..03acabd4a 100644
--- a/src/resources/css/Adwaita.css
+++ b/src/resources/css/Adwaita.css
@@ -42,6 +42,13 @@
animation-iteration-count: 3;
}
+/* Remove white background and highlight on hover which GTK adds by default
+ * to GtkListBox. TODO: Switch to GtkListView and drop this CSS hack. */
+.operations-list,
+.operations-list > :hover {
+ background: none;
+}
+
.disclosure-button {
padding-left: 4px;
padding-right: 4px;
diff --git a/src/resources/ui/nautilus-progress-info-widget.ui b/src/resources/ui/nautilus-progress-info-widget.ui
index ac10a9da8..629d7e796 100644
--- a/src/resources/ui/nautilus-progress-info-widget.ui
+++ b/src/resources/ui/nautilus-progress-info-widget.ui
@@ -10,8 +10,10 @@
<template class="NautilusProgressInfoWidget" parent="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin_start">5</property>
- <property name="margin_end">5</property>
+ <property name="margin_start">6</property>
+ <property name="margin_end">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
<child>
<object class="GtkLabel" id="status">
<property name="width_request">300</property>
diff --git a/src/resources/ui/nautilus-toolbar.ui b/src/resources/ui/nautilus-toolbar.ui
index a1e6fccec..359f80aec 100644
--- a/src/resources/ui/nautilus-toolbar.ui
+++ b/src/resources/ui/nautilus-toolbar.ui
@@ -405,24 +405,18 @@
<property name="max_content_height">270</property>
<property name="propagate_natural_height">True</property>
<child>
- <object class="GtkViewport">
+ <object class="GtkListBox" id="operations_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <child>
- <object class="GtkBox" id="operations_container">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_start">12</property>
- <property name="margin_end">12</property>
- <property name="margin_top">12</property>
- <property name="margin_bottom">12</property>
- <property name="orientation">vertical</property>
- <property name="spacing">10</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
+ <property name="margin_start">6</property>
+ <property name="margin_end">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <property name="selection-mode">none</property>
+ <property name="activate-on-single-click">False</property>
+ <style>
+ <class name="operations-list"/>
+ </style>
</object>
</child>
</object>