[nautilus] view: manage empty states



commit 74b68bcb4d4a4e29ee094566d331f0e94de7f76a
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Jul 28 15:54:03 2015 -0300

    view: manage empty states
    
    NautilusWindowSlot is the class responsible for managing
    the empty views, causing even more code coupling and
    blurring the lines of functionality of each class. Also,
    it requires that the slot access the underlying model
    behind NautilusView, something we're avoiding in order
    to get Nautilus ready for future modifications.
    
    Fix that by delegating to NautilusView the responsability
    to manage the empty views, and not NautilusWindowSlot.

 src/nautilus-canvas-view.c |    6 ++--
 src/nautilus-list-view.c   |    4 ++-
 src/nautilus-view.c        |   66 ++++++++++++++++++++++++++++++++++++++++++++
 src/nautilus-view.h        |    1 +
 src/nautilus-window-slot.c |   65 -------------------------------------------
 5 files changed, 73 insertions(+), 69 deletions(-)
---
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index fac0bda..53e37d9 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -1640,7 +1640,9 @@ static NautilusCanvasContainer *
 create_canvas_container (NautilusCanvasView *canvas_view)
 {
        NautilusCanvasContainer *canvas_container;
+        GtkWidget *content_widget;
 
+        content_widget = nautilus_view_get_content_widget (NAUTILUS_VIEW (canvas_view));
        canvas_container = nautilus_canvas_view_container_new (canvas_view);
        canvas_view->details->canvas_container = GTK_WIDGET (canvas_container);
        g_object_add_weak_pointer (G_OBJECT (canvas_container),
@@ -1695,7 +1697,7 @@ create_canvas_container (NautilusCanvasView *canvas_view)
        g_signal_connect_object (canvas_container, "store-layout-timestamp",
                                 G_CALLBACK (store_layout_timestamp), canvas_view, 0);
 
-       gtk_container_add (GTK_CONTAINER (canvas_view),
+        gtk_container_add (GTK_CONTAINER (content_widget),
                           GTK_WIDGET (canvas_container));
 
        nautilus_canvas_view_update_click_mode (canvas_view);
@@ -1933,8 +1935,6 @@ nautilus_canvas_view_init (NautilusCanvasView *canvas_view)
        NautilusCanvasContainer *canvas_container;
        GActionGroup *view_action_group;
 
-        g_return_if_fail (gtk_bin_get_child (GTK_BIN (canvas_view)) == NULL);
-
        canvas_view->details = g_new0 (NautilusCanvasViewDetails, 1);
        canvas_view->details->sort = &sort_criteria[0];
 
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index ac4bf80..20a4882 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -1793,7 +1793,9 @@ create_and_set_up_tree_view (NautilusListView *view)
        GList *nautilus_columns;
        GList *l;
        gchar **default_column_order, **default_visible_columns;
+        GtkWidget *content_widget;
        
+        content_widget = nautilus_view_get_content_widget (NAUTILUS_VIEW (view));
        view->details->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ());
        view->details->columns = g_hash_table_new_full (g_str_hash, 
                                                        g_str_equal,
@@ -2025,7 +2027,7 @@ create_and_set_up_tree_view (NautilusListView *view)
                                default_visible_columns);
 
        gtk_widget_show (GTK_WIDGET (view->details->tree_view));
-       gtk_container_add (GTK_CONTAINER (view), GTK_WIDGET (view->details->tree_view));
+       gtk_container_add (GTK_CONTAINER (content_widget), GTK_WIDGET (view->details->tree_view));
 
         atk_obj = gtk_widget_get_accessible (GTK_WIDGET (view->details->tree_view));
         atk_object_set_name (atk_obj, _("List View"));
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 3d8f1ca..e0d4223 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -226,6 +226,11 @@ struct NautilusViewDetails
        GMenu *pathbar_menu;
 
        GActionGroup *view_action_group;
+
+        /* Empty states */
+        GtkWidget *overlay;
+        GtkWidget *folder_is_empty_widget;
+        GtkWidget *no_search_results_widget;
 };
 
 typedef struct {
@@ -266,10 +271,38 @@ static void     nautilus_view_select_file                      (NautilusView
 
 static void     update_templates_directory                     (NautilusView *view);
 
+static void     check_empty_states                             (NautilusView *view);
+
 static void unschedule_pop_up_pathbar_context_menu (NautilusView *view);
 
 G_DEFINE_TYPE (NautilusView, nautilus_view, GTK_TYPE_SCROLLED_WINDOW);
 
+static void
+check_empty_states (NautilusView *view)
+{
+        GList *files;
+        GList *filtered;
+        gboolean show_hidden_files;
+
+        gtk_widget_hide (view->details->no_search_results_widget);
+        gtk_widget_hide (view->details->folder_is_empty_widget);
+        if (!view->details->loading && view->details->model) {
+               files = nautilus_directory_get_file_list (view->details->model);
+                show_hidden_files = g_settings_get_boolean (gtk_filechooser_preferences,
+                                                            NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES);
+                filtered = nautilus_file_list_filter_hidden (files, show_hidden_files);
+                if (g_list_length (filtered) == 0) {
+                        if (NAUTILUS_IS_SEARCH_DIRECTORY (view->details->model)) {
+                               gtk_widget_show (view->details->no_search_results_widget);
+                        } else {
+                               gtk_widget_show (view->details->folder_is_empty_widget);
+                        }
+                }
+                nautilus_file_list_unref (filtered);
+                nautilus_file_list_unref (files);
+        }
+}
+
 static char *
 real_get_backing_uri (NautilusView *view)
 {
@@ -2888,6 +2921,8 @@ done_loading (NautilusView *view,
        view->details->loading = FALSE;
        g_signal_emit (view, signals[END_LOADING], 0, all_files_seen);
 
+        check_empty_states (view);
+
        nautilus_profile_end (NULL);
 }
 
@@ -3273,6 +3308,7 @@ process_old_files (NautilusView *view)
                }
 
                g_signal_emit (view, signals[END_FILE_CHANGES], 0);
+                check_empty_states (view);
 
                if (files_changed != NULL) {
                        selection = nautilus_view_get_selection (view);
@@ -3692,6 +3728,14 @@ nautilus_view_get_model (NautilusView *view)
        return view->details->model;
 }
 
+GtkWidget*
+nautilus_view_get_content_widget (NautilusView *view)
+{
+        g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+
+        return view->details->overlay;
+}
+
 GdkAtom
 nautilus_view_get_copied_files_atom (NautilusView *view)
 {
@@ -6951,6 +6995,8 @@ finish_loading (NautilusView *view)
        g_signal_emit (view, signals[BEGIN_LOADING], 0);
        nautilus_profile_end ("BEGIN_LOADING");
 
+        check_empty_states (view);
+
        /* Assume we have now all information to show window */
        nautilus_window_view_visible  (nautilus_view_get_window (view), NAUTILUS_VIEW (view));
 
@@ -7608,6 +7654,7 @@ nautilus_view_class_init (NautilusViewClass *klass)
 static void
 nautilus_view_init (NautilusView *view)
 {
+        GtkBuilder *builder;
        AtkObject *atk_object;
        NautilusDirectory *scripts_directory;
        NautilusDirectory *templates_directory;
@@ -7624,6 +7671,25 @@ nautilus_view_init (NautilusView *view)
        view->details = G_TYPE_INSTANCE_GET_PRIVATE (view, NAUTILUS_TYPE_VIEW,
                                                     NautilusViewDetails);
 
+        /* Overlay */
+        view->details->overlay = gtk_overlay_new ();
+        gtk_widget_show (view->details->overlay);
+
+        gtk_container_add (GTK_CONTAINER (view), view->details->overlay);
+
+        /* Empty states */
+        builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-no-search-results.ui");
+       view->details->no_search_results_widget = GTK_WIDGET (gtk_builder_get_object (builder, 
"no_search_results"));
+       gtk_overlay_add_overlay (GTK_OVERLAY (view->details->overlay),
+                                view->details->no_search_results_widget);
+        g_object_unref (builder);
+
+        builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-folder-is-empty.ui");
+       view->details->folder_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, 
"folder_is_empty"));
+       gtk_overlay_add_overlay (GTK_OVERLAY (view->details->overlay),
+                                view->details->folder_is_empty_widget);
+        g_object_unref (builder);
+
        /* Default to true; desktop-icon-view sets to false */
        view->details->show_foreign_files = TRUE;
 
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 78218cf..b822793 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -391,5 +391,6 @@ void                  nautilus_view_action_show_hidden_files   (NautilusView      *view,
                                                            gboolean           show_hidden);
 
 GActionGroup *    nautilus_view_get_action_group           (NautilusView      *view);
+GtkWidget*        nautilus_view_get_content_widget         (NautilusView      *view);
 
 #endif /* NAUTILUS_VIEW_H */
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index cbf801e..43f9884 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -68,9 +68,6 @@ struct NautilusWindowSlotDetails {
        GtkWidget *floating_bar;
        GtkWidget *view_overlay;
 
-       /* no search results widget */
-       GtkWidget *no_search_results_widget;
-
        /* slot contains
         *  1) an vbox containing extra_location_widgets
         *  2) the view
@@ -124,9 +121,6 @@ struct NautilusWindowSlotDetails {
        NautilusWindowGoToCallback open_callback;
        gpointer open_callback_user_data;
         gchar *view_mode_before_search;
-
-        /*Folder is empty */
-        GtkWidget *folder_is_empty_widget;
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -208,45 +202,12 @@ remove_loading_floating_bar (NautilusWindowSlot *slot)
 }
 
 static void
-check_empty_states (NautilusWindowSlot *slot)
-{
-       GList *files;
-       GList *filtered;
-        NautilusDirectory *directory;
-        gboolean show_hidden_files;
-
-        gtk_widget_hide (slot->details->no_search_results_widget);
-        gtk_widget_hide (slot->details->folder_is_empty_widget);
-        directory = nautilus_view_get_model (slot->details->content_view);
-        if (!slot->details->allow_stop && directory != NULL) {
-               files = nautilus_directory_get_file_list (directory);
-                show_hidden_files = g_settings_get_boolean (gtk_filechooser_preferences,
-                                                            NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES);
-                filtered = nautilus_file_list_filter_hidden (files, show_hidden_files);
-                if (g_list_length (filtered) == 0) {
-                        if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) {
-                               gtk_widget_show (slot->details->no_search_results_widget);
-                        } else {
-                               gtk_widget_show (slot->details->folder_is_empty_widget);
-                        }
-                }
-                nautilus_file_list_unref (filtered);
-                nautilus_file_list_unref (files);
-        }
-}
-
-static void
 nautilus_window_slot_on_done_loading (NautilusDirectory  *directory,
                                       NautilusWindowSlot *slot)
 {
 
         remove_loading_floating_bar (slot);
         nautilus_window_slot_set_allow_stop (slot, FALSE);
-        /* For this pourpose, we could check directly to see if the view is empty,
-         * instead of avoiding races disconnecting the model when appropiate.
-         * But I think we are doing better disconnecting when we know the data
-         * of the directory is not valid */
-        check_empty_states (slot);
 }
 
 static void
@@ -646,7 +607,6 @@ static void
 nautilus_window_slot_constructed (GObject *object)
 {
        NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (object);
-        GtkBuilder *builder;
        GtkWidget *extras_vbox;
 
        G_OBJECT_CLASS (nautilus_window_slot_parent_class)->constructed (object);
@@ -674,16 +634,6 @@ nautilus_window_slot_constructed (GObject *object)
        gtk_box_pack_start (GTK_BOX (slot), slot->details->view_overlay, TRUE, TRUE, 0);
        gtk_widget_show (slot->details->view_overlay);
 
-        builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-no-search-results.ui");
-       slot->details->no_search_results_widget = GTK_WIDGET (gtk_builder_get_object (builder, 
"no_search_results"));
-       gtk_overlay_add_overlay (GTK_OVERLAY (slot->details->view_overlay),
-                                slot->details->no_search_results_widget);
-        builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-folder-is-empty.ui");
-       slot->details->folder_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, 
"folder_is_empty"));
-       gtk_overlay_add_overlay (GTK_OVERLAY (slot->details->view_overlay),
-                                slot->details->folder_is_empty_widget);
-        g_object_unref (builder);
-
        slot->details->floating_bar = nautilus_floating_bar_new (NULL, NULL, FALSE);
        gtk_widget_set_halign (slot->details->floating_bar, GTK_ALIGN_END);
        gtk_widget_set_valign (slot->details->floating_bar, GTK_ALIGN_END);
@@ -2293,8 +2243,6 @@ view_end_loading_cb (NautilusView       *view,
                 remove_loading_floating_bar (slot);
                 nautilus_window_slot_set_allow_stop (slot, FALSE);
         }
-
-        check_empty_states (slot);
 }
 
 static void
@@ -2368,7 +2316,6 @@ view_begin_loading_cb (NautilusView       *view,
        }
 
         setup_loading_floating_bar (slot);
-        check_empty_states (slot);
 
        nautilus_profile_end (NULL);
 }
@@ -2435,22 +2382,11 @@ nautilus_window_slot_setup_extra_location_widgets (NautilusWindowSlot *slot)
 }
 
 static void
-view_end_file_changes_cb (NautilusView       *view,
-                           NautilusWindowSlot *slot)
-{
-        /* When creating or deleting a file the done-loading signal is not emitted,
-         * given that the view doesn't actually reload, so connect to the
-         * end-file-changes for update the empty states */
-        check_empty_states (slot);
-}
-
-static void
 nautilus_window_slot_connect_new_content_view (NautilusWindowSlot *slot)
 {
        if (slot->details->new_content_view != NULL) {
                g_signal_connect (slot->details->new_content_view, "begin-loading", G_CALLBACK 
(view_begin_loading_cb), slot);
                g_signal_connect (slot->details->new_content_view, "end-loading", G_CALLBACK 
(view_end_loading_cb), slot);
-               g_signal_connect (slot->details->new_content_view, "end-file-changes", G_CALLBACK 
(view_end_file_changes_cb), slot);
        }
 }
 
@@ -2461,7 +2397,6 @@ nautilus_window_slot_disconnect_content_view (NautilusWindowSlot *slot)
                /* disconnect old view */
                g_signal_handlers_disconnect_by_func (slot->details->content_view, G_CALLBACK 
(view_end_loading_cb), slot);
                g_signal_handlers_disconnect_by_func (slot->details->content_view, G_CALLBACK 
(view_begin_loading_cb), slot);
-               g_signal_handlers_disconnect_by_func (slot->details->content_view, G_CALLBACK 
(view_end_file_changes_cb), slot);
        }
 }
 


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