]> git.cworth.org Git - sup/blob - lib/sup/label.rb
L now prompts for label rather than immediately spawning label-select-mode
[sup] / lib / sup / label.rb
1 module Redwood
2
3 class LabelManager
4   include Singleton
5
6   ## labels that have special semantics. user will be unable to
7   ## add/remove these via normal label mechanisms.
8   RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted ]
9
10   ## labels which it nonetheless makes sense to search for by
11   LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
12
13   ## labels that will never be displayed to the user
14   HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
15
16   def initialize fn
17     @fn = fn
18     labels = 
19       if File.exists? fn
20         IO.readlines(fn).map { |x| x.chomp.intern }
21       else
22         []
23       end
24     @labels = {}
25     labels.each { |t| @labels[t] = true }
26
27     self.class.i_am_the_instance self
28   end
29
30   ## all listable (user-defined and system listable) labels, ordered
31   ## nicely and converted to pretty strings. use #label_for to recover
32   ## the original label.
33   def listable_label_strings
34     LISTABLE_RESERVED_LABELS.sort_by { |l| l.to_s }.map { |l| l.to_s.ucfirst } +
35       @labels.keys.map { |l| l.to_s }.sort
36   end
37
38   ## reverse the label->string mapping, for convenience!
39   def label_for string
40     string.downcase.intern
41   end
42   
43   def << t; @labels[t] = true unless @labels.member?(t) || RESERVED_LABELS.member?(t); end
44   def delete t; @labels.delete t; end
45   def save
46     File.open(@fn, "w") { |f| f.puts @labels.keys }
47   end
48 end
49
50 end