[balsa/66-save-and-open-folder] add option to open folder when saving multiple attachments



commit 0e5ea496a7f0339b419b9dcca89733311881408d
Author: Albrecht Dreß <albrecht dress netcologne de>
Date:   Sat Jan 22 13:55:52 2022 +0100

    add option to open folder when saving multiple attachments
    
    Add the option to open the destination folder after saving to the “Save
    selected to folder” context menu item.  Some refactoring to eliminate
    duplicated code.
    
    Details:
    - src/balsa-mime-widget-callbacks.[ch]: add helper function for opening
    the destination folder, use it in balsa_mime_widget_ctx_menu_save()
    - src/balsa-message.c: add helper function for creating the “…and view”
    context menu item, use it in tree_mult_selection_popup() and
    part_create_menu(), use new open folder helper in
    part_context_dump_all_cb()
    
    Signed-off-by: Albrecht Dreß <albrecht dress netcologne de>

 src/balsa-message.c               | 36 ++++++++++++++++++++++++------------
 src/balsa-mime-widget-callbacks.c | 35 +++++++++++++++++++++--------------
 src/balsa-mime-widget-callbacks.h |  1 +
 3 files changed, 46 insertions(+), 26 deletions(-)
---
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 2bb63373e..6939a3aaa 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -907,6 +907,22 @@ collect_selected_info(GtkTreeModel * model, GtkTreePath * path,
     }
 }
 
+static void
+add_save_view_menu_item(GtkWidget *menu, const gchar *label, GCallback callback, gpointer user_data)
+{
+       GAppInfo *app_info;
+
+       app_info = g_app_info_get_default_for_type("inode/directory", FALSE);
+       if (app_info != NULL) {
+               GtkWidget *menu_item;
+
+               menu_item = gtk_menu_item_new_with_label(label);
+               g_object_set_data_full(G_OBJECT(menu_item), BALSA_MIME_WIDGET_CB_APPINFO, app_info, 
g_object_unref);
+               g_signal_connect(menu_item, "activate", callback, user_data);
+               gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+       }
+}
+
 static void
 tree_mult_selection_popup(BalsaMessage     *balsa_message,
                           const GdkEvent   *event,
@@ -951,18 +967,19 @@ tree_mult_selection_popup(BalsaMessage     *balsa_message,
         g_object_ref_sink(balsa_message->save_all_popup);
         menu_item =
             gtk_menu_item_new_with_label (_("Save selected as…"));
-        gtk_widget_show(menu_item);
         g_signal_connect (menu_item, "activate",
                           G_CALLBACK (part_context_save_all_cb),
                           (gpointer) balsa_message->save_all_list);
         gtk_menu_shell_append (GTK_MENU_SHELL (balsa_message->save_all_popup), menu_item);
         menu_item =
             gtk_menu_item_new_with_label (_("Save selected to folder…"));
-        gtk_widget_show(menu_item);
         g_signal_connect (menu_item, "activate",
                           G_CALLBACK (part_context_dump_all_cb),
                           (gpointer) balsa_message->save_all_list);
         gtk_menu_shell_append (GTK_MENU_SHELL (balsa_message->save_all_popup), menu_item);
+        add_save_view_menu_item(balsa_message->save_all_popup, _("Save selected to folder and view…"),
+               G_CALLBACK(part_context_dump_all_cb), balsa_message->save_all_list);
+        gtk_widget_show_all(balsa_message->save_all_popup);
         if (event != NULL) {
             gtk_menu_popup_at_pointer(GTK_MENU(balsa_message->save_all_popup), event);
         } else {
@@ -1665,16 +1682,8 @@ part_create_menu (BalsaPartInfo* info)
                                   info->body);
         gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
     } else {
-       GAppInfo *app_info;
-
-       app_info = g_app_info_get_default_for_type("inode/directory", FALSE);
-       if (app_info != NULL) {
-               menu_item = gtk_menu_item_new_with_mnemonic (_("Save and _view…"));
-               g_object_set_data_full(G_OBJECT(menu_item), BALSA_MIME_WIDGET_CB_APPINFO, app_info, 
g_object_unref);
-               g_signal_connect(menu_item, "activate",
-                                                G_CALLBACK (balsa_mime_widget_ctx_menu_save), info->body);
-               gtk_menu_shell_append (GTK_MENU_SHELL (info->popup_menu), menu_item);
-       }
+       add_save_view_menu_item(info->popup_menu, _("Save and view…"),
+               G_CALLBACK(balsa_mime_widget_ctx_menu_save), info->body);
     }
 
     gtk_widget_show_all (info->popup_menu);
@@ -1837,6 +1846,9 @@ part_context_dump_all_cb(GtkWidget * menu_item, GList * info_list)
            g_object_unref(save_uri);
            info_list = g_list_next(info_list);
        }
+       if (dir_uri != NULL) {
+               balsa_mime_widget_view_save_dir(menu_item);
+       }
        g_object_unref(dir_uri);
     }
     gtk_widget_destroy(dump_dialog);
diff --git a/src/balsa-mime-widget-callbacks.c b/src/balsa-mime-widget-callbacks.c
index aebd4b1a1..a18b35bd5 100644
--- a/src/balsa-mime-widget-callbacks.c
+++ b/src/balsa-mime-widget-callbacks.c
@@ -168,20 +168,7 @@ balsa_mime_widget_ctx_menu_save(GtkWidget * parent_widget,
                              file_uri, err ? err->message : _("Unknown error"));
             g_clear_error(&err);
         } else {
-               GAppInfo *app_info;
-
-               app_info = (GAppInfo *) g_object_get_data(G_OBJECT(parent_widget), 
BALSA_MIME_WIDGET_CB_APPINFO);
-               if (app_info != NULL) {
-                       GList *list;
-
-                       list = g_list_prepend(NULL, balsa_app.save_dir);
-                       if (!g_app_info_launch_uris(app_info, list, NULL, &err)) {
-                               balsa_information(LIBBALSA_INFORMATION_ERROR, _("Could not view %s: %s"),
-                                       file_uri, err ? err->message : _("Unknown error"));
-                               g_clear_error(&err);
-                       }
-                       g_list_free(list);
-               }
+               balsa_mime_widget_view_save_dir(parent_widget);
         }
     }
 
@@ -189,6 +176,26 @@ balsa_mime_widget_ctx_menu_save(GtkWidget * parent_widget,
     g_free(file_uri);
 }
 
+void
+balsa_mime_widget_view_save_dir(GtkWidget *widget)
+{
+       GAppInfo *app_info;
+
+       app_info = (GAppInfo *) g_object_get_data(G_OBJECT(widget), BALSA_MIME_WIDGET_CB_APPINFO);
+       if (app_info != NULL) {
+               GList *list;
+               GError *error = NULL;
+
+               list = g_list_prepend(NULL, balsa_app.save_dir);
+               if (!g_app_info_launch_uris(app_info, list, NULL, &error)) {
+                       balsa_information(LIBBALSA_INFORMATION_ERROR, _("Could not view %s: %s"),
+                               balsa_app.save_dir, error ? error->message : _("Unknown error"));
+                       g_clear_error(&error);
+               }
+               g_list_free(list);
+       }
+}
+
 static void
 scroll_change(GtkAdjustment * adj, gint diff, BalsaMessage * bm)
 {
diff --git a/src/balsa-mime-widget-callbacks.h b/src/balsa-mime-widget-callbacks.h
index c8c061c8d..0eabd5868 100644
--- a/src/balsa-mime-widget-callbacks.h
+++ b/src/balsa-mime-widget-callbacks.h
@@ -42,6 +42,7 @@ void balsa_mime_widget_limit_focus(GtkEventControllerKey *key_controller,
                                    gpointer               user_data);
 void balsa_mime_widget_unlimit_focus(GtkEventControllerKey *key_controller,
                                      gpointer               user_data);
+void balsa_mime_widget_view_save_dir(GtkWidget *widget);
 
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]