]> git.cworth.org Git - sup/blobdiff - lib/sup/label.rb
sort contacts when saving contacts.txt
[sup] / lib / sup / label.rb
index 5d3dc4a6403de0d3f116fa92e8b99516eab038f9..4afc0f9c31e7ab081939e5813e3a6a2a89f160cb 100644 (file)
@@ -5,12 +5,12 @@ 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 ]
 
   ## labels which it nonetheless makes sense to search for by
-  LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
+  LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted, :inbox ]
 
-  ## labels that will never be displayed to the user
+  ## labels that will typically be hidden from the user
   HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
 
   def initialize fn
@@ -22,27 +22,62 @@ class LabelManager
         []
       end
     @labels = {}
+    @modified = false
     labels.each { |t| @labels[t] = true }
 
     self.class.i_am_the_instance self
   end
 
-  ## all listable (user-defined and system listable) labels, ordered
+  ## all listable (just user-defined at the moment) labels, ordered
   ## nicely and converted to pretty strings. use #label_for to recover
   ## the original label.
-  def listable_label_strings
-    LISTABLE_RESERVED_LABELS.sort_by { |l| l.to_s }.map { |l| l.to_s.ucfirst } +
-      @labels.keys.map { |l| l.to_s }.sort
+  def listable_labels
+    ## uniq's only necessary here because of certain upgrade issues
+    (LISTABLE_RESERVED_LABELS + @labels.keys).uniq
+  end
+
+  ## all apply-able (user-defined and system listable) labels, ordered
+  ## nicely and converted to pretty strings. use #label_for to recover
+  ## the original label.
+  def applyable_labels
+    @labels.keys
   end
 
   ## reverse the label->string mapping, for convenience!
-  def label_for string
-    string.downcase.intern
+  def string_for l
+    if RESERVED_LABELS.include? l
+      l.to_s.ucfirst
+    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; @labels[t] = true unless @labels.member?(t) || RESERVED_LABELS.member?(t); end
-  def delete t; @labels.delete t; end
+  def << t
+    t = t.intern unless t.is_a? Symbol
+    unless @labels.member?(t) || RESERVED_LABELS.member?(t)
+      @labels[t] = true
+      @modified = true
+    end
+  end
+
+  def delete t
+    if @labels.delete t
+      @modified = true
+    end
+  end
+
   def save
+    return unless @modified
     File.open(@fn, "w") { |f| f.puts @labels.keys }
   end
 end