]> git.cworth.org Git - sup/blobdiff - lib/sup/modes/label-list-mode.rb
various key changes
[sup] / lib / sup / modes / label-list-mode.rb
index 18ce9aa8d1c5cb412218b1b4c6fadae4a1d61295..fd994f756216bd3b3c7ca679b9a2bac82dbb8956 100644 (file)
@@ -2,87 +2,62 @@ module Redwood
 
 class LabelListMode < LineCursorMode
   register_keymap do |k|
-    k.add :view_results, "View messages with the selected label", :enter
-    k.add :reload, "Discard results and reload", 'D'
+    k.add :select_label, "Select label", :enter
+    k.add :reload, "Discard label list and reload", '@'
   end
 
+  bool_reader :done
+  attr_reader :value
+
   def initialize
     @labels = []
     @text = []
-    super()
+    @done = false
+    @value = nil
+    super
+    regen_text
   end
 
-  def lines; @text.length; end
-  def [] i; @text[i]; end
-
-  def load; regen_text; end
-
-  def load_in_background
-    Redwood::reporting_thread do
-      regen_text do |i|
-        if i % 10 == 0
-          buffer.mark_dirty
-          BufferManager.draw_screen
-          sleep 0.1 # ok, dirty trick.
-        end
-      end
-      buffer.mark_dirty
-      BufferManager.draw_screen
-    end
-  end
+  def lines; @text.length end
+  def [] i; @text[i] end
 
 protected
 
   def reload
-    buffer.mark_dirty
-    BufferManager.draw_screen
-    load_in_background
+    regen_text
+    buffer.mark_dirty if buffer
   end
   
   def regen_text
     @text = []
-    @labels = LabelManager::LISTABLE_LABELS.sort_by { |t| t.to_s } +
-                LabelManager.user_labels.sort_by { |t| t.to_s }
+    labels = LabelManager.listable_labels
 
-    counts = @labels.map do |t|
-      total = Index.num_results_for :label => t
-      unread = Index.num_results_for :labels => [t, :unread]
-      [t, total, unread]
-    end      
+    counts = labels.map do |label|
+      string = LabelManager.string_for label
+      total = Index.num_results_for :label => label
+      unread = Index.num_results_for :labels => [label, :unread]
+      [label, string, total, unread]
+    end.sort_by { |l, s, t, u| s.downcase }
 
-    width = @labels.map { |t| t.to_s.length }.max
+    width = counts.max_of { |l, s, t, u| s.length }
+    @labels = counts.map { |l, s, t, u| l }
 
-    counts.map_with_index do |(t, total, unread), i|
-      if total == 0 && !LabelManager::LISTABLE_LABELS.include?(t)
-        Redwood::log "no hits for label #{t}, deleting"
-        LabelManager.delete t
-        @labels.delete t
+    counts.map do |label, string, total, unread|
+      if total == 0 && !LabelManager::RESERVED_LABELS.include?(label)
+        Redwood::log "no hits for label #{label}, deleting"
+        LabelManager.delete label
         next
       end
 
-      label =
-        case t
-        when *LabelManager::LISTABLE_LABELS
-          t.to_s.ucfirst
-        else
-          t.to_s
-        end
       @text << [[(unread == 0 ? :labellist_old_color : :labellist_new_color),
-          sprintf("%#{width + 1}s %5d %s, %5d unread", label, total, total == 1 ? " message" : "messages", unread)]]
+          sprintf("%#{width + 1}s %5d %s, %5d unread", string, total, total == 1 ? " message" : "messages", unread)]]
       yield i if block_given?
     end.compact
   end
 
-  def view_results
-    label = @labels[curpos]
-    if label == :inbox
-      BufferManager.raise_to_front BufferManager["inbox"]
-    else
-      b = BufferManager.spawn_unless_exists(label) do
-        mode = LabelSearchResultsMode.new [label]
-      end
-      b.mode.load_threads :num => b.content_height
-    end
+  def select_label
+    @value, string = @labels[curpos]
+    @done = true if @value
   end
 end