[filechooser] bgo#349502: Context menu option to copy selected files to the clipboard
This commit is contained in:
committed by
Federico Mena Quintero
parent
c4ad589fd5
commit
c9023cadbf
@@ -86,6 +86,10 @@
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
/* Values for GtkSelection-related "info" fields */
|
||||
#define SELECTION_TEXT 0
|
||||
#define SELECTION_URI 1
|
||||
|
||||
/* Profiling stuff */
|
||||
#undef PROFILE_FILE_CHOOSER
|
||||
#ifdef PROFILE_FILE_CHOOSER
|
||||
@@ -96,6 +100,7 @@
|
||||
#endif
|
||||
|
||||
#define PROFILE_INDENT 4
|
||||
|
||||
static int profile_indent;
|
||||
|
||||
static void
|
||||
@@ -3787,6 +3792,7 @@ popup_menu_detach_cb (GtkWidget *attach_widget,
|
||||
impl->browse_files_popup_menu = NULL;
|
||||
impl->browse_files_popup_menu_add_shortcut_item = NULL;
|
||||
impl->browse_files_popup_menu_hidden_files_item = NULL;
|
||||
impl->browse_files_popup_menu_copy_file_location_item = NULL;
|
||||
}
|
||||
|
||||
/* Callback used when the "Add to Bookmarks" menu item is activated */
|
||||
@@ -3797,6 +3803,97 @@ add_to_shortcuts_cb (GtkMenuItem *item,
|
||||
bookmarks_add_selected_folder (impl);
|
||||
}
|
||||
|
||||
/* callback used to set data to clipboard */
|
||||
static void
|
||||
copy_file_get_cb (GtkClipboard *clipboard,
|
||||
GtkSelectionData *selection_data,
|
||||
guint info,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *selected_files = data;
|
||||
|
||||
if (selected_files)
|
||||
{
|
||||
gint num_files = g_slist_length (selected_files);
|
||||
gchar **uris;
|
||||
gint i;
|
||||
GSList *l;
|
||||
|
||||
uris = g_new (gchar *, num_files + 1);
|
||||
uris[num_files] = NULL; /* null terminator */
|
||||
|
||||
i = 0;
|
||||
|
||||
for (l = selected_files; l; l = l->next)
|
||||
{
|
||||
GFile *file = (GFile *) l->data;
|
||||
|
||||
if (info == SELECTION_URI)
|
||||
uris[i] = g_file_get_uri (file);
|
||||
else /* if (info == SELECTION_TEXT) - let this be the fallback */
|
||||
uris[i] = g_file_get_parse_name (file);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
if (info == SELECTION_URI)
|
||||
gtk_selection_data_set_uris (selection_data, uris);
|
||||
else /* if (info == SELECTION_TEXT) - let this be the fallback */
|
||||
{
|
||||
char *str = g_strjoinv (" ", uris);
|
||||
gtk_selection_data_set_text (selection_data, str, -1);
|
||||
g_free (str);
|
||||
}
|
||||
|
||||
g_strfreev (uris);
|
||||
}
|
||||
}
|
||||
|
||||
/* callback used to clear the clipboard data */
|
||||
static void
|
||||
copy_file_clear_cb (GtkClipboard *clipboard,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *selected_files = data;
|
||||
|
||||
g_slist_foreach (selected_files, (GFunc) g_object_unref, NULL);
|
||||
g_slist_free (selected_files);
|
||||
}
|
||||
|
||||
/* Callback used when the "Copy file's location" menu item is activated */
|
||||
static void
|
||||
copy_file_location_cb (GtkMenuItem *item,
|
||||
GtkFileChooserDefault *impl)
|
||||
{
|
||||
GSList *selected_files = NULL;
|
||||
|
||||
selected_files = search_get_selected_files (impl);
|
||||
|
||||
if (selected_files)
|
||||
{
|
||||
GtkClipboard *clipboard;
|
||||
GtkTargetList *target_list;
|
||||
GtkTargetEntry *targets;
|
||||
int n_targets;
|
||||
|
||||
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (impl), GDK_SELECTION_CLIPBOARD);
|
||||
|
||||
target_list = gtk_target_list_new (NULL, 0);
|
||||
gtk_target_list_add_text_targets (target_list, SELECTION_TEXT);
|
||||
gtk_target_list_add_uri_targets (target_list, SELECTION_URI);
|
||||
|
||||
targets = gtk_target_table_new_from_list (target_list, &n_targets);
|
||||
gtk_target_list_unref (target_list);
|
||||
|
||||
gtk_clipboard_set_with_data (clipboard, targets, n_targets,
|
||||
copy_file_get_cb,
|
||||
copy_file_clear_cb,
|
||||
selected_files);
|
||||
|
||||
gtk_target_table_free (targets, n_targets);
|
||||
}
|
||||
}
|
||||
|
||||
/* Callback used when the "Show Hidden Files" menu item is toggled */
|
||||
static void
|
||||
show_hidden_toggled_cb (GtkCheckMenuItem *item,
|
||||
@@ -3984,6 +4081,24 @@ file_list_drag_motion_cb (GtkWidget *widget,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Sensitizes the "Copy file's location" context menu item if there is actually
|
||||
* a selection active.
|
||||
*/
|
||||
static void
|
||||
check_copy_file_location_sensitivity (GtkFileChooserDefault *impl)
|
||||
{
|
||||
GtkTreeSelection *selection;
|
||||
gboolean active;
|
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
|
||||
if (gtk_tree_selection_count_selected_rows (selection) == 0)
|
||||
active = FALSE;
|
||||
else
|
||||
active = TRUE;
|
||||
|
||||
gtk_widget_set_sensitive (impl->browse_files_popup_menu_copy_file_location_item, active);
|
||||
}
|
||||
|
||||
/* Constructs the popup menu for the file list if needed */
|
||||
static void
|
||||
file_list_build_popup_menu (GtkFileChooserDefault *impl)
|
||||
@@ -3998,6 +4113,15 @@ file_list_build_popup_menu (GtkFileChooserDefault *impl)
|
||||
impl->browse_files_tree_view,
|
||||
popup_menu_detach_cb);
|
||||
|
||||
item = gtk_image_menu_item_new_with_mnemonic (_("_Copy file's location"));
|
||||
impl->browse_files_popup_menu_copy_file_location_item = item;
|
||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
|
||||
gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU));
|
||||
g_signal_connect (item, "activate",
|
||||
G_CALLBACK (copy_file_location_cb), impl);
|
||||
gtk_widget_show (item);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu), item);
|
||||
|
||||
item = gtk_image_menu_item_new_with_mnemonic (_("_Add to Bookmarks"));
|
||||
impl->browse_files_popup_menu_add_shortcut_item = item;
|
||||
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
|
||||
@@ -4026,6 +4150,7 @@ file_list_build_popup_menu (GtkFileChooserDefault *impl)
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu), item);
|
||||
|
||||
bookmarks_check_add_sensitivity (impl);
|
||||
check_copy_file_location_sensitivity (impl);
|
||||
}
|
||||
|
||||
/* Updates the popup menu for the file list, creating it if necessary */
|
||||
@@ -9969,6 +10094,7 @@ list_selection_changed (GtkTreeSelection *selection,
|
||||
|
||||
check_preview_change (impl);
|
||||
bookmarks_check_add_sensitivity (impl);
|
||||
check_copy_file_location_sensitivity (impl);
|
||||
|
||||
g_signal_emit_by_name (impl, "selection-changed", 0);
|
||||
}
|
||||
|
||||
@@ -180,6 +180,7 @@ struct _GtkFileChooserDefault
|
||||
GtkWidget *browse_files_popup_menu_add_shortcut_item;
|
||||
GtkWidget *browse_files_popup_menu_hidden_files_item;
|
||||
GtkWidget *browse_files_popup_menu_size_column_item;
|
||||
GtkWidget *browse_files_popup_menu_copy_file_location_item;
|
||||
GtkWidget *browse_new_folder_button;
|
||||
GtkWidget *browse_path_bar_hbox;
|
||||
GtkSizeGroup *browse_path_bar_size_group;
|
||||
|
||||
Reference in New Issue
Block a user