file chooser: Separate out delete and trash
authorMatthias Clasen <mclasen@redhat.com>
Tue, 7 Jul 2015 02:57:40 +0000 (22:57 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 7 Jul 2015 02:57:40 +0000 (22:57 -0400)
We only ever show one of the two context menu items (and we prefer
Move to Trash over Delete). Only use the confirmation dialog when
deleting.

gtk/gtkfilechooserwidget.c
gtk/gtksearchenginesimple.c

index c6370650ee24a4000378ac4ab6cdc8164b19e08a..bdbadee8f39d4e9bfad66e65b9a2d0d37c7e4958 100644 (file)
@@ -235,6 +235,7 @@ struct _GtkFileChooserWidgetPrivate {
   GtkWidget *visit_file_item;
   GtkWidget *open_folder_item;
   GtkWidget *rename_file_item;
+  GtkWidget *trash_file_item;
   GtkWidget *delete_file_item;
   GtkWidget *sort_directories_item;
   GtkWidget *show_time_item;
@@ -384,7 +385,8 @@ static guint signals[LAST_SIGNAL] = { 0 };
 #define MODEL_ATTRIBUTES "standard::name,standard::type,standard::display-name," \
                          "standard::is-hidden,standard::is-backup,standard::size," \
                          "standard::content-type,time::modified,time::access," \
-                         "standard::target-uri,access::can-rename,access::can-delete"
+                         "access::can-rename,access::can-delete,access::can-trash," \
+                         "standard::target-uri"
 enum {
   /* the first 3 must be these due to settings caching sort column */
   MODEL_COL_NAME,
@@ -855,6 +857,14 @@ error_deleting_file (GtkFileChooserWidget *impl,
   error_dialog (impl, _("The file could not be deleted"), file, error);
 }
 
+static void
+error_trashing_file (GtkFileChooserWidget *impl,
+                     GFile                *file,
+                     GError               *error)
+{
+  error_dialog (impl, _("The file could not be move to the Trash"), file, error);
+}
+
 /* Changes folders, displaying an error dialog if this fails */
 static gboolean
 change_folder_and_display_error (GtkFileChooserWidget *impl,
@@ -1402,6 +1412,7 @@ popup_menu_detach_cb (GtkWidget *attach_widget,
   priv->copy_file_location_item = NULL;
   priv->visit_file_item = NULL;
   priv->rename_file_item = NULL;
+  priv->trash_file_item = NULL;
   priv->delete_file_item = NULL;
   priv->open_folder_item = NULL;
   priv->sort_directories_item = NULL;
@@ -1502,26 +1513,39 @@ delete_file_cb (GtkMenuItem          *item,
     {
       GFile *file;
       GFileInfo *info;
+      GError *error = NULL;
 
       file = _gtk_file_system_model_get_file (GTK_FILE_SYSTEM_MODEL (model), &iter);
       info = _gtk_file_system_model_get_info (GTK_FILE_SYSTEM_MODEL (model), &iter);
 
       if (confirm_delete (impl, info))
         {
-          GError *error = NULL;
+          if (!g_file_delete (file, NULL, &error))
+            error_deleting_file (impl, file, error);
+        }
+    }
+}
 
-          if (!g_file_trash (file, NULL, &error))
-            {
-              if (error->code == G_IO_ERROR_NOT_SUPPORTED)
-                {
-                  g_clear_error (&error);
-                  g_file_delete (file, NULL, &error);
-                }
+static void
+trash_file_cb (GtkMenuItem          *item,
+               GtkFileChooserWidget *impl)
+{
+  GtkFileChooserWidgetPrivate *priv = impl->priv;
+  GtkTreeSelection *selection;
+  GtkTreeModel *model;
+  GtkTreeIter iter;
 
-              if (error)
-                error_deleting_file (impl, file, error);
-            }
-        }
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view));
+
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+      GFile *file;
+      GError *error = NULL;
+
+      file = _gtk_file_system_model_get_file (GTK_FILE_SYSTEM_MODEL (model), &iter);
+
+      if (!g_file_trash (file, NULL, &error))
+        error_trashing_file (impl, file, error);
     }
 }
 
@@ -2091,7 +2115,7 @@ check_file_list_menu_sensitivity (GtkFileChooserWidget *impl)
         gtk_widget_set_sensitive (priv->rename_file_item, FALSE);
     }
 
-  if (priv->delete_file_item)
+  if (priv->delete_file_item && priv->trash_file_item)
     {
       if (num_selected == 1)
         {
@@ -2103,12 +2127,31 @@ check_file_list_menu_sensitivity (GtkFileChooserWidget *impl)
           selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view));
           gtk_tree_selection_get_selected (selection, &model, &iter);
           info = _gtk_file_system_model_get_info (GTK_FILE_SYSTEM_MODEL (model), &iter);
-          gtk_widget_set_sensitive (priv->delete_file_item,
-                                    g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH) ||
-                                    g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+          if (g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH))
+            {
+              gtk_widget_set_sensitive (priv->trash_file_item, TRUE);
+              gtk_widget_set_visible (priv->delete_file_item, FALSE);
+              gtk_widget_set_visible (priv->trash_file_item, TRUE);
+            }
+          else if (g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE))
+            {
+              gtk_widget_set_sensitive (priv->delete_file_item, TRUE);
+              gtk_widget_set_visible (priv->delete_file_item, TRUE);
+              gtk_widget_set_visible (priv->trash_file_item, FALSE);
+            }
+          else
+            {
+              gtk_widget_set_sensitive (priv->trash_file_item, FALSE);
+              gtk_widget_set_visible (priv->delete_file_item, FALSE);
+              gtk_widget_set_visible (priv->trash_file_item, TRUE);
+            }
         }
       else
-        gtk_widget_set_sensitive (priv->delete_file_item, FALSE);
+        {
+          gtk_widget_set_visible (priv->delete_file_item, FALSE);
+          gtk_widget_set_visible (priv->trash_file_item, TRUE);
+          gtk_widget_set_sensitive (priv->trash_file_item, FALSE);
+        }
     }
 }
 
@@ -2177,6 +2220,9 @@ file_list_build_popup_menu (GtkFileChooserWidget *impl)
   priv->delete_file_item
     = file_list_add_menu_item (impl, _("_Delete"), G_CALLBACK (delete_file_cb));
 
+  priv->trash_file_item
+    = file_list_add_menu_item (impl, _("_Move to Trash"), G_CALLBACK (trash_file_cb));
+
   item = gtk_separator_menu_item_new ();
   gtk_widget_show (item);
   gtk_menu_shell_append (GTK_MENU_SHELL (priv->browse_files_popup_menu), item);
@@ -2208,8 +2254,14 @@ file_list_update_popup_menu (GtkFileChooserWidget *impl)
    * bookmarks_check_add_sensitivity()
    */
 
-  gtk_widget_set_visible (priv->rename_file_item, (priv->operation_mode == OPERATION_MODE_BROWSE));
-  gtk_widget_set_visible (priv->delete_file_item, (priv->operation_mode == OPERATION_MODE_BROWSE));
+  if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
+      priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+      priv->operation_mode != OPERATION_MODE_BROWSE)
+    {
+      gtk_widget_set_visible (priv->rename_file_item, FALSE);
+      gtk_widget_set_visible (priv->delete_file_item, FALSE);
+      gtk_widget_set_visible (priv->trash_file_item, FALSE);
+    }
 
   /* 'Visit this file' */
   gtk_widget_set_visible (priv->visit_file_item, (priv->operation_mode != OPERATION_MODE_BROWSE));
index 968c6e7df18172983073cb0df0e27313b8def8a7..def577a5bf7891b55f9035941b96b4e4b5047d4f 100644 (file)
@@ -222,6 +222,7 @@ visit_directory (GFile *dir, SearchThreadData *data)
                                           G_FILE_ATTRIBUTE_TIME_MODIFIED ","
                                           G_FILE_ATTRIBUTE_TIME_ACCESS ","
                                           G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME ","
+                                          G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH ","
                                           G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE,
                                           G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
                                           data->cancellable, NULL);