sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 15a2c54fc7e7c46ecef2103f303a02f7df6be13a
parent c4d08f0a6cdbb30c1e375a0d3aa69771dd2809ab
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date:   Sun, 10 Dec 2006 19:11:40 +0000

improved handling of killing buffers. buffers now check with the mode
(via #killable?) before killing. inbox-mode always returns false.

also improved ask_yes_or_no. three outputs: yes, no, and nil (cancel).


git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@68 5c8cc53c-5e98-4d25-b20a-d8db53a31250

Diffstat:
M bin/sup | 10 ++++++----
M lib/sup/buffer.rb | 10 +++++++++-
M lib/sup/mode.rb | 1 +
M lib/sup/modes/edit-message-mode.rb | 3 ++-
M lib/sup/modes/inbox-mode.rb | 2 ++
M lib/sup/modes/resume-mode.rb | 33 +++++++++++++++++++++------------
6 files changed, 41 insertions(+), 18 deletions(-)
diff --git a/bin/sup b/bin/sup
@@ -132,7 +132,7 @@ begin
         when :roll_buffers_backwards
           bm.roll_buffers_backwards
         when :kill_buffer
-          bm.kill_buffer bm.focus_buf unless bm.focus_buf.mode.is_a? InboxMode
+          bm.kill_buffer bm.focus_buf if bm.focus_buf.mode.killable?
         when :list_buffers
           bm.spawn_unless_exists("Buffer List") { BufferListMode.new }
         when :list_contacts
@@ -187,10 +187,12 @@ if $exception
   case $exception
   when IndexError
     $stderr.puts <<EOS
-An error occurred while parsing a message from source "#{$exception.source}".
+An error occurred while parsing a message from source:
+   #{$exception.source}.
 Typically, this means that the source has been modified in some
-way which has rendered the messages invalid. For example, if it's an mbox
-file, you may have read or deleted messages using another client.
+way which has rendered the messages invalid. For example, if it's
+an mbox file, you may have read or deleted messages using another
+mail client.
 
 You must rebuild the index for this source. Please run:
   sup-import --rebuild #{$exception.source}
diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
@@ -337,7 +337,15 @@ class BufferManager
   end
 
   def ask_yes_or_no question
-    [?y, ?Y].member? ask_getch(question, "ynYN")
+    r = ask_getch(question, "ynYN")
+    case r
+    when ?y, ?Y
+      true
+    when nil
+      nil
+    else
+      false
+    end
   end
 
   def draw_minibuf
diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb
@@ -23,6 +23,7 @@ class Mode
     end
   end
 
+  def killable?; true; end
   def draw; end
   def focus; end
   def blur; end
diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb
@@ -101,7 +101,7 @@ protected
   end
 
   def send_message
-    return false unless @edited || BufferManager.ask_yes_or_no("message unedited---really send?")
+    return false unless @edited || BufferManager.ask_yes_or_no("Message unedited. Really send?")
 
     raise "no message id!" unless header["Message-Id"]
     date = Time.now
@@ -127,6 +127,7 @@ protected
     DraftManager.write_draft { |f| write_message f, false }
     BufferManager.kill_buffer buffer
     BufferManager.flash "Saved for later editing."
+    true
   end
 
   def sig_lines
diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
@@ -14,6 +14,8 @@ class InboxMode < ThreadIndexMode
     super [:inbox], [:inbox]
   end
 
+  def killable?; false; end
+
   def archive
     remove_label_and_hide_thread cursor_thread, :inbox
     regen_text
diff --git a/lib/sup/modes/resume-mode.rb b/lib/sup/modes/resume-mode.rb
@@ -8,26 +8,35 @@ class ResumeMode < ComposeMode
     @header.delete "Date"
     @header["Message-Id"] = gen_message_id # generate a new'n
     regen_text
-    @sent = false
+    @safe = false
+  end
+
+  def killable?
+    unless @safe
+      case BufferManager.ask_yes_or_no "Discard draft?"
+      when true
+        DraftManager.discard @id
+        BufferManager.flash "Draft discarded."
+        true
+      when false
+        BufferManager.flash "Draft saved."
+        true
+      else
+        false
+      end
+    end
   end
 
   def send_message
     if super
       DraftManager.discard @id 
-      @sent = true
+      @safe = true
     end
   end
 
-  def cleanup
-    unless @sent
-      if BufferManager.ask_yes_or_no "discard draft?"
-        DraftManager.discard @id
-        BufferManager.flash "Draft discarded."
-      else
-        BufferManager.flash "Draft saved."
-      end
-      super
-    end
+  def save_as_draft
+    @safe = true
+    DraftManager.discard @id if super
   end
 end