sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 53c03a357836dcdeafad0908702a151cbc2ec362
parent d8796a0f43015c5e2d3b4768fdd6f9187a2db6a2
Author: William Morgan <wmorgan-sup@masanjin.net>
Date:   Mon, 23 Mar 2009 10:46:00 -0400

Merge branch 'multi-remove-labels' into next

Conflicts:

	lib/sup/modes/thread-index-mode.rb

Diffstat:
M lib/sup/modes/thread-index-mode.rb | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
@@ -535,23 +535,31 @@ EOS
   end
 
   def multi_edit_labels threads
-    user_labels = BufferManager.ask_for_labels :add_labels, "Add labels: ", [], @hidden_labels
+    user_labels = BufferManager.ask_for_labels :labels, "Add/remove labels (use -label to remove): ", [], @hidden_labels
     return unless user_labels
-    
-    hl = user_labels.select { |l| @hidden_labels.member? l }
+
+    user_labels.map! { |l| (l.to_s =~ /^-/)? [l.to_s.gsub(/^-?/, '').to_sym, true] : [l, false] }
+    hl = user_labels.select { |(l,_)| @hidden_labels.member? l }
     if hl.empty?
-      undo = threads.map { |t| old_labels = t.labels
-        user_labels.each { |l| t.apply_label l }
+      undo = threads.map do |t|
+        old_labels = t.labels
+        user_labels.each do |(l, to_remove)|
+          if to_remove
+            t.remove_label l
+          else
+            t.apply_label l
+          end
+        end
         ## UpdateManager or some other regresh mechanism?
         UpdateManager.relay self, :labeled, t.first
-        lambda {
+        lambda do
           t.labels = old_labels
           UpdateManager.relay self, :labeled, t.first
-        }
-      }
-    user_labels.each { |l| LabelManager << l }
-    UndoManager.register("labeling #{threads.size} #{threads.size.pluralize 'thread'}",
-                         undo << lambda { regen_text})
+        end
+      end
+      user_labels.each { |(l,_)| LabelManager << l }
+      UndoManager.register("labeling #{threads.size} #{threads.size.pluralize 'thread'}",
+                          undo << lambda { regen_text})
     else
       BufferManager.flash "'#{hl}' is a reserved label!"
     end