sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 5222f0defb5bcf3752ac3a59ad1ea60ecfa0e82e
parent 7e2bb889e617302c82e28d04cb2e0db5d35fbb08
Author: Hamish Downer <dmishd@gmail.com>
Date:   Fri, 11 Feb 2011 00:24:08 +0000

started work on edit-message-async-mode

Diffstat:
A lib/sup/modes/edit-message-async-mode.rb | 41 +++++++++++++++++++++++++++++++++++++++++
M lib/sup/modes/edit-message-mode.rb | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+), 0 deletions(-)
diff --git a/lib/sup/modes/edit-message-async-mode.rb b/lib/sup/modes/edit-message-async-mode.rb
@@ -0,0 +1,41 @@
+# edit-message-async-mode
+#
+
+class EditMessageAsyncMode < Mode
+  # TODO:
+  #
+  # * set up keymap - just X to say you're done
+
+  # * generate buffer text
+  # * override mode bits - killable etc.
+
+  # * initialize function - need
+  # ** file path
+  # ** info to restart edit mode it started in
+  def initialize
+  end
+
+  def edit_finished
+    #
+    # We need a edit_message_async_resume method, but maybe that 
+    # should be in another mode?? The below code should run in it
+ 
+    # first make sure any external editor has exited
+    File.open(@file.path, 'r') { |f|
+      while !f.flock(File::LOCK_EX|File::LOCK_NB)
+        # ask user to check that any editor of that file has exited
+        # press enter when ready to continue
+      end
+    }
+    @edited = true if File.mtime(@file.path) > @mtime
+
+    return @edited unless @edited
+
+    header, @body = parse_file @file.path
+    @header = header - NON_EDITABLE_HEADERS
+    handle_new_text @header, @body
+    update
+
+    @edited
+  end
+end
diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb
@@ -80,6 +80,7 @@ EOS
     k.add :edit_cc, "Edit Cc:", 'c'
     k.add :edit_subject, "Edit Subject", 's'
     k.add :edit_message, "Edit message", :enter
+    k.add :edit_message_async, "Edit message asynchronously", 'X'
     k.add :save_as_draft, "Save as draft", 'P'
     k.add :attach_file, "Attach a file", 'a'
     k.add :delete_attachment, "Delete an attachment", 'd'
@@ -184,6 +185,46 @@ EOS
     @edited
   end
 
+  def edit_message_async
+    @file = Tempfile.new "sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}"
+    @file.puts format_headers(@header - NON_EDITABLE_HEADERS).first
+    @file.puts
+    @file.puts @body.join("\n")
+    @file.close
+
+    @mtime = File.mtime @file.path
+    
+    # put up buffer saying you can now edit the message in another
+    # terminal or app, and continue to use sup in the meantime.
+    # When you are done, navigate back to this buffer and press
+    # X to resume
+    mode = EditMessageAsync.new m, type_arg
+    BufferManager.spawn "Waiting for message \"#{m.subj}\" to be finished", mode
+
+    # now do we kill our own mode? how?
+
+    # We need a edit_message_async_resume method, but maybe that 
+    # should be in another mode?? The below code should run in it
+ 
+    # first make sure any external editor has exited
+    File.open(@file.path, 'r') { |f|
+      while !f.flock(File::LOCK_EX|File::LOCK_NB)
+        # ask user to check that any editor of that file has exited
+        # press enter when ready to continue
+      end
+    }
+    @edited = true if File.mtime(@file.path) > @mtime
+
+    return @edited unless @edited
+
+    header, @body = parse_file @file.path
+    @header = header - NON_EDITABLE_HEADERS
+    handle_new_text @header, @body
+    update
+
+    @edited
+  end
+
   def killable?
     !edited? || BufferManager.ask_yes_or_no("Discard message?")
   end