]> git.cworth.org Git - sup/blob - lib/sup/modes/label-list-mode.rb
e02fa26d26afa23ee22d83e5bee3b9dbe082f745
[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     k.add :toggle_show_unread_only, "Toggle between all labels and those with unread mail", :tab
8   end
9
10   bool_reader :done
11   attr_reader :value
12
13   def initialize
14     @labels = []
15     @text = []
16     @done = false
17     @value = nil
18     @unread_only = false
19     super
20     regen_text
21   end
22
23   def lines; @text.length end
24   def [] i; @text[i] end
25
26 protected
27   def toggle_show_unread_only
28     @unread_only = !@unread_only
29     reload
30   end
31
32   def reload
33     regen_text
34     buffer.mark_dirty if buffer
35   end
36
37   def regen_text
38     @text = []
39     labels = LabelManager.listable_labels
40
41     counts = labels.map do |label|
42       string = LabelManager.string_for label
43       total = Index.num_results_for :label => label
44       unread = Index.num_results_for :labels => [label, :unread]
45       [label, string, total, unread]
46     end.sort_by { |l, s, t, u| s.downcase }
47
48     width = counts.max_of { |l, s, t, u| s.length }
49
50     if @unread_only
51       counts.delete_if { | l, s, t, u | u == 0 }
52     end
53
54     @labels = []
55     counts.map do |label, string, total, unread|
56       if total == 0 && !LabelManager::RESERVED_LABELS.include?(label)
57         Redwood::log "no hits for label #{label}, deleting"
58         LabelManager.delete label
59         next
60       end
61
62       @text << [[(unread == 0 ? :labellist_old_color : :labellist_new_color),
63           sprintf("%#{width + 1}s %5d %s, %5d unread", string, total, total == 1 ? " message" : "messages", unread)]]
64       @labels << label
65       yield i if block_given?
66     end.compact
67   end
68
69   def select_label
70     @value, string = @labels[curpos]
71     @done = true if @value
72   end
73 end
74
75 end