]> git.cworth.org Git - sup/blob - lib/sup/modes/label-list-mode.rb
various key changes
[sup] / lib / sup / modes / label-list-mode.rb
1 module Redwood
2
3 class LabelListMode < LineCursorMode
4   register_keymap do |k|
5     k.add :select_label, "Select label", :enter
6     k.add :reload, "Discard label list and reload", '@'
7   end
8
9   bool_reader :done
10   attr_reader :value
11
12   def initialize
13     @labels = []
14     @text = []
15     @done = false
16     @value = nil
17     super
18     regen_text
19   end
20
21   def lines; @text.length end
22   def [] i; @text[i] end
23
24 protected
25
26   def reload
27     regen_text
28     buffer.mark_dirty if buffer
29   end
30   
31   def regen_text
32     @text = []
33     labels = LabelManager.listable_labels
34
35     counts = labels.map do |label|
36       string = LabelManager.string_for label
37       total = Index.num_results_for :label => label
38       unread = Index.num_results_for :labels => [label, :unread]
39       [label, string, total, unread]
40     end.sort_by { |l, s, t, u| s.downcase }
41
42     width = counts.max_of { |l, s, t, u| s.length }
43     @labels = counts.map { |l, s, t, u| l }
44
45     counts.map do |label, string, total, unread|
46       if total == 0 && !LabelManager::RESERVED_LABELS.include?(label)
47         Redwood::log "no hits for label #{label}, deleting"
48         LabelManager.delete label
49         next
50       end
51
52       @text << [[(unread == 0 ? :labellist_old_color : :labellist_new_color),
53           sprintf("%#{width + 1}s %5d %s, %5d unread", string, total, total == 1 ? " message" : "messages", unread)]]
54       yield i if block_given?
55     end.compact
56   end
57
58   def select_label
59     @value, string = @labels[curpos]
60     @done = true if @value
61   end
62 end
63
64 end