X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=lib%2Fsup%2Flabel.rb;h=67474c2b79ed3393aa3321e458fdb4675225dfe1;hb=3f08a0191a824c5d6e7731a3d25106d1a0c3931e;hp=3e8baa82f840b8cc8252258708ef4d09c6a01123;hpb=ea4f9c9aeca93104ddfd4804cec9e2004f7fca0f;p=sup diff --git a/lib/sup/label.rb b/lib/sup/label.rb index 3e8baa8..67474c2 100644 --- a/lib/sup/label.rb +++ b/lib/sup/label.rb @@ -5,13 +5,10 @@ class LabelManager ## labels that have special semantics. user will be unable to ## add/remove these via normal label mechanisms. - RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted ] + RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted, :inbox, :attachment ] - ## labels which it nonetheless makes sense to search for by - LISTABLE_LABELS = [ :starred, :spam, :draft, :sent, :deleted ] - - ## labels that will never be displayed to the user - HIDDEN_LABELS = [ :starred, :unread ] + ## labels that will typically be hidden from the user + HIDDEN_RESERVED_LABELS = [ :starred, :unread, :attachment ] def initialize fn @fn = fn @@ -22,16 +19,66 @@ class LabelManager [] end @labels = {} + @new_labels = {} + @modified = false labels.each { |t| @labels[t] = true } + end + + def new_label? l; @new_labels.include?(l) end + + ## all labels user-defined and system, ordered + ## nicely and converted to pretty strings. use #label_for to recover + ## the original label. + def all_labels + ## uniq's only necessary here because of certain upgrade issues + (RESERVED_LABELS + @labels.keys).uniq + end + + ## all user-defined labels, ordered + ## nicely and converted to pretty strings. use #label_for to recover + ## the original label. + def user_defined_labels + @labels.keys + end + + ## reverse the label->string mapping, for convenience! + def string_for l + if RESERVED_LABELS.include? l + l.to_s.capitalize + else + l.to_s + end + end + + def label_for s + l = s.intern + l2 = s.downcase.intern + if RESERVED_LABELS.include? l2 + l2 + else + l + end + end + + def << t + raise ArgumentError, "expecting a symbol" unless t.is_a? Symbol + unless @labels.member?(t) || RESERVED_LABELS.member?(t) + @labels[t] = true + @new_labels[t] = true + @modified = true + end + end - self.class.i_am_the_instance self + def delete t + if @labels.delete(t) + @modified = true + end end - def user_labels; @labels.keys; end - def << t; @labels[t] = true unless @labels.member?(t) || RESERVED_LABELS.member?(t); end - def delete t; @labels.delete t; end def save - File.open(@fn, "w") { |f| f.puts @labels.keys } + return unless @modified + File.open(@fn, "w") { |f| f.puts @labels.keys.sort_by { |l| l.to_s } } + @new_labels = {} end end