[nautilus/wip/antoniof/new_open_with: 24/31] properties-window: Use GtkStack for navigation
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/antoniof/new_open_with: 24/31] properties-window: Use GtkStack for navigation
- Date: Thu, 28 Jul 2022 18:21:26 +0000 (UTC)
commit 1d3e7ec914faf9007325483ceb0991c6e99d8a73
Author: Peter Eisenmann <p3732 getgoogleoff me>
Date: Fri Dec 31 08:12:29 2021 +0100
properties-window: Use GtkStack for navigation
Replace the tabbed GtkNotebook view with inlined navigation rows that
link to subpages and a back button that allows navigating back.
Add additional needed getters to NautilusPropertyPage.
Also, replace the now-inadequate .view style class with .background.
Part of #1326
libnautilus-extension/nautilus-property-page.c | 18 +++
libnautilus-extension/nautilus-property-page.h | 25 ++++
src/nautilus-properties-window.c | 192 +++++++++++++++----------
src/resources/ui/nautilus-properties-window.ui | 175 +++++++++++++++-------
4 files changed, 289 insertions(+), 121 deletions(-)
---
diff --git a/libnautilus-extension/nautilus-property-page.c b/libnautilus-extension/nautilus-property-page.c
index dad8e5315..bd37a3602 100644
--- a/libnautilus-extension/nautilus-property-page.c
+++ b/libnautilus-extension/nautilus-property-page.c
@@ -222,3 +222,21 @@ nautilus_property_page_class_init (NautilusPropertyPageClass *class)
GTK_TYPE_WIDGET,
G_PARAM_READWRITE));
}
+
+GtkWidget *
+nautilus_property_page_get_label (NautilusPropertyPage *page)
+{
+ return page->label;
+}
+
+const char *
+nautilus_property_page_get_name (NautilusPropertyPage *page)
+{
+ return page->name;
+}
+
+GtkWidget *
+nautilus_property_page_get_widget (NautilusPropertyPage *page)
+{
+ return page->page;
+}
diff --git a/libnautilus-extension/nautilus-property-page.h b/libnautilus-extension/nautilus-property-page.h
index 35181fe10..d9b51bf4f 100644
--- a/libnautilus-extension/nautilus-property-page.h
+++ b/libnautilus-extension/nautilus-property-page.h
@@ -68,4 +68,29 @@ NautilusPropertyPage *nautilus_property_page_new (const char *name,
* page (widget) - the property page to display
*/
+/**
+ * nautilus_property_page_get_label:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the label of this #NautilusPropertyPage
+ */
+GtkWidget * nautilus_property_page_get_label (NautilusPropertyPage *page);
+
+/**
+ * nautilus_property_page_get_name:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the name of this #NautilusPropertyPage
+ */
+const char *nautilus_property_page_get_name (NautilusPropertyPage *page);
+
+/**
+ * nautilus_property_page_get_widget:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the widget associated wtih this #NautilusPropertyPage
+ */
+GtkWidget * nautilus_property_page_get_widget (NautilusPropertyPage *page);
+
+
G_END_DECLS
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index e6056581d..02ae39c82 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -46,6 +46,7 @@
#include "nautilus-metadata.h"
#include "nautilus-mime-actions.h"
#include "nautilus-module.h"
+#include "nautilus-property-page.h"
#include "nautilus-signaller.h"
#include "nautilus-ui-utilities.h"
@@ -77,9 +78,11 @@ struct _NautilusPropertiesWindow
GList *original_files;
GList *target_files;
- GtkNotebook *notebook;
+ AdwWindowTitle *window_title;
- /* Basic tab widgets */
+ GtkStack *page_stack;
+
+ /* Basic page */
GtkStack *icon_stack;
GtkWidget *icon_image;
@@ -97,6 +100,8 @@ struct _NautilusPropertiesWindow
GtkWidget *disk_space_free_value;
GtkWidget *disk_space_capacity_value;
+ GtkWidget *open_with_navigation_row;
+
GtkWidget *link_target_row;
GtkWidget *link_target_value_label;
GtkWidget *size_row;
@@ -121,11 +126,14 @@ struct _NautilusPropertiesWindow
GtkWidget *accessed_row;
GtkWidget *accessed_value_label;
+ GtkWidget *permissions_navigation_row;
+
+ GtkListBox *extension_list_box;
+
GtkWidget *free_space_list_box;
GtkWidget *free_space_value_label;
-
- /* Permissions tab Widgets */
+ /* Permissions page */
GtkWidget *permissions_stack;
@@ -159,7 +167,7 @@ struct _NautilusPropertiesWindow
GtkWidget *change_permissions_button_box;
GtkWidget *change_permissions_button;
- /* Open With tab Widgets */
+ /* Open With page */
GtkWidget *open_with_box;
GtkWidget *open_with_label;
@@ -472,7 +480,7 @@ static void set_icon (const char *icon_path,
static void remove_pending (StartupData *data,
gboolean cancel_call_when_ready,
gboolean cancel_timed_wait);
-static void append_extension_pages (NautilusPropertiesWindow *self);
+static void refresh_extension_pages (NautilusPropertiesWindow *self);
G_DEFINE_TYPE (NautilusPropertiesWindow, nautilus_properties_window, ADW_TYPE_WINDOW);
@@ -532,6 +540,39 @@ get_target_file (NautilusPropertiesWindow *self)
return NAUTILUS_FILE (self->target_files->data);
}
+static void
+navigate_main_page (NautilusPropertiesWindow *self,
+ GParamSpec *params,
+ GtkWidget *widget)
+{
+ gtk_stack_set_visible_child_name (self->page_stack, "main");
+}
+
+static void
+navigate_open_with_page (NautilusPropertiesWindow *self,
+ GParamSpec *params,
+ GtkWidget *widget)
+{
+ gtk_stack_set_visible_child_name (self->page_stack, "open-with");
+}
+
+static void
+navigate_permissions_page (NautilusPropertiesWindow *self,
+ GParamSpec *params,
+ GtkWidget *widget)
+{
+ gtk_stack_set_visible_child_name (self->page_stack, "permissions");
+}
+
+static void
+navigate_extension_page (NautilusPropertiesWindow *self,
+ GParamSpec *params,
+ AdwPreferencesRow *row)
+{
+ gtk_stack_set_visible_child_name (self->page_stack,
+ adw_preferences_row_get_title (row));
+}
+
static void
get_image_for_properties_window (NautilusPropertiesWindow *self,
char **icon_name,
@@ -541,7 +582,7 @@ get_image_for_properties_window (NautilusPropertiesWindow *self,
GList *l;
gint icon_scale;
- icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (self->notebook));
+ icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (self));
/* FIXME: Temporary regression: HiDPI icons not supported, ignore scale. */
icon_scale = 1;
@@ -877,36 +918,53 @@ update_properties_window_title (NautilusPropertiesWindow *self)
gtk_window_set_title (GTK_WINDOW (self), title);
}
-static void
-clear_extension_pages (NautilusPropertiesWindow *self)
+static GtkWidget *
+add_extension_page (NautilusPropertyPage *property_page,
+ NautilusPropertiesWindow *self)
{
- int i;
- int num_pages;
- GtkWidget *page;
+ GtkWidget *row;
+ GtkWidget *image;
+ GtkWidget *page_widget;
+ GtkWidget *header_bar;
+ GtkWidget *up_button;
+ GtkWidget *box;
+ const char *extension_type;
+ g_autofree char *navigation_label;
+
+ row = adw_action_row_new ();
+ image = gtk_image_new_from_icon_name ("go-next-symbolic");
+ extension_type = gtk_label_get_text (GTK_LABEL (nautilus_property_page_get_label (property_page)));
+ navigation_label = g_strdup_printf (_("%s Properties"), extension_type);
+ page_widget = nautilus_property_page_get_widget (property_page);
+
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), navigation_label);
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row), image);
+
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+ gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), FALSE);
+
+ g_signal_connect_swapped (row, "activated",
+ G_CALLBACK (navigate_extension_page),
+ self);
- num_pages = gtk_notebook_get_n_pages
- (GTK_NOTEBOOK (self->notebook));
+ header_bar = gtk_header_bar_new ();
+ gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar),
+ adw_window_title_new (navigation_label, NULL));
- for (i = 0; i < num_pages; i++)
- {
- page = gtk_notebook_get_nth_page
- (GTK_NOTEBOOK (self->notebook), i);
+ up_button = gtk_button_new_from_icon_name ("go-previous-symbolic");
+ g_signal_connect_swapped (up_button, "clicked", G_CALLBACK (navigate_main_page), self);
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), up_button);
- if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (page), "is-extension-page")))
- {
- gtk_notebook_remove_page
- (GTK_NOTEBOOK (self->notebook), i);
- num_pages--;
- i--;
- }
- }
-}
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_append (GTK_BOX (box), header_bar);
+ gtk_box_append (GTK_BOX (box), page_widget);
+ gtk_widget_add_css_class (page_widget, "background");
-static void
-refresh_extension_pages (NautilusPropertiesWindow *self)
-{
- clear_extension_pages (self);
- append_extension_pages (self);
+ gtk_stack_add_named (self->page_stack,
+ box,
+ navigation_label);
+
+ return row;
}
static void
@@ -3458,48 +3516,32 @@ setup_permissions_page (NautilusPropertiesWindow *self)
}
static void
-append_extension_pages (NautilusPropertiesWindow *self)
+refresh_extension_pages (NautilusPropertiesWindow *self)
{
- g_autolist (GObject) providers = NULL;
- GList *p;
+ GListStore *extension_providers = g_list_store_new (NAUTILUS_TYPE_PROPERTY_PAGE);
+ g_autolist (GObject) providers =
+ nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
- providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
-
- for (p = providers; p != NULL; p = p->next)
+ for (GList *p = providers; p != NULL; p = p->next)
{
- NautilusPropertyPageProvider *provider;
- g_autolist (NautilusPropertyPage) pages = NULL;
- GList *l;
+ NautilusPropertyPageProvider *provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
+ g_autolist (NautilusPropertyPage) pages =
+ nautilus_property_page_provider_get_pages (provider, self->original_files);
- provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
-
- pages = nautilus_property_page_provider_get_pages
- (provider, self->original_files);
-
- for (l = pages; l != NULL; l = l->next)
+ for (GList *l = pages; l != NULL; l = l->next)
{
- NautilusPropertyPage *page;
- g_autoptr (GtkWidget) page_widget = NULL;
- g_autoptr (GtkWidget) label = NULL;
-
- page = NAUTILUS_PROPERTY_PAGE (l->data);
-
- g_object_get (G_OBJECT (page),
- "page", &page_widget, "label", &label,
- NULL);
-
- gtk_notebook_append_page (self->notebook,
- page_widget, label);
- g_object_set (gtk_notebook_get_page (GTK_NOTEBOOK (self->notebook),
- GTK_WIDGET (page_widget)),
- "tab-expand", TRUE,
- NULL);
-
- g_object_set_data (G_OBJECT (page_widget),
- "is-extension-page",
- GINT_TO_POINTER (TRUE));
+ g_list_store_append (extension_providers, NAUTILUS_PROPERTY_PAGE (l->data));
}
}
+
+ gtk_widget_set_visible (GTK_WIDGET (self->extension_list_box),
+ g_list_model_get_n_items (G_LIST_MODEL (extension_providers)) > 0);
+
+ gtk_list_box_bind_model (self->extension_list_box,
+ G_LIST_MODEL (extension_providers),
+ (GtkListBoxCreateWidgetFunc) add_extension_page,
+ self,
+ NULL);
}
static gboolean
@@ -4037,17 +4079,17 @@ create_properties_window (StartupData *startup_data)
if (should_show_permissions (window))
{
setup_permissions_page (window);
- gtk_widget_show (window->permissions_stack);
+ gtk_widget_show (window->permissions_navigation_row);
}
if (should_show_open_with (window))
{
setup_open_with_page (window);
- gtk_widget_show (window->open_with_box);
+ gtk_widget_show (window->open_with_navigation_row);
}
- /* append pages from available views */
- append_extension_pages (window);
+ /* Add available extension pages */
+ refresh_extension_pages (window);
/* Update from initial state */
properties_window_update (window, NULL);
@@ -4571,7 +4613,7 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/nautilus/ui/nautilus-properties-window.ui");
- gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, notebook);
+ gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, page_stack);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_stack);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_image);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_button);
@@ -4584,6 +4626,7 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_used_value);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_free_value);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_capacity_value);
+ gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, open_with_navigation_row);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, link_target_row);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, link_target_value_label);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, size_row);
@@ -4603,6 +4646,8 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, created_value_label);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, accessed_row);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, accessed_value_label);
+ gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow,
permissions_navigation_row);
+ gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, extension_list_box);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, free_space_list_box);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, free_space_value_label);
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, permissions_stack);
@@ -4637,6 +4682,9 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, set_as_default_button);
gtk_widget_class_bind_template_callback (widget_class, open_in_disks);
+ gtk_widget_class_bind_template_callback (widget_class, navigate_main_page);
+ gtk_widget_class_bind_template_callback (widget_class, navigate_permissions_page);
+ gtk_widget_class_bind_template_callback (widget_class, navigate_open_with_page);
}
static void
diff --git a/src/resources/ui/nautilus-properties-window.ui b/src/resources/ui/nautilus-properties-window.ui
index 1644dd196..19b5add7a 100644
--- a/src/resources/ui/nautilus-properties-window.ui
+++ b/src/resources/ui/nautilus-properties-window.ui
@@ -5,27 +5,29 @@
<property name="focusable">False</property>
<property name="modal">True</property>
<child>
- <object class="GtkBox" id="content_box">
- <property name="orientation">vertical</property>
+ <object class="GtkStack" id="page_stack">
+ <property name="hexpand">True</property>
+ <property name="transition-type">over-left-right</property>
<child>
- <object class="AdwHeaderBar"/>
- </child>
- <child>
- <object class="GtkNotebook" id="notebook">
- <property name="hexpand">True</property>
- <property name="focusable">True</property>
- <property name="show_border">False</property>
- <child>
- <object class="GtkNotebookPage">
- <property name="tab_expand">True</property>
- <property name="child">
+ <object class="GtkStackPage">
+ <property name="name">main</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHeaderBar"/>
+ </child>
+ <child>
<object class="GtkBox" id="basic_box">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<property name="margin-top">18</property>
<property name="margin-bottom">18</property>
<property name="margin-start">18</property>
<property name="margin-end">18</property>
- <property name="orientation">vertical</property>
- <property name="spacing">12</property>
+ <style>
+ <class name="background"/>
+ </style>
<child>
<object class="GtkStack" id="icon_stack">
<property name="halign">center</property>
@@ -243,6 +245,21 @@
<child>
<object class="GtkListBox" id="file_data_list_box">
<property name="selection-mode">none</property>
+ <child>
+ <object class="AdwActionRow" id="open_with_navigation_row">
+ <property name="visible">False</property>
+ <property name="activatable">True</property>
+ <property name="selectable">False</property>
+ <property name="title" translatable="yes">_Open With</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="navigate_open_with_page"
object="NautilusPropertiesWindow" swapped="yes"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-next-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
<child>
<object class="AdwActionRow" id="link_target_row">
<property name="visible">False</property>
@@ -506,6 +523,40 @@
</style>
</object>
</child>
+ <child>
+ <object class="GtkListBox" id="permissions_list_box">
+ <property name="selection-mode">none</property>
+ <child>
+ <object class="AdwActionRow" id="permissions_navigation_row">
+ <property name="activatable">True</property>
+ <property name="selectable">False</property>
+ <property name="title" translatable="yes">Set Custom _Permissions</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="navigate_permissions_page"
object="NautilusPropertiesWindow" swapped="yes"/>
+ <child>
+ <object class="GtkBox" id="permissions_navigation_action_box">
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-next-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="extension_list_box">
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
<child>
<object class="GtkListBox" id="free_space_list_box">
<property name="visible">False</property>
@@ -702,24 +753,41 @@
</object>
</child>
</object>
- </property>
- <property name="tab">
- <object class="GtkLabel" id="basic_label">
- <property name="label" translatable="yes">Basic</property>
- </object>
- </property>
+ </child>
</object>
- </child>
- <child>
- <object class="GtkNotebookPage">
- <property name="tab_expand">True</property>
- <property name="child">
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">permissions</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHeaderBar">
+ <property name="title-widget">
+ <object class="AdwWindowTitle">
+ <property name="title" translatable="yes">Set Custom Permissions</property>
+ </object>
+ </property>
+ <child type="start">
+ <object class="GtkButton">
+ <property name="icon-name">go-previous-symbolic</property>
+ <signal name="clicked" handler="navigate_main_page"
object="NautilusPropertiesWindow" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<object class="GtkStack" id="permissions_stack">
- <property name="visible">True</property>
<property name="margin-top">18</property>
<property name="margin-bottom">18</property>
<property name="margin-start">18</property>
<property name="margin-end">18</property>
+ <style>
+ <class name="background"/>
+ </style>
<child>
<object class="GtkStackPage">
<property name="name">permission-indeterminable</property>
@@ -953,24 +1021,41 @@
</object>
</child>
</object>
- </property>
- <property name="tab">
- <object class="GtkLabel" id="permissions_label">
- <property name="label" translatable="yes">Permissions</property>
- </object>
- </property>
+ </child>
</object>
- </child>
- <child>
- <object class="GtkNotebookPage">
- <property name="tab_expand">True</property>
- <property name="child">
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">open-with</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHeaderBar">
+ <property name="title-widget">
+ <object class="AdwWindowTitle">
+ <property name="title" translatable="yes">Open With</property>
+ </object>
+ </property>
+ <child type="start">
+ <object class="GtkButton">
+ <property name="icon-name">go-previous-symbolic</property>
+ <signal name="clicked" handler="navigate_main_page"
object="NautilusPropertiesWindow" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<object class="GtkBox" id="open_with_box">
- <property name="visible">False</property>
<property name="margin-top">18</property>
<property name="margin-bottom">18</property>
<property name="margin-start">18</property>
<property name="margin-end">18</property>
+ <style>
+ <class name="background"/>
+ </style>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
@@ -1025,19 +1110,11 @@
</object>
</child>
</object>
- </property>
- <property name="tab">
- <object class="GtkLabel">
- <property name="label" translatable="yes">Open With</property>
- </object>
- </property>
+ </child>
</object>
- </child>
+ </property>
</object>
</child>
- <style>
- <class name="view"/>
- </style>
</object>
</child>
</template>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]