[nautilus/wip/gbsneto/cleanups] view: manage empty states



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

    view: manage empty states
    
    The NautilusView class is the abstract class from which
    the different views (list & grid) inherit, in order to
    display directory content.
    
    Up to now, it was NautilusWindowSlot who was managing
    the empty views, causing even more code coupling and
    blurring the lines of functionality of each class.
    
    Fix that by delegating to NautilusView the responsability
    to manage the empty views, and not NautilusWindowSlot.

 src/nautilus-canvas-view.c |    2 -
 src/nautilus-view.c        |   76 ++++++++++++++++++++++++++++++++++++++++++++
 src/nautilus-window-slot.c |   65 -------------------------------------
 3 files changed, 76 insertions(+), 67 deletions(-)
---
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index fac0bda..953c7b5 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -1933,8 +1933,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-view.c b/src/nautilus-view.c
index 3d8f1ca..cf20d42 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,40 @@ 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;
+        NautilusDirectory *directory;
+        gboolean show_hidden_files;
+
+        gtk_widget_hide (view->details->no_search_results_widget);
+        gtk_widget_hide (view->details->folder_is_empty_widget);
+        directory = view->details->model;
+        if (!view->details->loading && 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 (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 +2923,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 +3310,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);
@@ -6951,6 +6989,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));
 
@@ -7479,14 +7519,25 @@ nautilus_view_parent_set (GtkWidget *widget,
 }
 
 static void
+nautilus_view_container_add (GtkContainer *container,
+                             GtkWidget    *widget)
+{
+        NautilusView *view = NAUTILUS_VIEW (container);
+
+        gtk_container_add (GTK_CONTAINER (view->details->overlay), widget);
+}
+
+static void
 nautilus_view_class_init (NautilusViewClass *klass)
 {
        GObjectClass *oclass;
        GtkWidgetClass *widget_class;
+        GtkContainerClass *container_class;
        GtkScrolledWindowClass *scrolled_window_class;
 
        widget_class = GTK_WIDGET_CLASS (klass);
        scrolled_window_class = GTK_SCROLLED_WINDOW_CLASS (klass);
+        container_class = GTK_CONTAINER_CLASS (klass);
        oclass = G_OBJECT_CLASS (klass);
 
        oclass->finalize = nautilus_view_finalize;
@@ -7496,6 +7547,8 @@ nautilus_view_class_init (NautilusViewClass *klass)
        widget_class->scroll_event = nautilus_view_scroll_event;
        widget_class->parent_set = nautilus_view_parent_set;
 
+        container_class->add = nautilus_view_container_add;
+
        g_type_class_add_private (klass, sizeof (NautilusViewDetails));
 
        /* Get rid of the strange 3-pixel gap that GtkScrolledWindow
@@ -7608,6 +7661,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 +7678,28 @@ 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);
+
+        /* Since the GtkContainer::add method was already overriden by the time
+         * _init is called, we have to manually use the parent's ::add method.
+         */
+        GTK_CONTAINER_CLASS (nautilus_view_parent_class)->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-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]