diff options
Diffstat (limited to 'src/nautilus-files-view.c')
-rw-r--r-- | src/nautilus-files-view.c | 576 |
1 files changed, 20 insertions, 556 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 25fc421ad..0f3b22155 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -27,12 +27,12 @@ #include "nautilus-files-view.h" +#include "nautilus-action-bar.h" #include "nautilus-application.h" #include "nautilus-batch-rename-dialog.h" #include "nautilus-batch-rename-utilities.h" #include "nautilus-error-reporting.h" #include "nautilus-file-undo-manager.h" -#include "nautilus-floating-bar.h" #include "nautilus-view-icon-controller.h" #include "nautilus-list-view.h" #include "nautilus-canvas-view.h" @@ -115,9 +115,6 @@ #define SHORTCUTS_PATH "/nautilus/scripts-accels" -/* Delay to show the Loading... floating bar */ -#define FLOATING_BAR_LOADING_DELAY 200 /* ms */ - #define MIN_COMMON_FILENAME_PREFIX_LENGTH 4 enum @@ -180,7 +177,6 @@ typedef struct guint display_selection_idle_id; guint update_context_menus_timeout_id; - guint update_status_idle_id; guint reveal_selection_idle_id; guint display_pending_source_id; @@ -248,12 +244,6 @@ typedef struct GtkWidget *no_search_results_widget; GtkWidget *starred_is_empty_widget; - /* Floating bar */ - guint floating_bar_set_status_timeout_id; - guint floating_bar_loading_timeout_id; - guint floating_bar_set_passthrough_timeout_id; - GtkWidget *floating_bar; - /* Toolbar menu */ NautilusToolbarMenuSections *toolbar_menu_sections; GtkWidget *sort_menu; @@ -269,6 +259,9 @@ typedef struct GCancellable *starred_cancellable; NautilusTagManager *tag_manager; + + /* Action bar */ + GtkWidget *actionbar; } NautilusFilesViewPrivate; typedef struct @@ -292,8 +285,6 @@ static void open_one_in_new_window (gpointer data, gpointer callback_data); static void schedule_update_context_menus (NautilusFilesView *view); static void remove_update_context_menus_timeout_callback (NautilusFilesView *view); -static void schedule_update_status (NautilusFilesView *view); -static void remove_update_status_idle_callback (NautilusFilesView *view); static void reset_update_interval (NautilusFilesView *view); static void schedule_idle_display_of_pending_files (NautilusFilesView *view); static void unschedule_display_of_pending_files (NautilusFilesView *view); @@ -346,233 +337,6 @@ static const struct { GDK_KEY_ZoomOut, "zoom-out" }, }; -/* - * Floating Bar code - */ -static void -remove_loading_floating_bar (NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - if (priv->floating_bar_loading_timeout_id != 0) - { - g_source_remove (priv->floating_bar_loading_timeout_id); - priv->floating_bar_loading_timeout_id = 0; - } - - gtk_widget_hide (priv->floating_bar); - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (priv->floating_bar)); -} - -static void -real_setup_loading_floating_bar (NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (priv->floating_bar)); - nautilus_floating_bar_set_primary_label (NAUTILUS_FLOATING_BAR (priv->floating_bar), - nautilus_view_is_searching (NAUTILUS_VIEW (view)) ? _("Searching…") : _("Loading…")); - nautilus_floating_bar_set_details_label (NAUTILUS_FLOATING_BAR (priv->floating_bar), NULL); - nautilus_floating_bar_set_show_spinner (NAUTILUS_FLOATING_BAR (priv->floating_bar), priv->loading); - nautilus_floating_bar_add_action (NAUTILUS_FLOATING_BAR (priv->floating_bar), - "process-stop-symbolic", - NAUTILUS_FLOATING_BAR_ACTION_ID_STOP); - - gtk_widget_set_halign (priv->floating_bar, GTK_ALIGN_END); - gtk_widget_show (priv->floating_bar); -} - -static gboolean -setup_loading_floating_bar_timeout_cb (gpointer user_data) -{ - NautilusFilesView *view = user_data; - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - priv->floating_bar_loading_timeout_id = 0; - real_setup_loading_floating_bar (view); - - return FALSE; -} - -static void -setup_loading_floating_bar (NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - /* setup loading overlay */ - if (priv->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (priv->floating_bar_set_status_timeout_id); - priv->floating_bar_set_status_timeout_id = 0; - } - - if (priv->floating_bar_loading_timeout_id != 0) - { - g_source_remove (priv->floating_bar_loading_timeout_id); - priv->floating_bar_loading_timeout_id = 0; - } - - priv->floating_bar_loading_timeout_id = - g_timeout_add (FLOATING_BAR_LOADING_DELAY, setup_loading_floating_bar_timeout_cb, view); -} - -static void -floating_bar_action_cb (NautilusFloatingBar *floating_bar, - gint action, - NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - if (action == NAUTILUS_FLOATING_BAR_ACTION_ID_STOP) - { - remove_loading_floating_bar (view); - nautilus_window_slot_stop_loading (priv->slot); - } -} - -static void -real_floating_bar_set_short_status (NautilusFilesView *view, - const gchar *primary_status, - const gchar *detail_status) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - if (priv->loading) - { - return; - } - - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (priv->floating_bar)); - nautilus_floating_bar_set_show_spinner (NAUTILUS_FLOATING_BAR (priv->floating_bar), - FALSE); - - if (primary_status == NULL && detail_status == NULL) - { - gtk_widget_hide (priv->floating_bar); - nautilus_floating_bar_remove_hover_timeout (NAUTILUS_FLOATING_BAR (priv->floating_bar)); - return; - } - - nautilus_floating_bar_set_labels (NAUTILUS_FLOATING_BAR (priv->floating_bar), - primary_status, - detail_status); - - gtk_widget_show (priv->floating_bar); -} - -typedef struct -{ - gchar *primary_status; - gchar *detail_status; - NautilusFilesView *view; -} FloatingBarSetStatusData; - -static void -floating_bar_set_status_data_free (gpointer data) -{ - FloatingBarSetStatusData *status_data = data; - - g_free (status_data->primary_status); - g_free (status_data->detail_status); - - g_slice_free (FloatingBarSetStatusData, data); -} - -static gboolean -floating_bar_set_status_timeout_cb (gpointer data) -{ - NautilusFilesViewPrivate *priv; - - FloatingBarSetStatusData *status_data = data; - - priv = nautilus_files_view_get_instance_private (status_data->view); - - priv->floating_bar_set_status_timeout_id = 0; - real_floating_bar_set_short_status (status_data->view, - status_data->primary_status, - status_data->detail_status); - - return FALSE; -} - -static gboolean -remove_floating_bar_passthrough (gpointer data) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (NAUTILUS_FILES_VIEW (data)); - gtk_overlay_set_overlay_pass_through (GTK_OVERLAY (priv->overlay), - priv->floating_bar, FALSE); - priv->floating_bar_set_passthrough_timeout_id = 0; - - return G_SOURCE_REMOVE; -} - -static void -set_floating_bar_status (NautilusFilesView *view, - const gchar *primary_status, - const gchar *detail_status) -{ - GtkSettings *settings; - gint double_click_time; - FloatingBarSetStatusData *status_data; - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - if (priv->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (priv->floating_bar_set_status_timeout_id); - priv->floating_bar_set_status_timeout_id = 0; - } - - settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (view))); - g_object_get (settings, - "gtk-double-click-time", &double_click_time, - NULL); - - status_data = g_slice_new0 (FloatingBarSetStatusData); - status_data->primary_status = g_strdup (primary_status); - status_data->detail_status = g_strdup (detail_status); - status_data->view = view; - - if (priv->floating_bar_set_passthrough_timeout_id != 0) - { - g_source_remove (priv->floating_bar_set_passthrough_timeout_id); - priv->floating_bar_set_passthrough_timeout_id = 0; - } - /* Activate passthrough on the floating bar just long enough for a - * potential double click to happen, so to not interfere with it */ - gtk_overlay_set_overlay_pass_through (GTK_OVERLAY (priv->overlay), - priv->floating_bar, TRUE); - priv->floating_bar_set_passthrough_timeout_id = g_timeout_add ((guint) double_click_time, - remove_floating_bar_passthrough, - view); - - /* waiting for half of the double-click-time before setting - * the status seems to be a good approximation of not setting it - * too often and not delaying the statusbar too much. - */ - priv->floating_bar_set_status_timeout_id = - g_timeout_add_full (G_PRIORITY_DEFAULT, - (guint) (double_click_time / 2), - floating_bar_set_status_timeout_cb, - status_data, - floating_bar_set_status_data_free); -} - static char * real_get_backing_uri (NautilusFilesView *view) { @@ -3098,7 +2862,6 @@ nautilus_files_view_destroy (GtkWidget *object) } remove_update_context_menus_timeout_callback (view); - remove_update_status_idle_callback (view); if (priv->display_selection_idle_id != 0) { @@ -3112,24 +2875,6 @@ nautilus_files_view_destroy (GtkWidget *object) priv->reveal_selection_idle_id = 0; } - if (priv->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (priv->floating_bar_set_status_timeout_id); - priv->floating_bar_set_status_timeout_id = 0; - } - - if (priv->floating_bar_loading_timeout_id != 0) - { - g_source_remove (priv->floating_bar_loading_timeout_id); - priv->floating_bar_loading_timeout_id = 0; - } - - if (priv->floating_bar_set_passthrough_timeout_id != 0) - { - g_source_remove (priv->floating_bar_set_passthrough_timeout_id); - priv->floating_bar_set_passthrough_timeout_id = 0; - } - g_signal_handlers_disconnect_by_func (nautilus_preferences, schedule_update_context_menus, view); g_signal_handlers_disconnect_by_func (nautilus_preferences, @@ -3138,8 +2883,6 @@ nautilus_files_view_destroy (GtkWidget *object) sort_directories_first_changed_callback, view); g_signal_handlers_disconnect_by_func (gtk_filechooser_preferences, show_hidden_files_changed_callback, view); - g_signal_handlers_disconnect_by_func (nautilus_window_state, - nautilus_files_view_display_selection_info, view); g_signal_handlers_disconnect_by_func (gnome_lockdown_preferences, schedule_update_context_menus, view); g_signal_handlers_disconnect_by_func (nautilus_trash_monitor_get (), @@ -3153,6 +2896,7 @@ nautilus_files_view_destroy (GtkWidget *object) g_clear_object (&priv->search_query); g_clear_object (&priv->location); + g_clear_object (&priv->actionbar); /* We don't own the slot, so no unref */ priv->slot = NULL; @@ -3188,216 +2932,6 @@ nautilus_files_view_finalize (GObject *object) G_OBJECT_CLASS (nautilus_files_view_parent_class)->finalize (object); } -/** - * nautilus_files_view_display_selection_info: - * - * Display information about the current selection, and notify the view frame of the changed selection. - * @view: NautilusFilesView for which to display selection info. - * - **/ -void -nautilus_files_view_display_selection_info (NautilusFilesView *view) -{ - g_autolist (NautilusFile) selection = NULL; - goffset non_folder_size; - gboolean non_folder_size_known; - guint non_folder_count, folder_count, folder_item_count; - gboolean folder_item_count_known; - guint file_item_count; - GList *p; - char *first_item_name; - char *non_folder_count_str; - char *non_folder_item_count_str; - char *folder_count_str; - char *folder_item_count_str; - char *primary_status; - char *detail_status; - NautilusFile *file; - - g_return_if_fail (NAUTILUS_IS_FILES_VIEW (view)); - - selection = nautilus_view_get_selection (NAUTILUS_VIEW (view)); - - folder_item_count_known = TRUE; - folder_count = 0; - folder_item_count = 0; - non_folder_count = 0; - non_folder_size_known = FALSE; - non_folder_size = 0; - first_item_name = NULL; - folder_count_str = NULL; - folder_item_count_str = NULL; - non_folder_count_str = NULL; - non_folder_item_count_str = NULL; - - for (p = selection; p != NULL; p = p->next) - { - file = p->data; - if (nautilus_file_is_directory (file)) - { - folder_count++; - if (nautilus_file_get_directory_item_count (file, &file_item_count, NULL)) - { - folder_item_count += file_item_count; - } - else - { - folder_item_count_known = FALSE; - } - } - else - { - non_folder_count++; - if (!nautilus_file_can_get_size (file)) - { - non_folder_size_known = TRUE; - non_folder_size += nautilus_file_get_size (file); - } - } - - if (first_item_name == NULL) - { - first_item_name = nautilus_file_get_display_name (file); - } - } - - /* Break out cases for localization's sake. But note that there are still pieces - * being assembled in a particular order, which may be a problem for some localizers. - */ - - if (folder_count != 0) - { - if (folder_count == 1 && non_folder_count == 0) - { - folder_count_str = g_strdup_printf (_("“%s” selected"), first_item_name); - } - else - { - folder_count_str = g_strdup_printf (ngettext ("%'d folder selected", - "%'d folders selected", - folder_count), - folder_count); - } - - if (folder_count == 1) - { - if (!folder_item_count_known) - { - folder_item_count_str = g_strdup (""); - } - else - { - folder_item_count_str = g_strdup_printf (ngettext ("(containing %'d item)", - "(containing %'d items)", - folder_item_count), - folder_item_count); - } - } - else - { - if (!folder_item_count_known) - { - folder_item_count_str = g_strdup (""); - } - else - { - /* translators: this is preceded with a string of form 'N folders' (N more than 1) */ - folder_item_count_str = g_strdup_printf (ngettext ("(containing a total of %'d item)", - "(containing a total of %'d items)", - folder_item_count), - folder_item_count); - } - } - } - - if (non_folder_count != 0) - { - if (folder_count == 0) - { - if (non_folder_count == 1) - { - non_folder_count_str = g_strdup_printf (_("“%s” selected"), - first_item_name); - } - else - { - non_folder_count_str = g_strdup_printf (ngettext ("%'d item selected", - "%'d items selected", - non_folder_count), - non_folder_count); - } - } - else - { - /* Folders selected also, use "other" terminology */ - non_folder_count_str = g_strdup_printf (ngettext ("%'d other item selected", - "%'d other items selected", - non_folder_count), - non_folder_count); - } - - if (non_folder_size_known) - { - char *size_string; - - size_string = g_format_size (non_folder_size); - /* This is marked for translation in case a localiser - * needs to use something other than parentheses. The - * the message in parentheses is the size of the selected items. - */ - non_folder_item_count_str = g_strdup_printf (_("(%s)"), size_string); - g_free (size_string); - } - else - { - non_folder_item_count_str = g_strdup (""); - } - } - - if (folder_count == 0 && non_folder_count == 0) - { - primary_status = NULL; - detail_status = NULL; - } - else if (folder_count == 0) - { - primary_status = g_strdup (non_folder_count_str); - detail_status = g_strdup (non_folder_item_count_str); - } - else if (non_folder_count == 0) - { - primary_status = g_strdup (folder_count_str); - detail_status = g_strdup (folder_item_count_str); - } - else - { - /* This is marked for translation in case a localizer - * needs to change ", " to something else. The comma - * is between the message about the number of folders - * and the number of items in those folders and the - * message about the number of other items and the - * total size of those items. - */ - primary_status = g_strdup_printf (_("%s %s, %s %s"), - folder_count_str, - folder_item_count_str, - non_folder_count_str, - non_folder_item_count_str); - detail_status = NULL; - } - - g_free (first_item_name); - g_free (folder_count_str); - g_free (folder_item_count_str); - g_free (non_folder_count_str); - g_free (non_folder_item_count_str); - - set_floating_bar_status (view, primary_status, detail_status); - - g_free (primary_status); - g_free (detail_status); -} - static void nautilus_files_view_set_location (NautilusView *view, GFile *location) @@ -3511,9 +3045,7 @@ done_loading (NautilusFilesView *view, if (!priv->in_destruction) { - remove_loading_floating_bar (view); schedule_update_context_menus (view); - schedule_update_status (view); nautilus_files_view_update_toolbar_menus (view); reset_update_interval (view); @@ -3534,9 +3066,8 @@ done_loading (NautilusFilesView *view, do_reveal = TRUE; } - if (selection) + if (selection != NULL) { - g_list_free_full (selection, g_object_unref); g_object_notify (G_OBJECT (view), "selection"); } @@ -3568,7 +3099,6 @@ done_loading (NautilusFilesView *view, nautilus_files_view_reveal_selection (view); } } - nautilus_files_view_display_selection_info (view); } priv->loading = FALSE; @@ -4157,7 +3687,6 @@ display_selection_info_idle_callback (gpointer data) g_object_ref (G_OBJECT (view)); priv->display_selection_idle_id = 0; - nautilus_files_view_display_selection_info (view); g_object_notify (G_OBJECT (view), "selection"); g_object_unref (G_OBJECT (view)); @@ -4421,9 +3950,6 @@ files_added_callback (NautilusDirectory *directory, queue_pending_files (view, directory, files, &priv->new_added_files); - /* The number of items could have changed */ - schedule_update_status (view); - nautilus_profile_end (NULL); } @@ -4450,9 +3976,6 @@ files_changed_callback (NautilusDirectory *directory, queue_pending_files (view, directory, files, &priv->new_changed_files); - /* The free space or the number of items could have changed */ - schedule_update_status (view); - /* A change in MIME type could affect the Open with menu, for * one thing, so we need to update menus when files change. */ @@ -4479,8 +4002,6 @@ done_loading_callback (NautilusDirectory *directory, */ unschedule_display_of_pending_files (view); schedule_timeout_display_of_pending_files (view, UPDATE_INTERVAL_MIN); - - remove_loading_floating_bar (view); } nautilus_profile_end (NULL); } @@ -8184,62 +7705,6 @@ schedule_update_context_menus (NautilusFilesView *view) } } -static void -remove_update_status_idle_callback (NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - priv = nautilus_files_view_get_instance_private (view); - - if (priv->update_status_idle_id != 0) - { - g_source_remove (priv->update_status_idle_id); - priv->update_status_idle_id = 0; - } -} - -static gboolean -update_status_idle_callback (gpointer data) -{ - NautilusFilesViewPrivate *priv; - NautilusFilesView *view; - - view = NAUTILUS_FILES_VIEW (data); - priv = nautilus_files_view_get_instance_private (view); - nautilus_files_view_display_selection_info (view); - priv->update_status_idle_id = 0; - return FALSE; -} - -static void -schedule_update_status (NautilusFilesView *view) -{ - NautilusFilesViewPrivate *priv; - - g_assert (NAUTILUS_IS_FILES_VIEW (view)); - - priv = nautilus_files_view_get_instance_private (view); - - /* Make sure we haven't already destroyed it */ - if (priv->slot == NULL) - { - return; - } - - if (priv->loading) - { - /* Don't update status bar while loading the dir */ - return; - } - - if (priv->update_status_idle_id == 0) - { - priv->update_status_idle_id = - g_idle_add_full (G_PRIORITY_DEFAULT_IDLE - 20, - update_status_idle_callback, view, NULL); - } -} - /** * nautilus_files_view_notify_selection_changed: * @@ -8297,9 +7762,7 @@ file_changed_callback (NautilusFile *file, NautilusFilesView *view = NAUTILUS_FILES_VIEW (callback_data); schedule_changes (view); - schedule_update_context_menus (view); - schedule_update_status (view); } /** @@ -8330,8 +7793,6 @@ load_directory (NautilusFilesView *view, priv->loading = TRUE; - setup_loading_floating_bar (view); - /* Update menus when directory is empty, before going to new * location, so they won't have any false lingering knowledge * of old selection. @@ -9168,6 +8629,16 @@ nautilus_files_view_key_press_event (GtkWidget *widget, return GDK_EVENT_PROPAGATE; } +static GtkWidget * +nautilus_files_view_get_action_bar (NautilusView *view) +{ + NautilusFilesViewPrivate *priv; + + priv = nautilus_files_view_get_instance_private (NAUTILUS_FILES_VIEW (view)); + + return priv->actionbar; +} + static NautilusQuery * nautilus_files_view_get_search_query (NautilusView *view) { @@ -9292,6 +8763,7 @@ nautilus_files_view_is_loading (NautilusView *view) static void nautilus_files_view_iface_init (NautilusViewInterface *iface) { + iface->get_action_bar = nautilus_files_view_get_action_bar; iface->get_location = nautilus_files_view_get_location; iface->set_location = nautilus_files_view_set_location; iface->get_selection = nautilus_files_view_get_selection; @@ -9523,6 +8995,9 @@ nautilus_files_view_init (NautilusFilesView *view) gtk_container_add (GTK_CONTAINER (priv->overlay), priv->scrolled_window); + /* Actionbar */ + priv->actionbar = g_object_ref_sink (nautilus_action_bar_new (NAUTILUS_VIEW (view))); + /* 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")); @@ -9556,17 +9031,6 @@ nautilus_files_view_init (NautilusFilesView *view) TRUE); g_object_unref (builder); - /* Floating bar */ - priv->floating_bar = nautilus_floating_bar_new (NULL, NULL, FALSE); - gtk_widget_set_halign (priv->floating_bar, GTK_ALIGN_END); - gtk_widget_set_valign (priv->floating_bar, GTK_ALIGN_END); - gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->floating_bar); - - g_signal_connect (priv->floating_bar, - "action", - G_CALLBACK (floating_bar_action_cb), - view); - priv->non_ready_files = g_hash_table_new_full (file_and_directory_hash, file_and_directory_equal, |