]> git.cworth.org Git - sup/commitdiff
added dispatch-and-kill to thread-view-mode
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Sun, 30 Dec 2007 19:05:25 +0000 (11:05 -0800)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Sun, 30 Dec 2007 19:05:25 +0000 (11:05 -0800)
lib/sup/modes/thread-index-mode.rb
lib/sup/modes/thread-view-mode.rb

index 0abeb621b11180c6a03d920741eb4bc03699afb2..af1761f5fe4e715ea10cae31a712222f33633e0e 100644 (file)
@@ -88,7 +88,7 @@ EOS
           m.load_from_source! 
         end
       end
-      mode = ThreadViewMode.new t, @hidden_labels
+      mode = ThreadViewMode.new t, @hidden_labels, self
       BufferManager.spawn t.subj, mode
       BufferManager.draw_screen
       mode.jump_to_first_open
index d7a6a829b07cce69f3dcfcc1d59bab9965483eb2..238f59acaa0c4a925e5a358e139b69ef98daec92 100644 (file)
@@ -48,6 +48,7 @@ EOS
     k.add :unsubscribe_from_list, "Subscribe to/unsubscribe from mailing list", ")"
     k.add :pipe_message, "Pipe message or attachment to a shell command", '|'
 
+    ## dispatch-and-kill commands
     k.add_multi "(A)rchive/(d)elete/mark as (s)pam/do (n)othing:", ',' do |kk|
       kk.add :archive_and_kill, "Archive this thread and view next", 'a'
       kk.add :delete_and_kill, "Delete this thread and view next", 'd'
@@ -63,11 +64,15 @@ EOS
   ## Message objects.  @chunk_lines is a map from row #s to Chunk
   ## objects. @person_lines is a map from row #s to Person objects.
 
-  def initialize thread, hidden_labels=[]
+  def initialize thread, hidden_labels=[], index_mode=nil
     super()
     @thread = thread
     @hidden_labels = hidden_labels
 
+    ## used for dispatch-and-kill
+    @index_mode = index_mode
+    @dying = false
+
     @layout = SavingHash.new { MessageLayout.new }
     @chunk_layout = SavingHash.new { ChunkLayout.new }
     earliest, latest = nil, nil
@@ -340,29 +345,45 @@ EOS
   end
 
   def archive_and_kill
-    @thread.remove_label :inbox
-    @thread.save Index
-    UpdateManager.relay self, :archived, @thread.first
-    BufferManager.kill_buffer_safely buffer
+    dispatch_and_kill do
+      @thread.remove_label :inbox
+      UpdateManager.relay self, :archived, @thread.first
+    end
   end
 
   def spam_and_kill
-    @thread.apply_label :spam
-    @thread.save Index
-    UpdateManager.relay self, :spammed, @thread.first
-    BufferManager.kill_buffer_safely buffer
+    dispatch_and_kill do
+      @thread.apply_label :spam
+      UpdateManager.relay self, :spammed, @thread.first
+    end
+  end
+
+  def delete_and_kill
+    dispatch_and_kill do
+      @thread.apply_label :deleted
+      UpdateManager.relay self, :deleted, @thread.first
+    end
   end
 
   def skip_and_kill
-    BufferManager.kill_buffer_safely buffer
+    dispatch_and_kill { }
   end
 
-  def delete_and_kill
-    @thread.apply_label :deleted
-    @thread.save Index
-    UpdateManager.relay self, :deleted, @thread.first
-    BufferManager.kill_buffer_safely buffer
+  def dispatch_and_kill
+    return if @dying
+    @dying = true
+
+    if @index_mode
+      @index_mode.launch_next_thread_after(@thread) do
+        @thread.save Index if yield
+        BufferManager.kill_buffer_safely buffer
+      end
+    else
+      @thread.save Index if yield
+      BufferManager.kill_buffer_safely buffer
+    end
   end
+  private :dispatch_and_kill
 
   def pipe_message
     chunk = @chunk_lines[curpos]