diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/nautilus-files-view.c | 501 | ||||
-rw-r--r-- | src/nautilus-files-view.h | 2 | ||||
-rw-r--r-- | src/nautilus-floating-bar.c | 605 | ||||
-rw-r--r-- | src/nautilus-floating-bar.h | 80 |
5 files changed, 0 insertions, 1190 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index a3a5e146b..113c4a41d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -164,8 +164,6 @@ nautilus_no_main_sources = \ nautilus-files-view.h \ nautilus-files-view-dnd.c \ nautilus-files-view-dnd.h \ - nautilus-floating-bar.c \ - nautilus-floating-bar.h \ nautilus-freedesktop-dbus.c \ nautilus-freedesktop-dbus.h \ nautilus-image-properties-page.c \ diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 20aaca540..26685cf96 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -35,7 +35,6 @@ #endif #include "nautilus-error-reporting.h" #include "nautilus-file-undo-manager.h" -#include "nautilus-floating-bar.h" #include "nautilus-list-view.h" #include "nautilus-canvas-view.h" #include "nautilus-mime-actions.h" @@ -126,9 +125,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 @@ -192,7 +188,6 @@ struct NautilusFilesViewDetails 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; @@ -262,11 +257,6 @@ struct NautilusFilesViewDetails GtkWidget *trash_is_empty_widget; GtkWidget *no_search_results_widget; - /* Floating bar */ - guint floating_bar_set_status_timeout_id; - guint floating_bar_loading_timeout_id; - GtkWidget *floating_bar; - /* Toolbar menu */ NautilusToolbarMenuSections *toolbar_menu_sections; GtkWidget *sort_menu; @@ -305,8 +295,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); @@ -361,195 +349,6 @@ static const struct #endif }; -/* - * Floating Bar code - */ -static void -remove_loading_floating_bar (NautilusFilesView *view) -{ - if (view->details->floating_bar_loading_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_loading_timeout_id); - view->details->floating_bar_loading_timeout_id = 0; - } - - gtk_widget_hide (view->details->floating_bar); - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (view->details->floating_bar)); -} - -static void -real_setup_loading_floating_bar (NautilusFilesView *view) -{ - gboolean disable_chrome; - - g_object_get (nautilus_files_view_get_window (view), - "disable-chrome", &disable_chrome, - NULL); - - if (disable_chrome) - { - gtk_widget_hide (view->details->floating_bar); - return; - } - - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (view->details->floating_bar)); - nautilus_floating_bar_set_primary_label (NAUTILUS_FLOATING_BAR (view->details->floating_bar), - nautilus_view_is_searching (NAUTILUS_VIEW (view)) ? _("Searching…") : _("Loading…")); - nautilus_floating_bar_set_details_label (NAUTILUS_FLOATING_BAR (view->details->floating_bar), NULL); - nautilus_floating_bar_set_show_spinner (NAUTILUS_FLOATING_BAR (view->details->floating_bar), view->details->loading); - nautilus_floating_bar_add_action (NAUTILUS_FLOATING_BAR (view->details->floating_bar), - "process-stop-symbolic", - NAUTILUS_FLOATING_BAR_ACTION_ID_STOP); - - gtk_widget_set_halign (view->details->floating_bar, GTK_ALIGN_END); - gtk_widget_show (view->details->floating_bar); -} - -static gboolean -setup_loading_floating_bar_timeout_cb (gpointer user_data) -{ - NautilusFilesView *view = user_data; - - view->details->floating_bar_loading_timeout_id = 0; - real_setup_loading_floating_bar (view); - - return FALSE; -} - -static void -setup_loading_floating_bar (NautilusFilesView *view) -{ - /* setup loading overlay */ - if (view->details->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_set_status_timeout_id); - view->details->floating_bar_set_status_timeout_id = 0; - } - - if (view->details->floating_bar_loading_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_loading_timeout_id); - view->details->floating_bar_loading_timeout_id = 0; - } - - view->details->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) -{ - if (action == NAUTILUS_FLOATING_BAR_ACTION_ID_STOP) - { - remove_loading_floating_bar (view); - nautilus_window_slot_stop_loading (view->details->slot); - } -} - -static void -real_floating_bar_set_short_status (NautilusFilesView *view, - const gchar *primary_status, - const gchar *detail_status) -{ - gboolean disable_chrome; - - if (view->details->loading) - { - return; - } - - nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (view->details->floating_bar)); - nautilus_floating_bar_set_show_spinner (NAUTILUS_FLOATING_BAR (view->details->floating_bar), - FALSE); - - g_object_get (nautilus_files_view_get_window (view), - "disable-chrome", &disable_chrome, - NULL); - - if ((primary_status == NULL && detail_status == NULL) || disable_chrome) - { - gtk_widget_hide (view->details->floating_bar); - nautilus_floating_bar_remove_hover_timeout (NAUTILUS_FLOATING_BAR (view->details->floating_bar)); - return; - } - - nautilus_floating_bar_set_labels (NAUTILUS_FLOATING_BAR (view->details->floating_bar), - primary_status, - detail_status); - - gtk_widget_show (view->details->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) -{ - FloatingBarSetStatusData *status_data = data; - - status_data->view->details->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 void -set_floating_bar_status (NautilusFilesView *view, - const gchar *primary_status, - const gchar *detail_status) -{ - GtkSettings *settings; - gint double_click_time; - FloatingBarSetStatusData *status_data; - - if (view->details->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_set_status_timeout_id); - view->details->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; - - /* 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. - */ - view->details->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) { @@ -2989,7 +2788,6 @@ nautilus_files_view_destroy (GtkWidget *object) } remove_update_context_menus_timeout_callback (view); - remove_update_status_idle_callback (view); if (view->details->display_selection_idle_id != 0) { @@ -3003,18 +2801,6 @@ nautilus_files_view_destroy (GtkWidget *object) view->details->reveal_selection_idle_id = 0; } - if (view->details->floating_bar_set_status_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_set_status_timeout_id); - view->details->floating_bar_set_status_timeout_id = 0; - } - - if (view->details->floating_bar_loading_timeout_id != 0) - { - g_source_remove (view->details->floating_bar_loading_timeout_id); - view->details->floating_bar_loading_timeout_id = 0; - } - g_signal_handlers_disconnect_by_func (nautilus_preferences, schedule_update_context_menus, view); g_signal_handlers_disconnect_by_func (nautilus_preferences, @@ -3023,8 +2809,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 (), @@ -3068,218 +2852,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) -{ - GList *selection; - 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); - } - } - - nautilus_file_list_free (selection); - - /* 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) @@ -3380,9 +2952,7 @@ done_loading (NautilusFilesView *view, if (!view->details->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); @@ -3437,7 +3007,6 @@ done_loading (NautilusFilesView *view, nautilus_files_view_reveal_selection (view); } } - nautilus_files_view_display_selection_info (view); } view->details->loading = FALSE; @@ -3999,7 +3568,6 @@ display_selection_info_idle_callback (gpointer data) g_object_ref (G_OBJECT (view)); view->details->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)); @@ -4224,9 +3792,6 @@ files_added_callback (NautilusDirectory *directory, queue_pending_files (view, directory, files, &view->details->new_added_files); - /* The number of items could have changed */ - schedule_update_status (view); - nautilus_profile_end (NULL); } @@ -4251,9 +3816,6 @@ files_changed_callback (NautilusDirectory *directory, queue_pending_files (view, directory, files, &view->details->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. */ @@ -4278,8 +3840,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); } @@ -7862,52 +7422,6 @@ schedule_update_context_menus (NautilusFilesView *view) } } -static void -remove_update_status_idle_callback (NautilusFilesView *view) -{ - if (view->details->update_status_idle_id != 0) - { - g_source_remove (view->details->update_status_idle_id); - view->details->update_status_idle_id = 0; - } -} - -static gboolean -update_status_idle_callback (gpointer data) -{ - NautilusFilesView *view; - - view = NAUTILUS_FILES_VIEW (data); - nautilus_files_view_display_selection_info (view); - view->details->update_status_idle_id = 0; - return FALSE; -} - -static void -schedule_update_status (NautilusFilesView *view) -{ - g_assert (NAUTILUS_IS_FILES_VIEW (view)); - - /* Make sure we haven't already destroyed it */ - if (view->details->slot == NULL) - { - return; - } - - if (view->details->loading) - { - /* Don't update status bar while loading the dir */ - return; - } - - if (view->details->update_status_idle_id == 0) - { - view->details->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: * @@ -7963,9 +7477,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); } /** @@ -7993,8 +7505,6 @@ load_directory (NautilusFilesView *view, view->details->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. @@ -9160,17 +8670,6 @@ nautilus_files_view_init (NautilusFilesView *view) TRUE); g_object_unref (builder); - /* Floating bar */ - view->details->floating_bar = nautilus_floating_bar_new (NULL, NULL, FALSE); - gtk_widget_set_halign (view->details->floating_bar, GTK_ALIGN_END); - gtk_widget_set_valign (view->details->floating_bar, GTK_ALIGN_END); - gtk_overlay_add_overlay (GTK_OVERLAY (view->details->overlay), view->details->floating_bar); - - g_signal_connect (view->details->floating_bar, - "action", - G_CALLBACK (floating_bar_action_cb), - view); - /* Default to true; desktop-icon-view sets to false */ view->details->show_foreign_files = TRUE; diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h index 70dcb2de8..3a986f27d 100644 --- a/src/nautilus-files-view.h +++ b/src/nautilus-files-view.h @@ -271,8 +271,6 @@ NautilusFilesView * nautilus_files_view_new (guint NautilusWindowSlot *nautilus_files_view_get_nautilus_window_slot (NautilusFilesView *view); char * nautilus_files_view_get_uri (NautilusFilesView *view); -void nautilus_files_view_display_selection_info (NautilusFilesView *view); - /* Wrappers for signal emitters. These are normally called * only by NautilusFilesView itself. They have corresponding signals * that observers might want to connect with. diff --git a/src/nautilus-floating-bar.c b/src/nautilus-floating-bar.c deleted file mode 100644 index 2a6a2c5cc..000000000 --- a/src/nautilus-floating-bar.c +++ /dev/null @@ -1,605 +0,0 @@ -/* Nautilus - Floating status bar. - * - * Copyright (C) 2011 Red Hat Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - * - * Authors: Cosimo Cecchi <cosimoc@redhat.com> - * - */ - -#include <config.h> - -#include <string.h> - -#include "nautilus-floating-bar.h" - -#define HOVER_HIDE_TIMEOUT_INTERVAL 100 - -struct _NautilusFloatingBarDetails -{ - gchar *primary_label; - gchar *details_label; - - GtkWidget *primary_label_widget; - GtkWidget *details_label_widget; - GtkWidget *spinner; - gboolean show_spinner; - gboolean is_interactive; - guint hover_timeout_id; -}; - -enum -{ - PROP_PRIMARY_LABEL = 1, - PROP_DETAILS_LABEL, - PROP_SHOW_SPINNER, - NUM_PROPERTIES -}; - -enum -{ - ACTION, - NUM_SIGNALS -}; - -static GParamSpec *properties[NUM_PROPERTIES] = { NULL, }; -static guint signals[NUM_SIGNALS] = { 0, }; - -G_DEFINE_TYPE (NautilusFloatingBar, nautilus_floating_bar, - GTK_TYPE_BOX); - -static void -action_button_clicked_cb (GtkButton *button, - NautilusFloatingBar *self) -{ - gint action_id; - - action_id = GPOINTER_TO_INT - (g_object_get_data (G_OBJECT (button), "action-id")); - - g_signal_emit (self, signals[ACTION], 0, action_id); -} - -static void -nautilus_floating_bar_finalize (GObject *obj) -{ - NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (obj); - - nautilus_floating_bar_remove_hover_timeout (self); - g_free (self->priv->primary_label); - g_free (self->priv->details_label); - - G_OBJECT_CLASS (nautilus_floating_bar_parent_class)->finalize (obj); -} - -static void -nautilus_floating_bar_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (object); - - switch (property_id) - { - case PROP_PRIMARY_LABEL: - { - g_value_set_string (value, self->priv->primary_label); - } - break; - - case PROP_DETAILS_LABEL: - { - g_value_set_string (value, self->priv->details_label); - } - break; - - case PROP_SHOW_SPINNER: - { - g_value_set_boolean (value, self->priv->show_spinner); - } - break; - - default: - { - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } - break; - } -} - -static void -nautilus_floating_bar_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (object); - - switch (property_id) - { - case PROP_PRIMARY_LABEL: - { - nautilus_floating_bar_set_primary_label (self, g_value_get_string (value)); - } - break; - - case PROP_DETAILS_LABEL: - { - nautilus_floating_bar_set_details_label (self, g_value_get_string (value)); - } - break; - - case PROP_SHOW_SPINNER: - { - nautilus_floating_bar_set_show_spinner (self, g_value_get_boolean (value)); - } - break; - - default: - { - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } - break; - } -} - -static void -update_labels (NautilusFloatingBar *self) -{ - gboolean primary_visible, details_visible; - - primary_visible = (self->priv->primary_label != NULL) && - (strlen (self->priv->primary_label) > 0); - details_visible = (self->priv->details_label != NULL) && - (strlen (self->priv->details_label) > 0); - - gtk_label_set_text (GTK_LABEL (self->priv->primary_label_widget), - self->priv->primary_label); - gtk_widget_set_visible (self->priv->primary_label_widget, primary_visible); - - gtk_label_set_text (GTK_LABEL (self->priv->details_label_widget), - self->priv->details_label); - gtk_widget_set_visible (self->priv->details_label_widget, details_visible); -} - -void -nautilus_floating_bar_remove_hover_timeout (NautilusFloatingBar *self) -{ - if (self->priv->hover_timeout_id != 0) - { - g_source_remove (self->priv->hover_timeout_id); - self->priv->hover_timeout_id = 0; - } -} - -typedef struct -{ - GtkWidget *overlay; - GtkWidget *floating_bar; - GdkDevice *device; - gint y_down_limit; - gint y_upper_limit; -} CheckPointerData; - -static void -check_pointer_data_free (gpointer data) -{ - g_slice_free (CheckPointerData, data); -} - -static gboolean -check_pointer_timeout (gpointer user_data) -{ - CheckPointerData *data = user_data; - gint pointer_y = -1; - - gdk_window_get_device_position (gtk_widget_get_window (data->overlay), data->device, - NULL, &pointer_y, NULL); - - if (pointer_y == -1 || pointer_y < data->y_down_limit || pointer_y > data->y_upper_limit) - { - gtk_widget_show (data->floating_bar); - NAUTILUS_FLOATING_BAR (data->floating_bar)->priv->hover_timeout_id = 0; - - return G_SOURCE_REMOVE; - } - else - { - gtk_widget_hide (data->floating_bar); - } - - return G_SOURCE_CONTINUE; -} - -static gboolean -overlay_enter_notify_cb (GtkWidget *parent, - GdkEventCrossing *event, - gpointer user_data) -{ - GtkWidget *widget = user_data; - CheckPointerData *data; - gint y_pos; - - NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (widget); - - if (self->priv->hover_timeout_id != 0) - { - g_source_remove (self->priv->hover_timeout_id); - } - - if (event->window != gtk_widget_get_window (widget)) - { - return GDK_EVENT_PROPAGATE; - } - - if (NAUTILUS_FLOATING_BAR (widget)->priv->is_interactive) - { - return GDK_EVENT_PROPAGATE; - } - - gdk_window_get_position (gtk_widget_get_window (widget), NULL, &y_pos); - - data = g_slice_new (CheckPointerData); - data->overlay = parent; - data->floating_bar = widget; - data->device = gdk_event_get_device ((GdkEvent *) event); - data->y_down_limit = y_pos; - data->y_upper_limit = y_pos + gtk_widget_get_allocated_height (widget); - - self->priv->hover_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT, HOVER_HIDE_TIMEOUT_INTERVAL, - check_pointer_timeout, data, - check_pointer_data_free); - - g_source_set_name_by_id (self->priv->hover_timeout_id, "[nautilus-floating-bar] overlay_enter_notify_cb"); - - return GDK_EVENT_STOP; -} - -static void -nautilus_floating_bar_parent_set (GtkWidget *widget, - GtkWidget *old_parent) -{ - GtkWidget *parent; - - parent = gtk_widget_get_parent (widget); - - if (old_parent != NULL) - { - g_signal_handlers_disconnect_by_func (old_parent, - overlay_enter_notify_cb, widget); - } - - if (parent != NULL) - { - g_signal_connect (parent, "enter-notify-event", - G_CALLBACK (overlay_enter_notify_cb), widget); - } -} - -static void -get_padding_and_border (GtkWidget *widget, - GtkBorder *border) -{ - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder tmp; - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_get_padding (context, state, border); - gtk_style_context_get_border (context, state, &tmp); - border->top += tmp.top; - border->right += tmp.right; - border->bottom += tmp.bottom; - border->left += tmp.left; -} - -static void -nautilus_floating_bar_get_preferred_width (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - GtkBorder border; - - get_padding_and_border (widget, &border); - - GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_width (widget, - minimum_size, - natural_size); - - *minimum_size += border.left + border.right; - *natural_size += border.left + border.right; -} - -static void -nautilus_floating_bar_get_preferred_width_for_height (GtkWidget *widget, - gint height, - gint *minimum_size, - gint *natural_size) -{ - GtkBorder border; - - get_padding_and_border (widget, &border); - - GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_width_for_height (widget, - height, - minimum_size, - natural_size); - - *minimum_size += border.left + border.right; - *natural_size += border.left + border.right; -} - -static void -nautilus_floating_bar_get_preferred_height (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - GtkBorder border; - - get_padding_and_border (widget, &border); - - GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_height (widget, - minimum_size, - natural_size); - - *minimum_size += border.top + border.bottom; - *natural_size += border.top + border.bottom; -} - -static void -nautilus_floating_bar_get_preferred_height_for_width (GtkWidget *widget, - gint width, - gint *minimum_size, - gint *natural_size) -{ - GtkBorder border; - - get_padding_and_border (widget, &border); - - GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_height_for_width (widget, - width, - minimum_size, - natural_size); - - *minimum_size += border.top + border.bottom; - *natural_size += border.top + border.bottom; -} - -static void -nautilus_floating_bar_constructed (GObject *obj) -{ - NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (obj); - GtkWidget *w, *box, *labels_box; - - G_OBJECT_CLASS (nautilus_floating_bar_parent_class)->constructed (obj); - - box = GTK_WIDGET (obj); - - w = gtk_spinner_new (); - gtk_box_pack_start (GTK_BOX (box), w, FALSE, FALSE, 0); - gtk_widget_set_visible (w, self->priv->show_spinner); - gtk_spinner_start (GTK_SPINNER (w)); - self->priv->spinner = w; - - gtk_widget_set_size_request (w, 16, 16); - gtk_widget_set_margin_start (w, 8); - - labels_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_box_pack_start (GTK_BOX (box), labels_box, TRUE, TRUE, 0); - g_object_set (labels_box, - "margin-top", 2, - "margin-bottom", 2, - "margin-start", 12, - "margin-end", 12, - NULL); - gtk_widget_show (labels_box); - - w = gtk_label_new (NULL); - gtk_label_set_ellipsize (GTK_LABEL (w), PANGO_ELLIPSIZE_MIDDLE); - gtk_label_set_single_line_mode (GTK_LABEL (w), TRUE); - gtk_container_add (GTK_CONTAINER (labels_box), w); - self->priv->primary_label_widget = w; - gtk_widget_show (w); - - w = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (w), TRUE); - gtk_container_add (GTK_CONTAINER (labels_box), w); - self->priv->details_label_widget = w; - gtk_widget_show (w); -} - -static void -nautilus_floating_bar_init (NautilusFloatingBar *self) -{ - GtkStyleContext *context; - - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NAUTILUS_TYPE_FLOATING_BAR, - NautilusFloatingBarDetails); - - context = gtk_widget_get_style_context (GTK_WIDGET (self)); - gtk_style_context_add_class (context, "floating-bar"); -} - -static void -nautilus_floating_bar_class_init (NautilusFloatingBarClass *klass) -{ - GObjectClass *oclass = G_OBJECT_CLASS (klass); - GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass); - - oclass->constructed = nautilus_floating_bar_constructed; - oclass->set_property = nautilus_floating_bar_set_property; - oclass->get_property = nautilus_floating_bar_get_property; - oclass->finalize = nautilus_floating_bar_finalize; - - wclass->get_preferred_width = nautilus_floating_bar_get_preferred_width; - wclass->get_preferred_width_for_height = nautilus_floating_bar_get_preferred_width_for_height; - wclass->get_preferred_height = nautilus_floating_bar_get_preferred_height; - wclass->get_preferred_height_for_width = nautilus_floating_bar_get_preferred_height_for_width; - wclass->parent_set = nautilus_floating_bar_parent_set; - - properties[PROP_PRIMARY_LABEL] = - g_param_spec_string ("primary-label", - "Bar's primary label", - "Primary label displayed by the bar", - NULL, - G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); - properties[PROP_DETAILS_LABEL] = - g_param_spec_string ("details-label", - "Bar's details label", - "Details label displayed by the bar", - NULL, - G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); - properties[PROP_SHOW_SPINNER] = - g_param_spec_boolean ("show-spinner", - "Show spinner", - "Whether a spinner should be shown in the floating bar", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - - signals[ACTION] = - g_signal_new ("action", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - g_type_class_add_private (klass, sizeof (NautilusFloatingBarDetails)); - g_object_class_install_properties (oclass, NUM_PROPERTIES, properties); -} - -void -nautilus_floating_bar_set_primary_label (NautilusFloatingBar *self, - const gchar *label) -{ - if (g_strcmp0 (self->priv->primary_label, label) != 0) - { - g_free (self->priv->primary_label); - self->priv->primary_label = g_strdup (label); - - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PRIMARY_LABEL]); - - update_labels (self); - } -} - -void -nautilus_floating_bar_set_details_label (NautilusFloatingBar *self, - const gchar *label) -{ - if (g_strcmp0 (self->priv->details_label, label) != 0) - { - g_free (self->priv->details_label); - self->priv->details_label = g_strdup (label); - - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DETAILS_LABEL]); - - update_labels (self); - } -} - -void -nautilus_floating_bar_set_labels (NautilusFloatingBar *self, - const gchar *primary_label, - const gchar *details_label) -{ - nautilus_floating_bar_set_primary_label (self, primary_label); - nautilus_floating_bar_set_details_label (self, details_label); -} - -void -nautilus_floating_bar_set_show_spinner (NautilusFloatingBar *self, - gboolean show_spinner) -{ - if (self->priv->show_spinner != show_spinner) - { - self->priv->show_spinner = show_spinner; - gtk_widget_set_visible (self->priv->spinner, - show_spinner); - - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_SPINNER]); - } -} - -GtkWidget * -nautilus_floating_bar_new (const gchar *primary_label, - const gchar *details_label, - gboolean show_spinner) -{ - return g_object_new (NAUTILUS_TYPE_FLOATING_BAR, - "primary-label", primary_label, - "details-label", details_label, - "show-spinner", show_spinner, - "orientation", GTK_ORIENTATION_HORIZONTAL, - "spacing", 8, - NULL); -} - -void -nautilus_floating_bar_add_action (NautilusFloatingBar *self, - const gchar *icon_name, - gint action_id) -{ - GtkWidget *button; - GtkStyleContext *context; - - button = gtk_button_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); - context = gtk_widget_get_style_context (button); - gtk_style_context_add_class (context, "circular"); - gtk_style_context_add_class (context, "flat"); - gtk_widget_set_valign (button, GTK_ALIGN_CENTER); - gtk_box_pack_end (GTK_BOX (self), button, FALSE, FALSE, 0); - gtk_widget_show (button); - - g_object_set_data (G_OBJECT (button), "action-id", - GINT_TO_POINTER (action_id)); - - g_signal_connect (button, "clicked", - G_CALLBACK (action_button_clicked_cb), self); - - self->priv->is_interactive = TRUE; -} - -void -nautilus_floating_bar_cleanup_actions (NautilusFloatingBar *self) -{ - GtkWidget *widget; - GList *children, *l; - gpointer data; - - children = gtk_container_get_children (GTK_CONTAINER (self)); - l = children; - - while (l != NULL) - { - widget = l->data; - data = g_object_get_data (G_OBJECT (widget), "action-id"); - l = l->next; - - if (data != NULL) - { - /* destroy this */ - gtk_widget_destroy (widget); - } - } - - g_list_free (children); - - self->priv->is_interactive = FALSE; -} diff --git a/src/nautilus-floating-bar.h b/src/nautilus-floating-bar.h deleted file mode 100644 index ebe8e14d5..000000000 --- a/src/nautilus-floating-bar.h +++ /dev/null @@ -1,80 +0,0 @@ - -/* Nautilus - Floating status bar. - * - * Copyright (C) 2011 Red Hat Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - * - * Authors: Cosimo Cecchi <cosimoc@redhat.com> - * - */ - -#ifndef __NAUTILUS_FLOATING_BAR_H__ -#define __NAUTILUS_FLOATING_BAR_H__ - -#include <gtk/gtk.h> - -#define NAUTILUS_FLOATING_BAR_ACTION_ID_STOP 1 - -#define NAUTILUS_TYPE_FLOATING_BAR nautilus_floating_bar_get_type() -#define NAUTILUS_FLOATING_BAR(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBar)) -#define NAUTILUS_FLOATING_BAR_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBarClass)) -#define NAUTILUS_IS_FLOATING_BAR(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_FLOATING_BAR)) -#define NAUTILUS_IS_FLOATING_BAR_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_FLOATING_BAR)) -#define NAUTILUS_FLOATING_BAR_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBarClass)) - -typedef struct _NautilusFloatingBar NautilusFloatingBar; -typedef struct _NautilusFloatingBarClass NautilusFloatingBarClass; -typedef struct _NautilusFloatingBarDetails NautilusFloatingBarDetails; - -struct _NautilusFloatingBar { - GtkBox parent; - NautilusFloatingBarDetails *priv; -}; - -struct _NautilusFloatingBarClass { - GtkBoxClass parent_class; -}; - -/* GObject */ -GType nautilus_floating_bar_get_type (void); - -GtkWidget * nautilus_floating_bar_new (const gchar *primary_label, - const gchar *details_label, - gboolean show_spinner); - -void nautilus_floating_bar_set_primary_label (NautilusFloatingBar *self, - const gchar *label); -void nautilus_floating_bar_set_details_label (NautilusFloatingBar *self, - const gchar *label); -void nautilus_floating_bar_set_labels (NautilusFloatingBar *self, - const gchar *primary, - const gchar *detail); -void nautilus_floating_bar_set_show_spinner (NautilusFloatingBar *self, - gboolean show_spinner); - -void nautilus_floating_bar_add_action (NautilusFloatingBar *self, - const gchar *icon_name, - gint action_id); -void nautilus_floating_bar_cleanup_actions (NautilusFloatingBar *self); - -void nautilus_floating_bar_remove_hover_timeout (NautilusFloatingBar *self); - -#endif /* __NAUTILUS_FLOATING_BAR_H__ */ - |