sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit fc3dece48d765866c67aa3fd010eeee278c44641
parent bfe40c05dc6dc2656a4dde11948ff617f2fa00d6
Author: Michael Stapelberg <michael@stapelberg.de>
Date:   Wed, 30 Sep 2009 21:59:30 +0200

implement saving all attachments to a folder (keybinding A)

Diffstat:
M lib/sup/buffer.rb | 4 ++--
M lib/sup/modes/thread-view-mode.rb | 14 ++++++++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
@@ -470,7 +470,7 @@ EOS
     end
   end
 
-  def ask_for_filename domain, question, default=nil
+  def ask_for_filename domain, question, default=nil, allow_directory=false
     answer = ask domain, question, default do |s|
       if s =~ /(~([^\s\/]*))/ # twiddle directory expansion
         full = $1
@@ -495,7 +495,7 @@ EOS
       answer =
         if answer.empty?
           spawn_modal "file browser", FileBrowserMode.new
-        elsif File.directory?(answer)
+        elsif File.directory?(answer) && !allow_directory
           spawn_modal "file browser", FileBrowserMode.new(answer)
         else
           File.expand_path answer
diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
@@ -58,6 +58,7 @@ EOS
     k.add :alias, "Edit alias/nickname for a person", 'i'
     k.add :edit_as_new, "Edit message as new", 'D'
     k.add :save_to_disk, "Save message/attachment to disk", 's'
+    k.add :save_all_to_disk, "Save all attachments to disk", 'A'
     k.add :search, "Search for messages from particular people", 'S'
     k.add :compose, "Compose message to person", 'm'
     k.add :subscribe_to_list, "Subscribe to/unsubscribe from mailing list", "("
@@ -339,6 +340,19 @@ EOS
     end
   end
 
+  def save_all_to_disk
+    m = @message_lines[curpos] or return
+    default_dir = ($config[:default_attachment_save_dir] || ".")
+    folder = BufferManager.ask_for_filename :filename, "Save all attachment to folder: ", default_dir, true
+    return unless folder
+
+    m.chunks.each do |chunk|
+      next unless chunk.is_a?(Chunk::Attachment)
+      fn = File.join(folder, chunk.filename)
+      save_to_file(fn) { |f| f.print chunk.raw_content }
+    end
+  end
+
   def edit_draft
     m = @message_lines[curpos] or return
     if m.is_draft?