diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2015-07-28 15:54:03 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2015-07-31 13:36:40 -0300 |
commit | 74b68bcb4d4a4e29ee094566d331f0e94de7f76a (patch) | |
tree | bd2b7023e4b738128d243a309c65b4e39b0342a9 | |
parent | 9e13523478e52253a415d470be36c4114758141f (diff) | |
download | nautilus-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.c | 6 | ||||
-rw-r--r-- | src/nautilus-list-view.c | 4 | ||||
-rw-r--r-- | src/nautilus-view.c | 66 | ||||
-rw-r--r-- | src/nautilus-view.h | 1 | ||||
-rw-r--r-- | 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 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); } } |