]> git.cworth.org Git - sup/commitdiff
'A' archives and kills buffer in thread-view-mode (required significant updatedes...
authorwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Sun, 11 Feb 2007 21:07:25 +0000 (21:07 +0000)
committerwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Sun, 11 Feb 2007 21:07:25 +0000 (21:07 +0000)
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@321 5c8cc53c-5e98-4d25-b20a-d8db53a31250

bin/sup
doc/TODO
lib/sup/draft.rb
lib/sup/modes/inbox-mode.rb
lib/sup/modes/thread-index-mode.rb
lib/sup/modes/thread-view-mode.rb
lib/sup/poll.rb
lib/sup/sent.rb
lib/sup/thread.rb
lib/sup/update.rb

diff --git a/bin/sup b/bin/sup
index 3d38aa0fd51adfb9a6ad3bd12322b575f5a7d931..fac2f3bb65b860e95a00f6d5784129c15888ac6d 100644 (file)
--- a/bin/sup
+++ b/bin/sup
@@ -12,9 +12,9 @@ global_keymap = Keymap.new do |k|
   k.add :quit, "Quit Redwood", 'q'
   k.add :help, "Show help", 'H', '?'
   k.add :roll_buffers, "Switch to next buffer", 'b'
-  k.add :roll_buffers_backwards, "Switch to previous buffer", 'B'
+#  k.add :roll_buffers_backwards, "Switch to previous buffer", 'B'
   k.add :kill_buffer, "Kill the current buffer", 'x'
-  k.add :list_buffers, "List all buffers", 'A'
+  k.add :list_buffers, "List all buffers", 'B'
   k.add :list_contacts, "List contacts", 'C'
   k.add :redraw, "Redraw screen", :ctrl_l
   k.add :search, "Search messages", '/'
index 1ca11fb2c0544988ea6e05e8d2eb65c5b91ac8d6..d840734b6564b9aee0f8e2a58855e9dcb0faf5f5 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,21 +1,27 @@
-for next release
+for 0.0.7
 ----------------
-make 'a' archive in thread-view-mode
+de-archived messages should be auto-added to inbox
+
+for 0.0.8
+---------
 message attachments
 warnings: top-posting, attachments
 maildir
+
+for 0.0.9
+---------
 undo
+use Net::SMTP
+gmail
 
 future
 ------
-maybe: de-archived messages should be auto-added to inbox
 swappable keymappings
 bugfix: when returning from a shelling out, ncurses is crazy 
 bugfix: miscellaneous weirdnesses in buffer line editing
 wide character support
 batch deletion
 support for message-content modules such as ruby-talk:XXXXX detection
-use Net::SMTP
 forward attachments
 CREATE attachments
 tab completion on labels, contacts
@@ -25,13 +31,13 @@ maybe: filters
 maybe: rangefilter on the initial inbox to only consider the most recent 1000 messages
 select all, starred, to me, etc
 annotations on messages
-gmail
 pop
 be able to mark individual messages as spam in thread-view-mode
 toggle wrapping
 
 done
 ----
+x make 'A' archive in thread-view-mode
 x remove stupid percent_done source methods (still useful; made it optional)
 x don't quit while writing thread index state to disk or with unsaved drafts/messages
 x bugfix: deleted threads are showing up (i don't see this any more)
index 5974b5752180f5557c37dd5e2a89ce9a9df54639..e234c104a5ca31a74cba0bfd4797168d46b123a2 100644 (file)
@@ -23,7 +23,7 @@ class DraftManager
     @source.each do |thisoffset, theselabels|
       m = Message.new :source => @source, :source_info => thisoffset, :labels => theselabels
       Index.add_message m
-      UpdateManager.relay :add, m
+      UpdateManager.relay self, :add, m
       my_message = m if thisoffset == offset
     end
 
@@ -36,7 +36,7 @@ class DraftManager
     raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{mid.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id
     Index.drop_entry docid
     File.delete @source.fn_for_offset(entry[:source_info])
-    UpdateManager.relay :delete, mid
+    UpdateManager.relay self, :delete, mid
   end
 end
 
index 3dfccbd95476cdd0ae64978b9fd15a40a29b5cde..b33a4843b8f19849d10b6989904a886939d0c72b 100644 (file)
@@ -15,7 +15,8 @@ class InboxMode < ThreadIndexMode
   def killable?; false; end
 
   def archive
-    remove_label_and_hide_thread cursor_thread, :inbox
+    cursor_thread.remove_label :inbox
+    hide_thread cursor_thread
     regen_text
   end
 
@@ -24,6 +25,14 @@ class InboxMode < ThreadIndexMode
     regen_text
   end
 
+  def handle_archived_update sender, t
+    hide_thread t if contains_thread? t
+  end
+
+  def handle_unarchived_update sender, t
+    ## XXX todo: fill me in
+  end
+
   def status
     super + "    #{Index.size} messages in index"
   end
index 9cceaa634f587e209a026d6a6ca62bab07c899fd..de799000b9d1975d500166e3e8e799cb6db49534 100644 (file)
@@ -46,6 +46,7 @@ class ThreadIndexMode < LineCursorMode
 
   def lines; @text.length; end
   def [] i; @text[i]; end
+  def contains_thread? t; !@lines[t].nil?; end
 
   def reload
     drop_all_threads
@@ -58,7 +59,7 @@ class ThreadIndexMode < LineCursorMode
     t ||= @threads[curpos]
 
     ## this isn't working entirely. TODO:figure out why
-    t = t.clone # required so that messages added later on don't completely
+    t = t.clone # required so that messages added later on don't completely
                 # screw everything up
 
     ## TODO: don't regen text completely
@@ -80,22 +81,24 @@ class ThreadIndexMode < LineCursorMode
     threads.each { |t| select t }
   end
   
-  def handle_starred_update m
+  def handle_starred_update sender, m
     return unless(t = @ts.thread_for m)
     update_text_for_line @lines[t]
     BufferManager.draw_screen
   end
 
-  def handle_read_update m
-    return unless(t = @ts.thread_for m)
+  def handle_read_update sender, t
+    return unless @lines[t]
     update_text_for_line @lines[t]
     BufferManager.draw_screen
   end
 
+  def handle_archived_update *a; handle_read_update *a; end
+
   ## overwrite me!
   def is_relevant? m; false; end
 
-  def handle_add_update m
+  def handle_add_update sender, m
     if is_relevant?(m) || @ts.is_relevant?(m)
       @ts.load_thread_for_message m
       update
@@ -103,7 +106,7 @@ class ThreadIndexMode < LineCursorMode
     end
   end
 
-  def handle_delete_update mid
+  def handle_delete_update sender, mid
     if @ts.contains_id? mid
       @ts.remove mid
       update
@@ -129,8 +132,7 @@ class ThreadIndexMode < LineCursorMode
     end
   end
 
-  ## i always hate people who name things like this...
-  def actually_toggle_starred t=@threads[curpos]
+  def actually_toggle_starred t
     if t.has_label? :starred # if ANY message has a star
       t.remove_label :starred # remove from all
     else
@@ -139,7 +141,8 @@ class ThreadIndexMode < LineCursorMode
   end  
 
   def toggle_starred 
-    actually_toggle_starred
+    t = @threads[curpos] or return
+    actually_toggle_starred t
     update_text_for_line curpos
     cursor_down
   end
@@ -149,15 +152,24 @@ class ThreadIndexMode < LineCursorMode
     regen_text
   end
 
+  def actually_toggle_archived t
+    if t.has_label? :inbox
+      t.remove_label :inbox
+      UpdateManager.relay self, :unarchived, t
+    else
+      t.add_label :inbox
+      UpdateManager.relay self, :archived, t
+    end
+  end
+
   def toggle_archived 
     t = @threads[curpos] or return
-    t.toggle_label :inbox
+    actually_toggle_archived t
     update_text_for_line curpos
-    cursor_down
   end
 
   def multi_toggle_archived threads
-    threads.each { |t| t.toggle_label :inbox }
+    threads.each { |t| actually_toggle_archived t }
     regen_text
   end
 
@@ -364,11 +376,6 @@ protected
     update
   end
 
-  def remove_label_and_hide_thread t, label
-    t.remove_label label
-    hide_thread t
-  end
-
   def hide_thread t
     raise "already hidden" if @hidden_threads[t]
     @hidden_threads[t] = true
index 0cd70cdca502591d415098dfa2d0780b78040dcf..eeef330b4adb7ebf673f6dff08b54b8828a88ccd 100644 (file)
@@ -26,6 +26,7 @@ class ThreadViewMode < LineCursorMode
     k.add :edit_as_new, "Edit message as new", 'D'
     k.add :save_to_disk, "Save message/attachment to disk", 's'
     k.add :search, "Search for messages from particular people", 'S'
+    k.add :archive_and_kill, "Archive thread and kill buffer", 'A'
   end
 
   ## there are a couple important instance variables we hold to lay
@@ -124,7 +125,7 @@ class ThreadViewMode < LineCursorMode
     ## TODO: don't recalculate EVERYTHING just to add a stupid little
     ## star to the display
     update
-    UpdateManager.relay :starred, m
+    UpdateManager.relay self, :starred, m
   end
 
   def toggle_expanded
@@ -244,19 +245,18 @@ class ThreadViewMode < LineCursorMode
     end
   end
 
-  ## kinda slow for large threads. TODO: fasterify
   def cleanup
-    BufferManager.say "Marking messages as read..." do
-      @thread.each do |m, d, p|
-        if m && m.has_label?(:unread)
-          m.remove_label :unread 
-          UpdateManager.relay :read, m
-        end
-      end
-    end
+    @thread.remove_label :unread
+    UpdateManager.relay self, :read, @thread
     @layout = @text = nil
   end
 
+  def archive_and_kill
+    @thread.remove_label :inbox
+    UpdateManager.relay self, :archived, @thread
+    BufferManager.kill_buffer_safely buffer
+  end
+
 private 
 
   def initial_state_for m
index fb29fabb4e9fefe36826afca122e2c00dfe729ef..03e0c9fc367cfc4c7c31974c27a36b10767c17e6 100644 (file)
@@ -105,7 +105,7 @@ class PollManager
           Index.update_message m, docid, entry
         else
           Index.add_message m
-          UpdateManager.relay :add, m
+          UpdateManager.relay self, :add, m
         end
       rescue MessageFormatError, SourceError => e
         Redwood::log "ignoring erroneous message at #{source}##{offset}: #{e.message}"
index 1a82a94a5d88c2a1c5751af134be811a2fe763a2..53b3b85d77e786daea13cb7f9b68e8f93dc88ec2 100644 (file)
@@ -24,7 +24,7 @@ class SentManager
     @source.each do |offset, labels|
       m = Message.new :source => @source, :source_info => offset, :labels => labels
       Index.add_message m
-      UpdateManager.relay :add, m
+      UpdateManager.relay self, :add, m
     end
   end
 end
index 7082de16a15b427c7e798056d349c555bf40e5ec..92129e895c1d9375d5d8f108cee371096392f4e4 100644 (file)
@@ -85,9 +85,7 @@ class Thread
   def authors; map { |m, *o| m.from if m }.compact.uniq; end
 
   def apply_label t; each { |m, *o| m && m.add_label(t) }; end
-  def remove_label t
-    each { |m, *o| m && m.remove_label(t) }
-  end
+  def remove_label t; each { |m, *o| m && m.remove_label(t) }; end
 
   def toggle_label label
     if has_label? label
index 71f4d3bbbe0f6ae5a89bf285989658d7c852a8c9..9c28fdb0e948a5cd0bb398c290b733e641849e43 100644 (file)
@@ -11,9 +11,9 @@ class UpdateManager
   def register o; @targets[o] = true; end
   def unregister o; @targets.delete o; end
 
-  def relay type, *args
+  def relay sender, type, *args
     meth = "handle_#{type}_update".intern
-    @targets.keys.each { |o| o.send meth, *args if o.respond_to? meth }
+    @targets.keys.each { |o| o.send meth, sender, *args unless o == sender if o.respond_to? meth }
   end
 end