[nautilus/wip/cdavis/use-status-page: 2/4] general: Use AdwStatusPage for file view empty states




commit d2f620c95fb0315885a7c64a0244d473708ba030
Author: Christopher Davis <christopherdavis gnome org>
Date:   Sat Jul 16 15:48:38 2022 -0400

    general: Use AdwStatusPage for file view empty states
    
    libadwaita provides a widget made to be used for empty/
    initial views. Instead of making our own copy, we can use
    a GtkStack and libadwaita's AdwStatusPage to create and
    switch between our empty views.

 src/nautilus-files-view.c                      | 51 ++++++++++++-------------
 src/resources/ui/nautilus-folder-is-empty.ui   | 36 ++----------------
 src/resources/ui/nautilus-no-search-results.ui | 52 ++------------------------
 src/resources/ui/nautilus-starred-is-empty.ui  | 36 ++----------------
 src/resources/ui/nautilus-trash-is-empty.ui    | 36 ++----------------
 5 files changed, 39 insertions(+), 172 deletions(-)
---
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index d060f3915..a38803332 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -243,6 +243,8 @@ typedef struct
 
     GActionGroup *view_action_group;
 
+    GtkWidget *stack;
+
     GtkWidget *scrolled_window;
 
     /* Empty states */
@@ -3639,14 +3641,11 @@ static void
 real_check_empty_states (NautilusFilesView *view)
 {
     NautilusFilesViewPrivate *priv;
+    GtkWidget *visible_child;
     g_autofree gchar *uri = NULL;
 
     priv = nautilus_files_view_get_instance_private (view);
-
-    gtk_widget_hide (priv->no_search_results_widget);
-    gtk_widget_hide (priv->folder_is_empty_widget);
-    gtk_widget_hide (priv->trash_is_empty_widget);
-    gtk_widget_hide (priv->starred_is_empty_widget);
+    visible_child = priv->scrolled_window;
 
     if (!priv->loading &&
         nautilus_files_view_is_empty (view))
@@ -3655,20 +3654,24 @@ real_check_empty_states (NautilusFilesView *view)
 
         if (nautilus_view_is_searching (NAUTILUS_VIEW (view)))
         {
-            gtk_widget_show (priv->no_search_results_widget);
+            visible_child = priv->no_search_results_widget;
         }
         else if (eel_uri_is_trash_root (uri))
         {
-            gtk_widget_show (priv->trash_is_empty_widget);
+            visible_child = priv->trash_is_empty_widget;
         }
         else if (eel_uri_is_starred (uri))
         {
-            gtk_widget_show (priv->starred_is_empty_widget);
+            visible_child = priv->starred_is_empty_widget;
         }
         else
         {
-            gtk_widget_show (priv->folder_is_empty_widget);
+            visible_child = priv->folder_is_empty_widget;
         }
+
+        gtk_stack_set_visible_child (GTK_STACK (priv->stack), visible_child);
+    } else {
+        gtk_stack_set_visible_child (GTK_STACK (priv->stack), visible_child);
     }
 }
 
@@ -9454,44 +9457,42 @@ nautilus_files_view_init (NautilusFilesView *view)
     adw_bin_set_child (ADW_BIN (view), priv->overlay);
     gtk_widget_show (priv->overlay);
 
-    /* Scrolled Window */
-    priv->scrolled_window = gtk_scrolled_window_new ();
-    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window),
-                                    GTK_POLICY_AUTOMATIC,
-                                    GTK_POLICY_AUTOMATIC);
-    gtk_widget_show (priv->scrolled_window);
+    /* Stack */
+    priv->stack = gtk_stack_new ();
+    gtk_overlay_set_child (GTK_OVERLAY (priv->overlay), priv->stack);
 
     controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL |
                                                   GTK_EVENT_CONTROLLER_SCROLL_DISCRETE);
-    gtk_widget_add_controller (priv->scrolled_window, controller);
+    gtk_widget_add_controller (priv->stack, controller);
     gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
     g_signal_connect (controller, "scroll", G_CALLBACK (on_scroll), view);
 
-    gtk_overlay_set_child (GTK_OVERLAY (priv->overlay), priv->scrolled_window);
+    /* Scrolled Window */
+    priv->scrolled_window = gtk_scrolled_window_new ();
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window),
+                                    GTK_POLICY_AUTOMATIC,
+                                    GTK_POLICY_AUTOMATIC);
+    gtk_stack_add_child (GTK_STACK (priv->stack), priv->scrolled_window);
 
     /* Empty states */
     builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-no-search-results.ui");
     priv->no_search_results_widget = GTK_WIDGET (gtk_builder_get_object (builder, "no_search_results"));
-    gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->no_search_results_widget);
-    gtk_widget_set_can_target (priv->no_search_results_widget, FALSE);
+    gtk_stack_add_child (GTK_STACK (priv->stack), priv->no_search_results_widget);
     g_object_unref (builder);
 
     builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-folder-is-empty.ui");
     priv->folder_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, "folder_is_empty"));
-    gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->folder_is_empty_widget);
-    gtk_widget_set_can_target (priv->folder_is_empty_widget, FALSE);
+    gtk_stack_add_child (GTK_STACK (priv->stack), priv->folder_is_empty_widget);
     g_object_unref (builder);
 
     builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-starred-is-empty.ui");
     priv->starred_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, "starred_is_empty"));
-    gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->starred_is_empty_widget);
-    gtk_widget_set_can_target (priv->starred_is_empty_widget, FALSE);
+    gtk_stack_add_child (GTK_STACK (priv->stack), priv->starred_is_empty_widget);
     g_object_unref (builder);
 
     builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-trash-is-empty.ui");
     priv->trash_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, "trash_is_empty"));
-    gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->trash_is_empty_widget);
-    gtk_widget_set_can_target (priv->trash_is_empty_widget, FALSE);
+    gtk_stack_add_child (GTK_STACK (priv->stack), priv->trash_is_empty_widget);
     g_object_unref (builder);
 
     /* Floating bar */
diff --git a/src/resources/ui/nautilus-folder-is-empty.ui b/src/resources/ui/nautilus-folder-is-empty.ui
index 8417d823e..8ace4ea92 100644
--- a/src/resources/ui/nautilus-folder-is-empty.ui
+++ b/src/resources/ui/nautilus-folder-is-empty.ui
@@ -1,38 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk" version="4.0"/>
-  <object class="GtkGrid" id="folder_is_empty">
-    <property name="halign">center</property>
-    <property name="valign">center</property>
-    <property name="hexpand">True</property>
-    <property name="vexpand">True</property>
-    <property name="row_spacing">36</property>
-    <property name="visible">False</property>
-    <child>
-      <object class="GtkImage">
-        <property name="pixel_size">128</property>
-        <property name="icon_name">folder-symbolic</property>
-        <style>
-          <class name="dim-label"/>
-          <class name="nautilus-empty-state-icon"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel">
-        <property name="label" translatable="yes">Folder is Empty</property>
-        <style>
-          <class name="large-title"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">1</property>
-        </layout>
-      </object>
-    </child>
+  <object class="AdwStatusPage" id="folder_is_empty">
+    <property name="icon_name">folder-symbolic</property>
+    <property name="title" translatable="yes">Folder is Empty</property>
   </object>
 </interface>
diff --git a/src/resources/ui/nautilus-no-search-results.ui b/src/resources/ui/nautilus-no-search-results.ui
index d4242a163..04a767d6f 100644
--- a/src/resources/ui/nautilus-no-search-results.ui
+++ b/src/resources/ui/nautilus-no-search-results.ui
@@ -1,53 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk" version="4.0"/>
-  <object class="GtkGrid" id="no_search_results">
-    <property name="halign">center</property>
-    <property name="valign">center</property>
-    <property name="hexpand">True</property>
-    <property name="vexpand">True</property>
-    <property name="row_spacing">12</property>
-    <property name="visible">False</property>
-    <child>
-      <object class="GtkImage">
-        <property name="pixel_size">80</property>
-        <property name="icon_name">edit-find-symbolic</property>
-        <style>
-          <class name="dim-label"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel">
-        <property name="label" translatable="yes">No Results Found</property>
-        <attributes>
-          <attribute name="weight" value="bold"></attribute>
-          <attribute name="scale" value="1.44"></attribute>
-        </attributes>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">1</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel">
-        <property name="label" translatable="yes">Try a different search</property>
-        <style>
-          <class name="dim-label"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">2</property>
-        </layout>
-      </object>
-    </child>
-    <style>
-      <class name="dim-label"/>
-    </style>
+  <object class="AdwStatusPage" id="no_search_results">
+    <property name="icon_name">edit-find-symbolic</property>
+    <property name="title" translatable="yes">No Results Found</property>
+    <property name="description" translatable="yes">Try a different search</property>
   </object>
 </interface>
diff --git a/src/resources/ui/nautilus-starred-is-empty.ui b/src/resources/ui/nautilus-starred-is-empty.ui
index 8747fcbb3..6f90359dc 100644
--- a/src/resources/ui/nautilus-starred-is-empty.ui
+++ b/src/resources/ui/nautilus-starred-is-empty.ui
@@ -1,38 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk" version="4.0"/>
-  <object class="GtkGrid" id="starred_is_empty">
-    <property name="halign">center</property>
-    <property name="valign">center</property>
-    <property name="hexpand">True</property>
-    <property name="vexpand">True</property>
-    <property name="row_spacing">36</property>
-    <property name="visible">False</property>
-    <child>
-      <object class="GtkImage">
-        <property name="pixel_size">128</property>
-        <property name="icon_name">starred-symbolic</property>
-        <style>
-          <class name="dim-label"/>
-          <class name="nautilus-empty-state-icon"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel">
-        <property name="label" translatable="yes">Starred files will appear here</property>
-        <style>
-          <class name="large-title"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">1</property>
-        </layout>
-      </object>
-    </child>
+  <object class="AdwStatusPage" id="starred_is_empty">
+    <property name="icon_name">starred-symbolic</property>
+    <property name="title" translatable="yes">Starred files will appear here</property>
   </object>
 </interface>
diff --git a/src/resources/ui/nautilus-trash-is-empty.ui b/src/resources/ui/nautilus-trash-is-empty.ui
index 1818fba55..6df2fd566 100644
--- a/src/resources/ui/nautilus-trash-is-empty.ui
+++ b/src/resources/ui/nautilus-trash-is-empty.ui
@@ -1,38 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk" version="4.0"/>
-  <object class="GtkGrid" id="trash_is_empty">
-    <property name="halign">center</property>
-    <property name="valign">center</property>
-    <property name="hexpand">True</property>
-    <property name="vexpand">True</property>
-    <property name="row_spacing">36</property>
-    <property name="visible">False</property>
-    <child>
-      <object class="GtkImage">
-        <property name="pixel_size">128</property>
-        <property name="icon_name">user-trash-symbolic</property>
-        <style>
-          <class name="dim-label"/>
-          <class name="nautilus-empty-state-icon"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel">
-        <property name="label" translatable="yes">Trash is Empty</property>
-        <style>
-          <class name="large-title"/>
-        </style>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">1</property>
-        </layout>
-      </object>
-    </child>
+  <object class="AdwStatusPage" id="trash_is_empty">
+    <property name="icon_name">user-trash-symbolic</property>
+    <property name="title" translatable="yes">Trash is Empty</property>
   </object>
 </interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]