summaryrefslogtreecommitdiff
path: root/src/nautilus-files-view.c
diff options
context:
space:
mode:
authorAlexandru Pandelea <alexandru.pandelea@gmail.com>2017-06-28 17:47:41 +0100
committerAlexandru Pandelea <alexandru.pandelea@gmail.com>2017-08-25 10:13:13 +0100
commit8cbdfdfa41d896a0be6d2057b6e77fc5f384d1c0 (patch)
tree36581d14d58b3498a9ffddcd58905dd3945475fd /src/nautilus-files-view.c
parent921cd365a92cf4c9a4edaeab00fa4966c09da93b (diff)
downloadnautilus-8cbdfdfa41d896a0be6d2057b6e77fc5f384d1c0.tar.gz
Add favorite fileswip/alexpandelea/favorites
Add option to make files Favorite, by either toggling a star in the list view, or from the context menu. https://bugzilla.gnome.org/show_bug.cgi?id=786039
Diffstat (limited to 'src/nautilus-files-view.c')
-rw-r--r--src/nautilus-files-view.c161
1 files changed, 148 insertions, 13 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index b5402a87b..c195840a5 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -42,6 +42,7 @@
#include "nautilus-window.h"
#include "nautilus-toolbar.h"
#include "nautilus-view.h"
+#include "nautilus-tag-manager.h"
#ifdef HAVE_X11_XF86KEYSYM_H
#include <X11/XF86keysym.h>
@@ -70,6 +71,7 @@
#include <libnautilus-extension/nautilus-menu-provider.h>
#include "nautilus-clipboard.h"
#include "nautilus-search-directory.h"
+#include "nautilus-favorite-directory.h"
#include "nautilus-directory.h"
#include "nautilus-dnd.h"
#include "nautilus-file-attributes.h"
@@ -254,6 +256,7 @@ typedef struct
GtkWidget *folder_is_empty_widget;
GtkWidget *trash_is_empty_widget;
GtkWidget *no_search_results_widget;
+ GtkWidget *starred_is_empty_widget;
/* Floating bar */
guint floating_bar_set_status_timeout_id;
@@ -272,6 +275,9 @@ typedef struct
gulong stop_signal_handler;
gulong reload_signal_handler;
+
+ GCancellable *favorite_cancellable;
+ NautilusTagManager *tag_manager;
} NautilusFilesViewPrivate;
typedef struct
@@ -721,13 +727,27 @@ showing_recent_directory (NautilusFilesView *view)
}
static gboolean
+showing_starred_directory (NautilusFilesView *view)
+{
+ NautilusFile *file;
+
+ file = nautilus_files_view_get_directory_as_file (view);
+ if (file != NULL)
+ {
+ return nautilus_file_is_in_starred (file);
+ }
+ return FALSE;
+}
+
+static gboolean
nautilus_files_view_supports_creating_files (NautilusFilesView *view)
{
g_return_val_if_fail (NAUTILUS_IS_FILES_VIEW (view), FALSE);
return !nautilus_files_view_is_read_only (view)
&& !showing_trash_directory (view)
- && !showing_recent_directory (view);
+ && !showing_recent_directory (view)
+ && !showing_starred_directory (view);
}
static gboolean
@@ -1535,6 +1555,46 @@ action_delete (GSimpleAction *action,
}
static void
+action_star (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusFilesView *view;
+ GList *selection;
+ NautilusFilesViewPrivate *priv;
+
+ view = NAUTILUS_FILES_VIEW (user_data);
+ priv = nautilus_files_view_get_instance_private (view);
+ selection = nautilus_view_get_selection (NAUTILUS_VIEW (view));
+
+ nautilus_tag_manager_star_files (priv->tag_manager,
+ G_OBJECT (view),
+ selection,
+ NULL,
+ priv->favorite_cancellable);
+}
+
+static void
+action_unstar (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusFilesView *view;
+ GList *selection;
+ NautilusFilesViewPrivate *priv;
+
+ view = NAUTILUS_FILES_VIEW (user_data);
+ priv = nautilus_files_view_get_instance_private (view);
+ selection = nautilus_view_get_selection (NAUTILUS_VIEW (view));
+
+ nautilus_tag_manager_unstar_files (priv->tag_manager,
+ G_OBJECT (view),
+ selection,
+ NULL,
+ priv->favorite_cancellable);
+}
+
+static void
action_restore_from_trash (GSimpleAction *action,
GVariant *state,
gpointer user_data)
@@ -3191,6 +3251,9 @@ nautilus_files_view_finalize (GObject *object)
g_hash_table_destroy (priv->non_ready_files);
g_hash_table_destroy (priv->pending_reveal);
+ g_cancellable_cancel (priv->favorite_cancellable);
+ g_clear_object (&priv->favorite_cancellable);
+
G_OBJECT_CLASS (nautilus_files_view_parent_class)->finalize (object);
}
@@ -3439,6 +3502,10 @@ nautilus_files_view_set_location (NautilusView *view,
set_search_query_internal (files_view, previous_query, base_model);
g_object_unref (previous_query);
}
+ else if (NAUTILUS_IS_FAVORITE_DIRECTORY (directory))
+ {
+ load_directory (NAUTILUS_FILES_VIEW (view), directory);
+ }
else
{
load_directory (NAUTILUS_FILES_VIEW (view), directory);
@@ -3479,6 +3546,7 @@ real_check_empty_states (NautilusFilesView *view)
gtk_widget_hide (priv->no_search_results_widget);
gtk_widget_hide (priv->folder_is_empty_widget);
gtk_widget_hide (priv->trash_is_empty_widget);
+ gtk_widget_hide (priv->starred_is_empty_widget);
if (!priv->loading &&
nautilus_files_view_is_empty (view))
@@ -3493,6 +3561,10 @@ real_check_empty_states (NautilusFilesView *view)
{
gtk_widget_show (priv->trash_is_empty_widget);
}
+ else if (eel_uri_is_favorites (uri))
+ {
+ gtk_widget_show (priv->starred_is_empty_widget);
+ }
else
{
gtk_widget_show (priv->folder_is_empty_widget);
@@ -6979,6 +7051,8 @@ const GActionEntry view_entries[] =
{ "copy-to", action_copy_to},
{ "move-to-trash", action_move_to_trash},
{ "delete-from-trash", action_delete },
+ { "star", action_star},
+ { "unstar", action_unstar},
/* We separate the shortcut and the menu item since we want the shortcut
* to always be available, but we don't want the menu item shown if not
* completely necesary. Since the visibility of the menu item is based on
@@ -7058,6 +7132,7 @@ on_clipboard_contents_received (GtkClipboard *clipboard,
gboolean settings_show_create_link;
gboolean is_read_only;
gboolean selection_contains_recent;
+ gboolean selection_contains_starred;
GAction *action;
view = NAUTILUS_FILES_VIEW (user_data);
@@ -7075,9 +7150,10 @@ on_clipboard_contents_received (GtkClipboard *clipboard,
NAUTILUS_PREFERENCES_SHOW_CREATE_LINK);
is_read_only = nautilus_files_view_is_read_only (view);
selection_contains_recent = showing_recent_directory (view);
+ selection_contains_starred = showing_starred_directory (view);
can_link_from_copied_files = !nautilus_clipboard_is_cut_from_selection_data (selection_data) &&
- !selection_contains_recent && !is_read_only &&
- gtk_selection_data_get_length (selection_data) > 0;
+ !selection_contains_recent && !selection_contains_starred &&
+ !is_read_only && gtk_selection_data_get_length (selection_data) > 0;
action = g_action_map_lookup_action (G_ACTION_MAP (priv->view_action_group),
"create-link");
@@ -7364,6 +7440,7 @@ real_update_actions_state (NautilusFilesView *view)
gboolean selection_contains_desktop_or_home_dir;
gboolean selection_contains_recent;
gboolean selection_contains_search;
+ gboolean selection_contains_starred;
gboolean selection_all_in_trash;
gboolean selection_is_read_only;
gboolean can_create_files;
@@ -7388,6 +7465,9 @@ real_update_actions_state (NautilusFilesView *view)
gboolean settings_show_delete_permanently;
gboolean settings_show_create_link;
GDriveStartStopType start_stop_type;
+ gboolean show_star;
+ gboolean show_unstar;
+ gchar *uri;
priv = nautilus_files_view_get_instance_private (view);
@@ -7398,6 +7478,7 @@ real_update_actions_state (NautilusFilesView *view)
selection_contains_special_link = nautilus_files_view_special_link_in_selection (view, selection);
selection_contains_desktop_or_home_dir = desktop_or_home_dir_in_selection (selection);
selection_contains_recent = showing_recent_directory (view);
+ selection_contains_starred = showing_starred_directory (view);
selection_contains_search = nautilus_view_is_searching (NAUTILUS_VIEW (view));
selection_is_read_only = selection_count == 1 &&
(!nautilus_file_can_write (NAUTILUS_FILE (selection->data)) &&
@@ -7419,8 +7500,10 @@ real_update_actions_state (NautilusFilesView *view)
!selection_contains_desktop_or_home_dir;
can_copy_files = selection_count != 0
&& !selection_contains_special_link;
- can_move_files = can_delete_files && !selection_contains_recent;
+ can_move_files = can_delete_files && !selection_contains_recent &&
+ !selection_contains_starred;
can_paste_files_into = (!selection_contains_recent &&
+ !selection_contains_starred &&
selection_count == 1 &&
can_paste_into_file (NAUTILUS_FILE (selection->data)));
can_extract_files = selection_count != 0 &&
@@ -7436,7 +7519,8 @@ real_update_actions_state (NautilusFilesView *view)
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"new-folder-with-selection");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
- can_create_files && can_delete_files && (selection_count > 1) && !selection_contains_recent);
+ can_create_files && can_delete_files && (selection_count > 1) && !selection_contains_recent
+ && !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"rename");
@@ -7484,7 +7568,8 @@ real_update_actions_state (NautilusFilesView *view)
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
selection_count == 1 &&
- (selection_contains_recent || selection_contains_search));
+ (selection_contains_recent || selection_contains_search ||
+ selection_contains_starred));
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"new-folder");
@@ -7550,14 +7635,16 @@ real_update_actions_state (NautilusFilesView *view)
"delete-permanently-menu-item");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
can_delete_files && !can_trash_files &&
- !selection_all_in_trash && !selection_contains_recent);
+ !selection_all_in_trash && !selection_contains_recent &&
+ !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"permanent-delete-permanently-menu-item");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
can_delete_files && can_trash_files &&
settings_show_delete_permanently &&
- !selection_all_in_trash && !selection_contains_recent);
+ !selection_all_in_trash && !selection_contains_recent &&
+ !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"remove-from-recent");
@@ -7567,7 +7654,8 @@ real_update_actions_state (NautilusFilesView *view)
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"cut");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
- can_move_files && !selection_contains_recent);
+ can_move_files && !selection_contains_recent &&
+ !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"copy");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
@@ -7585,7 +7673,8 @@ real_update_actions_state (NautilusFilesView *view)
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"move-to");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
- can_move_files && !selection_contains_recent);
+ can_move_files && !selection_contains_recent &&
+ !selection_contains_starred);
/* Drive menu */
show_mount = (selection != NULL);
@@ -7662,13 +7751,14 @@ real_update_actions_state (NautilusFilesView *view)
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"paste");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
- !is_read_only && !selection_contains_recent);
+ !is_read_only && !selection_contains_recent &&
+ !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"paste-into");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
!selection_is_read_only && !selection_contains_recent &&
- can_paste_files_into);
+ can_paste_files_into && !selection_contains_starred);
action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
"properties");
@@ -7679,6 +7769,7 @@ real_update_actions_state (NautilusFilesView *view)
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
can_create_files &&
!selection_contains_recent &&
+ !selection_contains_starred &&
priv->templates_present);
/* Actions that are related to the clipboard need request, request the data
@@ -7722,6 +7813,38 @@ real_update_actions_state (NautilusFilesView *view)
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
!nautilus_files_view_is_empty (view));
+ show_star = (selection != NULL);
+ show_unstar = (selection != NULL);
+ for (l = selection; l != NULL; l = l->next)
+ {
+ file = NAUTILUS_FILE (l->data);
+ uri = nautilus_file_get_uri (file);
+
+ if (!show_star && !show_unstar)
+ {
+ break;
+ }
+
+ if (nautilus_tag_manager_file_is_favorite (priv->tag_manager, uri))
+ {
+ show_star = FALSE;
+ }
+ else
+ {
+ show_unstar = FALSE;
+ }
+
+ g_free (uri);
+ }
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
+ "star");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), show_star);
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
+ "unstar");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), show_unstar);
+
nautilus_file_list_free (selection);
}
@@ -7996,7 +8119,8 @@ static void
update_background_menu (NautilusFilesView *view)
{
if (nautilus_files_view_supports_creating_files (view) &&
- !showing_recent_directory (view))
+ !showing_recent_directory (view) &&
+ !showing_starred_directory (view))
{
update_templates_menu (view);
}
@@ -9554,6 +9678,14 @@ nautilus_files_view_init (NautilusFilesView *view)
TRUE);
g_object_unref (builder);
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-starred-is-empty.ui");
+ priv->starred_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, "starred_is_empty"));
+ gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->starred_is_empty_widget);
+ gtk_overlay_set_overlay_pass_through (GTK_OVERLAY (priv->overlay),
+ priv->starred_is_empty_widget,
+ TRUE);
+ g_object_unref (builder);
+
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-trash-is-empty.ui");
priv->trash_is_empty_widget = GTK_WIDGET (gtk_builder_get_object (builder, "trash_is_empty"));
gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->trash_is_empty_widget);
@@ -9695,6 +9827,9 @@ nautilus_files_view_init (NautilusFilesView *view)
* changed */
nautilus_application_set_accelerator (app, "view.show-move-to-trash-shortcut-changed-dialog", "<control>Delete");
+ priv->favorite_cancellable = g_cancellable_new ();
+ priv->tag_manager = nautilus_tag_manager_get ();
+
nautilus_profile_end (NULL);
}