X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=lib%2Fsup%2Fmodes%2Fthread-index-mode.rb;h=1e02b5b0c8681159ced1f1c54dcd109b256b1138;hb=acc46fde411f4953b5ed47c76365d5cf0de1c944;hp=e24d7e0398b01601faca320bd3dde650f130f773;hpb=c8f691fd95ba88ba723dcc0a5fd50e4187ad199d;p=sup diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index e24d7e0..1e02b5b 100644 --- a/lib/sup/modes/thread-index-mode.rb +++ b/lib/sup/modes/thread-index-mode.rb @@ -14,6 +14,12 @@ Variables: thread: The message thread to be formatted. EOS + HookManager.register "mark-as-spam", < buffer.content_height end @@ -202,6 +210,10 @@ EOS add_or_unhide m end + def undo + UndoManager.undo + end + def update @mutex.synchronize do ## let's see you do THIS in python @@ -225,45 +237,91 @@ EOS end def actually_toggle_starred t + thread = t # cargo cult programming + pos = curpos if t.has_label? :starred # if ANY message has a star + undo = lambda { + thread.first.add_label :starred + update_text_for_line pos + UpdateManager.relay self, :starred, thread.first + } t.remove_label :starred # remove from all UpdateManager.relay self, :unstarred, t.first else + undo = lambda { + thread.remove_label :starred + update_text_for_line pos + UpdateManager.relay self, :unstarred, thread.first + } t.first.add_label :starred # add only to first UpdateManager.relay self, :starred, t.first end + + return undo end def toggle_starred t = cursor_thread or return - actually_toggle_starred t + undo = actually_toggle_starred t + UndoManager.register("starring/unstarring thread #{t.first.id}",undo) update_text_for_line curpos cursor_down end def multi_toggle_starred threads - threads.each { |t| actually_toggle_starred t } + undo = threads.map { |t| actually_toggle_starred t } + UndoManager.register("starring/unstarring #{threads.size} #{threads.size.pluralize 'thread'}", + undo) regen_text end def actually_toggle_archived t + thread = t + pos = curpos if t.has_label? :inbox t.remove_label :inbox + undo = lambda { + thread.apply_label :inbox + update_text_for_line pos + UpdateManager.relay self,:unarchived, thread.first + } UpdateManager.relay self, :archived, t.first else t.apply_label :inbox + undo = lambda { + thread.remove_label :inbox + update_text_for_line pos + UpdateManager.relay self, :unarchived, thread.first + } UpdateManager.relay self, :unarchived, t.first end + + return undo end def actually_toggle_spammed t + thread = t if t.has_label? :spam + undo = lambda { + thread.apply_label :spam + self.hide_thread thread + UpdateManager.relay self,:spammed, thread.first + } t.remove_label :spam + add_or_unhide t.first UpdateManager.relay self, :unspammed, t.first else + undo = lambda { + thread.remove_label :spam + add_or_unhide thread.first + UpdateManager.relay self,:unspammed, thread.first + } t.apply_label :spam + hide_thread t UpdateManager.relay self, :spammed, t.first end + + return undo end def actually_toggle_deleted t @@ -278,12 +336,15 @@ EOS def toggle_archived t = cursor_thread or return - actually_toggle_archived t + undo = [actually_toggle_archived(t), lambda {self.update_text_for_line curpos}] + UndoManager.register("deleting/undeleting thread #{t.first.id}",undo) update_text_for_line curpos end def multi_toggle_archived threads - threads.each { |t| actually_toggle_archived t } + undo = threads.map { |t| actually_toggle_archived t} + UndoManager.register("deleting/undeleting #{threads.size} #{threads.size.pluralize 'thread'}", + undo << lambda {self.regen_text}) regen_text end @@ -333,6 +394,7 @@ EOS def toggle_spam t = cursor_thread or return multi_toggle_spam [t] + HookManager.run("mark-as-spam", :thread => t) end ## both spam and deleted have the curious characteristic that you @@ -343,10 +405,9 @@ EOS ## see deleted or spam emails, and when you undelete or unspam them ## you also want them to disappear immediately. def multi_toggle_spam threads - threads.each do |t| - actually_toggle_spammed t - hide_thread t - end + undo = threads.map{ |t| actually_toggle_spammed t} + UndoManager.register("marking/unmarking #{threads.size} #{threads.size.pluralize 'thread'} as spam", + undo << lambda {self.regen_text}) regen_text end @@ -440,9 +501,8 @@ EOS end def multi_edit_labels threads - answer = BufferManager.ask :add_labels, "add labels: " - return unless answer - user_labels = answer.split(/\s+/).map { |l| l.intern } + user_labels = BufferManager.ask_for_labels :add_labels, "Add labels: ", [], @hidden_labels + return unless user_labels hl = user_labels.select { |l| @hidden_labels.member? l } if hl.empty? @@ -655,7 +715,6 @@ protected date = t.date.to_nice_s - new = t.has_label?(:unread) starred = t.has_label?(:starred) ## format the from column @@ -692,7 +751,9 @@ protected p = dp || t.participants.any? { |p| AccountManager.is_account? p } subj_color = - if new + if t.has_label?(:draft) + :index_draft_color + elsif t.has_label?(:unread) :index_new_color elsif starred :index_starred_color @@ -712,7 +773,8 @@ protected from + [ [subj_color, size_widget_text], - [:to_me_color, dp ? " >" : (p ? ' +' : " ")], + [:to_me_color, t.labels.member?(:attachment) ? "@" : " "], + [:to_me_color, dp ? ">" : (p ? '+' : " ")], [subj_color, t.subj + (t.subj.empty? ? "" : " ")], ] + (t.labels - @hidden_labels).map { |label| [:label_color, "+#{label} "] } +