lib/sup/modes/thread_index_mode.rb in sup-0.15.4 vs lib/sup/modes/thread_index_mode.rb in sup-0.16.0

- old
+ new

@@ -31,10 +31,11 @@ register_keymap do |k| k.add :load_threads, "Load #{LOAD_MORE_THREAD_NUM} more threads", 'M' k.add_multi "Load all threads (! to confirm) :", '!' do |kk| kk.add :load_all_threads, "Load all threads (may list a _lot_ of threads)", '!' end + k.add :read_and_archive, "Archive thread (remove from inbox) and mark read", 'A' k.add :cancel_search, "Cancel current search", :ctrl_g k.add :reload, "Refresh view", '@' k.add :toggle_archived, "Toggle archived status", 'a' k.add :toggle_starred, "Star or unstar all messages in thread", '*' k.add :toggle_new, "Toggle new/read status of all messages in thread", 'N' @@ -729,9 +730,50 @@ else load_n_threads n, myopts end end ignore_concurrent_calls :load_threads + + def read_and_archive + return unless cursor_thread + thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread + + was_unread = thread.labels.member? :unread + UndoManager.register "reading and archiving thread" do + thread.apply_label :inbox + thread.apply_label :unread if was_unread + add_or_unhide thread.first + Index.save_thread thread + end + + cursor_thread.remove_label :unread + cursor_thread.remove_label :inbox + hide_thread cursor_thread + regen_text + Index.save_thread thread + end + + def multi_read_and_archive threads + old_labels = threads.map { |t| t.labels.dup } + + threads.each do |t| + t.remove_label :unread + t.remove_label :inbox + hide_thread t + end + regen_text + + UndoManager.register "reading and archiving #{threads.size.pluralize 'thread'}" do + threads.zip(old_labels).each do |t, l| + t.labels = l + add_or_unhide t.first + Index.save_thread t + end + regen_text + end + + threads.each { |t| Index.save_thread t } + end def resize rows, cols regen_text super end