summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-28 15:54:03 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-31 13:36:40 -0300
commit74b68bcb4d4a4e29ee094566d331f0e94de7f76a (patch)
treebd2b7023e4b738128d243a309c65b4e39b0342a9
parent9e13523478e52253a415d470be36c4114758141f (diff)
downloadnautilus-74b68bcb4d4a4e29ee094566d331f0e94de7f76a.tar.gz
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.
-rw-r--r--src/nautilus-canvas-view.c6
-rw-r--r--src/nautilus-list-view.c4
-rw-r--r--src/nautilus-view.c66
-rw-r--r--src/nautilus-view.h1
-rw-r--r--src/nautilus-window-slot.c65
5 files changed, 73 insertions, 69 deletions
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index fac0bdada..53e37d9d5 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 ac4bf80f7..20a4882c4 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 3d8f1ca7e..e0d42234d 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 78218cfbe..b822793e4 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 cbf801e6a..43f98841c 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);
}
}