From 4832cab6f92470786cb6b38551d0021f12e245b0 Mon Sep 17 00:00:00 2001 From: Nick Schermer <nick@xfce.org> Date: Tue, 30 Oct 2012 21:52:01 +0100 Subject: [PATCH] Add menu item for permanent delete. Rename the old delete action to "Move to Trash" and add permanent delete action. THe action still requests if you //really// want to, but it got a bit easier. --- thunar/thunar-standard-view-ui.xml | 4 +++ thunar/thunar-standard-view.c | 43 ++++++++++++++++++---- thunar/thunar-tree-view.c | 58 +++++++++++++++++++++++++++--- 3 files changed, 94 insertions(+), 11 deletions(-) diff --git a/thunar/thunar-standard-view-ui.xml b/thunar/thunar-standard-view-ui.xml index 067892455..b91d60efd 100644 --- a/thunar/thunar-standard-view-ui.xml +++ b/thunar/thunar-standard-view-ui.xml @@ -26,6 +26,8 @@ <menuitem action="cut" /> <menuitem action="copy" /> <menuitem action="paste" /> + <separator /> + <menuitem action="move-to-trash" /> <menuitem action="delete" /> </placeholder> <placeholder name="placeholder-edit-select-actions"> @@ -54,6 +56,8 @@ <menuitem action="cut" /> <menuitem action="copy" /> <menuitem action="paste-into-folder" /> + <separator /> + <menuitem action="move-to-trash" /> <menuitem action="delete" /> </placeholder> <placeholder name="placeholder-edit-actions"> diff --git a/thunar/thunar-standard-view.c b/thunar/thunar-standard-view.c index 4e487df2a..4323a9cf4 100644 --- a/thunar/thunar-standard-view.c +++ b/thunar/thunar-standard-view.c @@ -40,6 +40,7 @@ #include <thunar/thunar-gio-extensions.h> #include <thunar/thunar-gobject-extensions.h> #include <thunar/thunar-gtk-extensions.h> +#include <thunar/thunar-stock.h> #include <thunar/thunar-icon-renderer.h> #include <thunar/thunar-marshal.h> #include <thunar/thunar-private.h> @@ -180,7 +181,9 @@ static void thunar_standard_view_action_copy (Gtk ThunarStandardView *standard_view); static void thunar_standard_view_action_paste (GtkAction *action, ThunarStandardView *standard_view); -static void thunar_standard_view_action_delete (GtkAction *action, +static void thunar_standard_view_action_move_to_trash (GtkAction *action, + ThunarStandardView *standard_view); +static void thunar_standard_view_action_delete (GtkAction *action, ThunarStandardView *standard_view); static void thunar_standard_view_action_paste_into_folder (GtkAction *action, ThunarStandardView *standard_view); @@ -297,6 +300,7 @@ struct _ThunarStandardViewPrivate GtkAction *action_cut; GtkAction *action_copy; GtkAction *action_paste; + GtkAction *action_move_to_trash; GtkAction *action_delete; GtkAction *action_paste_into_folder; GtkAction *action_duplicate; @@ -380,6 +384,7 @@ static const GtkActionEntry action_entries[] = { "cut", GTK_STOCK_CUT, N_ ("Cu_t"), NULL, NULL, G_CALLBACK (thunar_standard_view_action_cut), }, { "copy", GTK_STOCK_COPY, N_ ("_Copy"), NULL, NULL, G_CALLBACK (thunar_standard_view_action_copy), }, { "paste", GTK_STOCK_PASTE, N_ ("_Paste"), NULL, N_ ("Move or copy files previously selected by a Cut or Copy command"), G_CALLBACK (thunar_standard_view_action_paste), }, + { "move-to-trash", THUNAR_STOCK_TRASH_FULL, N_ ("Mo_ve to Tash"), NULL, NULL, G_CALLBACK (thunar_standard_view_action_move_to_trash), }, { "delete", GTK_STOCK_DELETE, N_ ("_Delete"), NULL, NULL, G_CALLBACK (thunar_standard_view_action_delete), }, { "paste-into-folder", GTK_STOCK_PASTE, N_ ("Paste Into Folder"), NULL, N_ ("Move or copy files previously selected by a Cut or Copy command into the selected folder"), G_CALLBACK (thunar_standard_view_action_paste_into_folder), }, { "select-all-files", NULL, N_ ("Select _all Files"), NULL, N_ ("Select all files in this window"), G_CALLBACK (thunar_standard_view_action_select_all_files), }, @@ -621,6 +626,7 @@ thunar_standard_view_init (ThunarStandardView *standard_view) standard_view->priv->action_cut = gtk_action_group_get_action (standard_view->action_group, "cut"); standard_view->priv->action_copy = gtk_action_group_get_action (standard_view->action_group, "copy"); standard_view->priv->action_paste = gtk_action_group_get_action (standard_view->action_group, "paste"); + standard_view->priv->action_move_to_trash = gtk_action_group_get_action (standard_view->action_group, "move-to-trash"); standard_view->priv->action_delete = gtk_action_group_get_action (standard_view->action_group, "delete"); standard_view->priv->action_paste_into_folder = gtk_action_group_get_action (standard_view->action_group, "paste-into-folder"); standard_view->priv->action_duplicate = gtk_action_group_get_action (standard_view->action_group, "duplicate"); @@ -1767,7 +1773,7 @@ thunar_standard_view_scroll_to_file (ThunarView *view, static gboolean thunar_standard_view_delete_selected_files (ThunarStandardView *standard_view) { - GtkAction *action = GTK_ACTION (standard_view->priv->action_delete); + GtkAction *action = GTK_ACTION (standard_view->priv->action_move_to_trash); const gchar *accel_path; GtkAccelKey key; @@ -2374,8 +2380,8 @@ thunar_standard_view_action_paste (GtkAction *action, static void -thunar_standard_view_action_delete (GtkAction *action, - ThunarStandardView *standard_view) +thunar_standard_view_action_move_to_trash (GtkAction *action, + ThunarStandardView *standard_view) { ThunarApplication *application; gboolean permanently; @@ -2408,6 +2414,23 @@ thunar_standard_view_action_delete (GtkAction *action, +static void +thunar_standard_view_action_delete (GtkAction *action, + ThunarStandardView *standard_view) +{ + ThunarApplication *application; + + _thunar_return_if_fail (GTK_IS_ACTION (action)); + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + + /* delete the selected files */ + application = thunar_application_get (); + thunar_application_unlink_files (application, GTK_WIDGET (standard_view), standard_view->priv->selected_files, TRUE); + g_object_unref (G_OBJECT (application)); +} + + + static void thunar_standard_view_action_paste_into_folder (GtkAction *action, ThunarStandardView *standard_view) @@ -4057,11 +4080,19 @@ thunar_standard_view_selection_changed (ThunarStandardView *standard_view) /* update the "Paste" action */ gtk_action_set_sensitive (standard_view->priv->action_paste, writable && pastable); + /* update the "Move to Trash" action */ + g_object_set (G_OBJECT (standard_view->priv->action_move_to_trash), + "sensitive", (n_selected_files > 0) && writable, + "tooltip", ngettext ("Move the selected file to the Trash", + "Move the selected files to the Trash", + n_selected_files), + NULL); + /* update the "Delete" action */ g_object_set (G_OBJECT (standard_view->priv->action_delete), "sensitive", (n_selected_files > 0) && writable, - "tooltip", ngettext ("Delete the selected file", - "Delete the selected files", + "tooltip", ngettext ("Permanently delete the selected file", + "Permanently delete the selected files", n_selected_files), NULL); diff --git a/thunar/thunar-tree-view.c b/thunar/thunar-tree-view.c index 83b4d350b..b652270e9 100644 --- a/thunar/thunar-tree-view.c +++ b/thunar/thunar-tree-view.c @@ -36,6 +36,7 @@ #include <thunar/thunar-marshal.h> #include <thunar/thunar-preferences.h> #include <thunar/thunar-private.h> +#include <thunar/thunar-stock.h> #include <thunar/thunar-properties-dialog.h> #include <thunar/thunar-shortcuts-icon-renderer.h> #include <thunar/thunar-simple-job.h> @@ -146,6 +147,7 @@ static ThunarDevice *thunar_tree_view_get_selected_device (T static void thunar_tree_view_action_copy (ThunarTreeView *view); static void thunar_tree_view_action_create_folder (ThunarTreeView *view); static void thunar_tree_view_action_cut (ThunarTreeView *view); +static void thunar_tree_view_action_move_to_trash (ThunarTreeView *view); static void thunar_tree_view_action_delete (ThunarTreeView *view); static void thunar_tree_view_action_rename (ThunarTreeView *view); static void thunar_tree_view_action_eject (ThunarTreeView *view); @@ -1063,12 +1065,12 @@ thunar_tree_view_delete_selected_files (ThunarTreeView *view) /* Check if there is a user defined accelerator for the delete action, * if there is, skip events from the hard-coded keys which are set in * the class of the standard view. See bug #4173. */ - if (gtk_accel_map_lookup_entry ("<Actions>/ThunarStandardView/delete", &key) + if (gtk_accel_map_lookup_entry ("<Actions>/ThunarStandardView/move-to-trash", &key) && (key.accel_key != 0 || key.accel_mods != 0)) return FALSE; /* ask the user whether to delete the folder... */ - thunar_tree_view_action_delete (view); + thunar_tree_view_action_move_to_trash (view); /* ...and we're done */ return TRUE; @@ -1117,14 +1119,14 @@ thunar_tree_view_context_menu (ThunarTreeView *view, gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); /* append the "Open in New Tab" menu action */ - item = gtk_image_menu_item_new_with_mnemonic (_("Open in New Tab")); + item = gtk_image_menu_item_new_with_mnemonic (_("Open in New _Tab")); g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_tree_view_action_open_in_new_tab), view); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_set_sensitive (item, (file != NULL || device != NULL)); gtk_widget_show (item); /* append the "Open in New Window" menu action */ - item = gtk_image_menu_item_new_with_mnemonic (_("Open in New Window")); + item = gtk_image_menu_item_new_with_mnemonic (_("Open in New _Window")); g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_tree_view_action_open_in_new_window), view); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_set_sensitive (item, (file != NULL || device != NULL)); @@ -1256,6 +1258,22 @@ thunar_tree_view_context_menu (ThunarTreeView *view, /* determine the parent file (required to determine "Delete" sensitivity) */ parent_file = thunar_file_get_parent (file, NULL); + /* append a separator item */ + item = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show (item); + + /* append the "Delete" menu action */ + item = gtk_image_menu_item_new_with_mnemonic (_("Mo_ve to Trash")); + g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_tree_view_action_move_to_trash), view); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_set_sensitive (item, (parent_file != NULL && thunar_file_is_writable (parent_file))); + gtk_widget_show (item); + + /* set the stock icon */ + image = gtk_image_new_from_stock (THUNAR_STOCK_TRASH_FULL, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + /* append the "Delete" menu action */ item = gtk_image_menu_item_new_with_mnemonic (_("_Delete")); g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_tree_view_action_delete), view); @@ -1653,7 +1671,7 @@ thunar_tree_view_action_cut (ThunarTreeView *view) static void -thunar_tree_view_action_delete (ThunarTreeView *view) +thunar_tree_view_action_move_to_trash (ThunarTreeView *view) { ThunarApplication *application; ThunarFile *file; @@ -1687,6 +1705,36 @@ thunar_tree_view_action_delete (ThunarTreeView *view) +static void +thunar_tree_view_action_delete (ThunarTreeView *view) +{ + ThunarApplication *application; + ThunarFile *file; + GList file_list; + + _thunar_return_if_fail (THUNAR_IS_TREE_VIEW (view)); + + /* determine the selected file */ + file = thunar_tree_view_get_selected_file (view); + if (G_LIKELY (file != NULL)) + { + /* fake a file list */ + file_list.data = file; + file_list.next = NULL; + file_list.prev = NULL; + + /* delete the file */ + application = thunar_application_get (); + thunar_application_unlink_files (application, GTK_WIDGET (view), &file_list, TRUE); + g_object_unref (G_OBJECT (application)); + + /* release the file */ + g_object_unref (G_OBJECT (file)); + } +} + + + static void thunar_tree_view_rename_error (ExoJob *job, GError *error, -- GitLab