diff options
-rw-r--r-- | data/org.gnome.nautilus.gschema.xml | 5 | ||||
-rw-r--r-- | libnautilus-private/nautilus-clipboard-monitor.c | 10 | ||||
-rw-r--r-- | libnautilus-private/nautilus-clipboard-monitor.h | 1 | ||||
-rw-r--r-- | src/nautilus-files-view.c | 84 | ||||
-rw-r--r-- | src/resources/ui/nautilus-files-view-context-menus.ui | 7 |
5 files changed, 98 insertions, 9 deletions
diff --git a/data/org.gnome.nautilus.gschema.xml b/data/org.gnome.nautilus.gschema.xml index 9aece594f..bf03e0308 100644 --- a/data/org.gnome.nautilus.gschema.xml +++ b/data/org.gnome.nautilus.gschema.xml @@ -81,6 +81,11 @@ <summary>Whether to show a context menu item to delete permanently</summary> <description>If set to true Nautilus will show a delete permanently context menu item to bypass the trash.</description> </key> + <key type="b" name="show-create-link"> + <default>false</default> + <summary>Whether to show a context menu item to create links from copied files</summary> + <description>If set to true Nautilus will show a create link context menu item to create links from the copied files</description> + </key> <key type="b" name="confirm-trash"> <default>true</default> <summary>Whether to ask for confirmation when deleting files, or emptying Trash</summary> diff --git a/libnautilus-private/nautilus-clipboard-monitor.c b/libnautilus-private/nautilus-clipboard-monitor.c index 9ae66f6c2..891401a4a 100644 --- a/libnautilus-private/nautilus-clipboard-monitor.c +++ b/libnautilus-private/nautilus-clipboard-monitor.c @@ -205,6 +205,16 @@ nautilus_clipboard_monitor_get_clipboard_info (NautilusClipboardMonitor *monitor return monitor->details->info; } +gboolean +nautilus_clipboard_monitor_is_cut (NautilusClipboardMonitor *monitor) +{ + NautilusClipboardInfo *info; + + info = nautilus_clipboard_monitor_get_clipboard_info (monitor); + + return info != NULL ? info->cut : FALSE; +} + void nautilus_clear_clipboard_callback (GtkClipboard *clipboard, gpointer user_data) diff --git a/libnautilus-private/nautilus-clipboard-monitor.h b/libnautilus-private/nautilus-clipboard-monitor.h index 8aa4788a5..7d1e6faf4 100644 --- a/libnautilus-private/nautilus-clipboard-monitor.h +++ b/libnautilus-private/nautilus-clipboard-monitor.h @@ -65,6 +65,7 @@ NautilusClipboardMonitor * nautilus_clipboard_monitor_get (void); void nautilus_clipboard_monitor_set_clipboard_info (NautilusClipboardMonitor *monitor, NautilusClipboardInfo *info); NautilusClipboardInfo * nautilus_clipboard_monitor_get_clipboard_info (NautilusClipboardMonitor *monitor); +gboolean nautilus_clipboard_monitor_is_cut (NautilusClipboardMonitor *monitor); void nautilus_clipboard_monitor_emit_changed (void); void nautilus_clear_clipboard_callback (GtkClipboard *clipboard, diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 1a7842583..1efeb5ed0 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -2402,24 +2402,23 @@ action_open_item_new_window (GSimpleAction *action, } static void -paste_clipboard_data (NautilusFilesView *view, - GtkSelectionData *selection_data, - char *destination_uri) +handle_clipboard_data (NautilusFilesView *view, + GtkSelectionData *selection_data, + char *destination_uri, + GdkDragAction action) { - gboolean cut; GList *item_uris; - cut = FALSE; - item_uris = nautilus_clipboard_get_uri_list_from_selection_data (selection_data, &cut, + item_uris = nautilus_clipboard_get_uri_list_from_selection_data (selection_data, NULL, copied_files_atom); if (item_uris != NULL && destination_uri != NULL) { nautilus_files_view_move_copy_items (view, item_uris, NULL, destination_uri, - cut ? GDK_ACTION_MOVE : GDK_ACTION_COPY, - 0, 0); + action, + 0, 0); /* If items are cut then remove from clipboard */ - if (cut) { + if (action == GDK_ACTION_MOVE) { gtk_clipboard_clear (nautilus_clipboard_get (GTK_WIDGET (view))); } @@ -2428,6 +2427,19 @@ paste_clipboard_data (NautilusFilesView *view, } static void +paste_clipboard_data (NautilusFilesView *view, + GtkSelectionData *selection_data, + char *destination_uri) +{ + GdkDragAction action; + + action = nautilus_clipboard_monitor_is_cut (nautilus_clipboard_monitor_get ()) ? + GDK_ACTION_MOVE : GDK_ACTION_COPY; + + handle_clipboard_data (view, selection_data, destination_uri, action); +} + +static void paste_clipboard_received_callback (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer data) @@ -2467,6 +2479,45 @@ action_paste_files (GSimpleAction *action, } static void +create_links_clipboard_received_callback (GtkClipboard *clipboard, + GtkSelectionData *selection_data, + gpointer data) +{ + NautilusFilesView *view; + char *view_uri; + + view = NAUTILUS_FILES_VIEW (data); + + view_uri = nautilus_files_view_get_backing_uri (view); + + if (view->details->slot != NULL) { + handle_clipboard_data (view, selection_data, view_uri, GDK_ACTION_LINK); + } + + g_free (view_uri); + + g_object_unref (view); +} + +static void +action_create_links (GSimpleAction *action, + GVariant *state, + gpointer user_data) +{ + NautilusFilesView *view; + + g_assert (NAUTILUS_IS_FILES_VIEW (user_data)); + + view = NAUTILUS_FILES_VIEW (user_data); + + g_object_ref (view); + gtk_clipboard_request_contents (nautilus_clipboard_get (GTK_WIDGET (view)), + copied_files_atom, + create_links_clipboard_received_callback, + view); +} + +static void click_policy_changed_callback (gpointer callback_data) { NautilusFilesView *view; @@ -5876,6 +5927,7 @@ const GActionEntry view_entries[] = { { "new-folder", action_new_folder }, { "select-all", action_select_all }, { "paste", action_paste_files }, + { "create-link", action_create_links }, { "new-document" }, /* Selection menu */ { "scripts" }, @@ -6164,6 +6216,7 @@ real_update_actions_state (NautilusFilesView *view) gboolean can_move_files; gboolean can_trash_files; gboolean can_copy_files; + gboolean can_link_files; gboolean can_paste_files_into; gboolean show_app, show_run; gboolean item_opens_in_view; @@ -6179,6 +6232,7 @@ real_update_actions_state (NautilusFilesView *view) gboolean show_stop; gboolean show_detect_media; gboolean settings_show_delete_permanently; + gboolean settings_show_create_link; GDriveStartStopType start_stop_type; view_action_group = view->details->view_action_group; @@ -6208,6 +6262,9 @@ real_update_actions_state (NautilusFilesView *view) !selection_contains_desktop_or_home_dir; can_copy_files = selection_count != 0 && !selection_contains_special_link; + can_link_files = (!nautilus_clipboard_monitor_is_cut (nautilus_clipboard_monitor_get ()) && + !selection_contains_recent && + !is_read_only); can_move_files = can_delete_files && !selection_contains_recent; can_paste_files_into = (!selection_contains_recent && selection_count == 1 && @@ -6215,6 +6272,8 @@ real_update_actions_state (NautilusFilesView *view) show_properties = !NAUTILUS_IS_DESKTOP_CANVAS_VIEW (view) || selection_count > 0; settings_show_delete_permanently = g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_SHOW_DELETE_PERMANENTLY); + settings_show_create_link = g_settings_get_boolean (nautilus_preferences, + NAUTILUS_PREFERENCES_SHOW_CREATE_LINK); /* Right click actions */ /* Selection menu actions */ @@ -6425,6 +6484,12 @@ real_update_actions_state (NautilusFilesView *view) !is_read_only && !selection_contains_recent); action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group), + "create-link"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + can_link_files && + settings_show_create_link); + + 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 && @@ -8150,6 +8215,7 @@ nautilus_files_view_init (NautilusFilesView *view) /* Background menu */ nautilus_application_add_accelerator (app, "view.select-all", "<control>a"); nautilus_application_add_accelerator (app, "view.paste", "<control>v"); + nautilus_application_add_accelerator (app, "view.create-link", "<control>m"); /* Selection menu */ gtk_application_set_accels_for_action (GTK_APPLICATION (app), "view.open-with-default-application", open_accels); diff --git a/src/resources/ui/nautilus-files-view-context-menus.ui b/src/resources/ui/nautilus-files-view-context-menus.ui index 238ac38d2..b60ab1f08 100644 --- a/src/resources/ui/nautilus-files-view-context-menus.ui +++ b/src/resources/ui/nautilus-files-view-context-menus.ui @@ -19,6 +19,13 @@ </section> <section> <item> + <attribute name="label" translatable="yes">Create _Link</attribute> + <attribute name="action">view.create-link</attribute> + <attribute name="hidden-when">action-disabled</attribute> + </item> + </section> + <section> + <item> <attribute name="label" translatable="yes">Select _All</attribute> <attribute name="action">view.select-all</attribute> </item> |