]> git.cworth.org Git - sup/blobdiff - lib/sup/modes/thread-index-mode.rb
'A' archives and kills buffer in thread-view-mode (required significant updatedes...
[sup] / lib / sup / modes / thread-index-mode.rb
index 190afcaf98488c8c905dcd5cd30e47a541c4a8db..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
@@ -57,7 +58,9 @@ class ThreadIndexMode < LineCursorMode
   def select t=nil
     t ||= @threads[curpos]
 
-    t = t.clone # XXXX highly experimental
+    ## this isn't working entirely. TODO:figure out why
+    # t = t.clone # required so that messages added later on don't completely
+                # screw everything up
 
     ## TODO: don't regen text completely
     Redwood::reporting_thread do
@@ -78,20 +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
@@ -99,16 +106,17 @@ 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
+      BufferManager.draw_screen
     end
   end
 
   def update
     ## let's see you do THIS in python
-    @threads = @ts.threads.select { |t| !@hidden_threads[t] }.sort_by { |t| t.date }.reverse
+    @threads = @ts.threads.select { |t| !@hidden_threads[t] && !t.has_label?(:killed) }.sort_by { |t| t.date }.reverse
     @size_width = (@threads.map { |t| t.size }.max || 0).num_digits
     regen_text
   end
@@ -124,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
@@ -134,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
@@ -144,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
 
@@ -305,6 +322,7 @@ class ThreadIndexMode < LineCursorMode
     t = @threads[curpos] or return
     m = t.latest_message
     return if m.nil? # probably won't happen
+    m.load_from_source!
     mode = ForwardMode.new m
     BufferManager.spawn "Forward of #{m.subj}", mode
     mode.edit
@@ -322,7 +340,7 @@ class ThreadIndexMode < LineCursorMode
   def load_n_threads n=LOAD_MORE_THREAD_NUM, opts={}
     @mbid = BufferManager.say "Searching for threads..."
     orig_size = @ts.size
-    last_update = Time.now
+    last_update = Time.now - 9999 # oh yeah
     @ts.load_n_threads(@ts.size + n, opts) do |i|
       BufferManager.say "Loaded #{i} threads...", @mbid
       if (Time.now - last_update) >= 0.25
@@ -358,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