diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2013-09-29 17:38:39 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2013-09-29 17:40:48 +0300 |
commit | 54090ec7c836ea6e0d3484ac4afd2850e70a4f2c (patch) | |
tree | 6bacf0c3b0096e2670782370ada722ffe65d4f65 | |
parent | bd401b85c8c103ddf78b5f30442297e1dd46bff3 (diff) | |
download | xfdesktop-54090ec7c836ea6e0d3484ac4afd2850e70a4f2c.tar.gz |
Allow renaming of multiple icons
Use Thunar's bulk renamer when multiple icons are selected. Pops
up a message dialog if none of the selected icons support being
renamed.
-rw-r--r-- | src/xfdesktop-file-icon-manager.c | 78 | ||||
-rw-r--r-- | src/xfdesktop-file-utils.c | 68 | ||||
-rw-r--r-- | src/xfdesktop-file-utils.h | 5 |
3 files changed, 134 insertions, 17 deletions
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c index f4ae3e68..db24d6db 100644 --- a/src/xfdesktop-file-icon-manager.c +++ b/src/xfdesktop-file-icon-manager.c @@ -584,20 +584,44 @@ xfdesktop_file_icon_menu_rename(GtkWidget *widget, { XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data); XfdesktopFileIcon *icon; - GList *selected; - GFile *file; + GList *selected, *iter, *files = NULL; GtkWidget *toplevel; selected = xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view); - g_return_if_fail(g_list_length(selected) == 1); - icon = XFDESKTOP_FILE_ICON(selected->data); - g_list_free(selected); - - file = xfdesktop_file_icon_peek_file(icon); + + for(iter = selected; iter != NULL; iter = iter->next) { + icon = XFDESKTOP_FILE_ICON(iter->data); + + /* create a list of GFiles from selected icons that can be renamed */ + if(xfdesktop_file_icon_can_rename_file(icon)) + files = g_list_append(files, xfdesktop_file_icon_peek_file(icon)); + } + toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view)); - xfdesktop_file_utils_rename_file(file, fmanager->priv->gscreen, - GTK_WINDOW(toplevel)); + if(g_list_length(files) == 1) { + /* rename dialog for a single icon */ + xfdesktop_file_utils_rename_file(g_list_first(files)->data, + fmanager->priv->gscreen, + GTK_WINDOW(toplevel)); + } else if(g_list_length(files) > 1) { + /* Bulk rename for multiple icons selected */ + GFile *desktop = xfdesktop_file_icon_peek_file(fmanager->priv->desktop_icon); + + xfdesktop_file_utils_bulk_rename(desktop, files, + fmanager->priv->gscreen, + GTK_WINDOW(toplevel)); + } else { + /* Nothing valid to rename */ + xfce_message_dialog(GTK_WINDOW(toplevel), + _("Rename Error"), GTK_STOCK_DIALOG_ERROR, + _("The files could not be renamed"), + _("None of the icons selected support being renamed."), + GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL); + } + + g_list_free(files); + g_list_free(selected); } enum @@ -1561,6 +1585,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, #endif if(file_icon == fmanager->priv->desktop_icon) { + /* Menu on the root desktop window */ + /* Paste */ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); @@ -1571,13 +1597,16 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, } else gtk_widget_set_sensitive(mi, FALSE); } else { + /* Menu popup on an icon */ + /* Copy */ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(xfdesktop_file_icon_menu_copy), fmanager); - + + /* Cut */ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, NULL); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); @@ -1587,7 +1616,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, fmanager); } else gtk_widget_set_sensitive(mi, FALSE); - + + /* Delete */ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); @@ -1597,27 +1627,39 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, fmanager); } else gtk_widget_set_sensitive(mi, FALSE); - + + /* Separator */ mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); - + + /* Rename */ mi = gtk_image_menu_item_new_with_mnemonic(_("_Rename...")); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); if(!multi_sel && xfdesktop_file_icon_can_rename_file(file_icon)) { + /* Rename a single icon */ g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(xfdesktop_file_icon_menu_rename), fmanager); - } else - gtk_widget_set_sensitive(mi, FALSE); + } else { + /* Bulk rename for multiple icons, the callback will + * handle the situation where some icons selected can't + * be renamed */ + g_signal_connect(G_OBJECT(mi), "activate", + G_CALLBACK(xfdesktop_file_icon_menu_rename), + fmanager); + } } - + + /* Separator */ mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); if(file_icon == fmanager->priv->desktop_icon) { + /* Menu on the root desktop window */ + /* show arrange desktop icons option */ img = gtk_image_new_from_stock(GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU); gtk_widget_show(img); mi = gtk_image_menu_item_new_with_mnemonic(_("Arrange Desktop _Icons")); @@ -1628,6 +1670,7 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, G_CALLBACK(xfdesktop_file_icon_menu_arrange_icons), fmanager); + /* Desktop settings window */ img = gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU); gtk_widget_show(img); mi = gtk_image_menu_item_new_with_mnemonic(_("Desktop _Settings...")); @@ -1637,7 +1680,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop, g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(xfdesktop_settings_launch), fmanager); } - + + /* Properties - applies to desktop window or an icon on the desktop */ img = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); gtk_widget_show(img); mi = gtk_image_menu_item_new_with_mnemonic(_("P_roperties...")); diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c index e32ea1f4..44feba14 100644 --- a/src/xfdesktop-file-utils.c +++ b/src/xfdesktop-file-utils.c @@ -62,6 +62,7 @@ #include "xfdesktop-file-manager-proxy.h" #include "xfdesktop-file-utils.h" #include "xfdesktop-trash-proxy.h" +#include "xfdesktop-thunar-proxy.h" static void xfdesktop_file_utils_add_emblems(GdkPixbuf *pix, GList *emblems); @@ -852,6 +853,59 @@ xfdesktop_file_utils_rename_file(GFile *file, } void +xfdesktop_file_utils_bulk_rename(GFile *working_directory, + GList *files, + GdkScreen *screen, + GtkWindow *parent) +{ + DBusGProxy *thunar_proxy; + + g_return_if_fail(G_IS_FILE(working_directory)); + g_return_if_fail(GDK_IS_SCREEN(screen) || GTK_IS_WINDOW(parent)); + + if(!screen) + screen = gtk_widget_get_screen(GTK_WIDGET(parent)); + + thunar_proxy = xfdesktop_file_utils_peek_thunar_proxy(); + if(thunar_proxy) { + gchar *directory = g_file_get_path(working_directory); + guint nfiles = g_list_length(files); + gchar **filenames = g_new0(gchar *, nfiles+1); + gchar *display_name = gdk_screen_make_display_name(screen); + gchar *startup_id = g_strdup_printf("_TIME%d", gtk_get_current_event_time()); + GList *lp; + gint n; + + /* convert GFile list into an array of filenames */ + for(n = 0, lp = files; lp != NULL; ++n, lp = lp->next) + filenames[n] = g_file_get_basename(lp->data); + filenames[n] = NULL; + + xfdesktop_file_utils_set_window_cursor(parent, GDK_WATCH); + + xfdesktop_thunar_proxy_bulk_rename_async(thunar_proxy, + directory, (const gchar **)filenames, + FALSE, display_name, startup_id, + (xfdesktop_thunar_proxy_bulk_rename_reply)xfdesktop_file_utils_async_cb, + parent); + + xfdesktop_file_utils_set_window_cursor(parent, GDK_LEFT_PTR); + + g_free(directory); + g_free(startup_id); + g_strfreev(filenames); + g_free(display_name); + } else { + xfce_message_dialog(parent, + _("Rename Error"), GTK_STOCK_DIALOG_ERROR, + _("The files could not be renamed"), + _("This feature requires a file manager service to " + "be present (such as the one supplied by Thunar)."), + GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL); + } +} + +void xfdesktop_file_utils_unlink_files(GList *files, GdkScreen *screen, GtkWindow *parent) @@ -1449,6 +1503,7 @@ static gint dbus_ref_cnt = 0; static DBusGConnection *dbus_gconn = NULL; static DBusGProxy *dbus_trash_proxy = NULL; static DBusGProxy *dbus_filemanager_proxy = NULL; +static DBusGProxy *dbus_thunar_proxy = NULL; gboolean xfdesktop_file_utils_dbus_init(void) @@ -1479,6 +1534,11 @@ xfdesktop_file_utils_dbus_init(void) "org.xfce.FileManager", "/org/xfce/FileManager", "org.xfce.FileManager"); + + dbus_thunar_proxy = dbus_g_proxy_new_for_name(dbus_gconn, + "org.xfce.FileManager", + "/org/xfce/FileManager", + "org.xfce.Thunar"); } else { ret = FALSE; dbus_ref_cnt = 0; @@ -1499,6 +1559,12 @@ xfdesktop_file_utils_peek_filemanager_proxy(void) return dbus_filemanager_proxy; } +DBusGProxy * +xfdesktop_file_utils_peek_thunar_proxy(void) +{ + return dbus_thunar_proxy; +} + void xfdesktop_file_utils_dbus_cleanup(void) { @@ -1509,6 +1575,8 @@ xfdesktop_file_utils_dbus_cleanup(void) g_object_unref(G_OBJECT(dbus_trash_proxy)); if(dbus_filemanager_proxy) g_object_unref(G_OBJECT(dbus_filemanager_proxy)); + if(dbus_thunar_proxy) + g_object_unref(G_OBJECT(dbus_thunar_proxy)); /* we aren't going to unref dbus_gconn because dbus appears to have a * memleak in dbus_connection_setup_with_g_main(). really; the comments diff --git a/src/xfdesktop-file-utils.h b/src/xfdesktop-file-utils.h index a875d9fe..65bb9bcc 100644 --- a/src/xfdesktop-file-utils.h +++ b/src/xfdesktop-file-utils.h @@ -70,6 +70,10 @@ void xfdesktop_file_utils_open_folder(GFile *file, void xfdesktop_file_utils_rename_file(GFile *file, GdkScreen *screen, GtkWindow *parent); +void xfdesktop_file_utils_bulk_rename(GFile *working_directory, + GList *files, + GdkScreen *screen, + GtkWindow *parent); void xfdesktop_file_utils_trash_files(GList *files, GdkScreen *screen, GtkWindow *parent); @@ -114,6 +118,7 @@ gboolean xfdesktop_file_utils_transfer_files(GdkDragAction action, gboolean xfdesktop_file_utils_dbus_init(void); DBusGProxy *xfdesktop_file_utils_peek_trash_proxy(void); DBusGProxy *xfdesktop_file_utils_peek_filemanager_proxy(void); +DBusGProxy *xfdesktop_file_utils_peek_thunar_proxy(void); void xfdesktop_file_utils_dbus_cleanup(void); |