X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fsup%2Fmodes%2Fthread-index-mode.rb;h=56dcdff2df5f139c0129c984b0f02696d6d2cd70;hb=f35f205192ee39133633457c652e0c05a45386c9;hp=629f8df7f95f66cc69c3cdf8250dd3994a2da3ff;hpb=f60cfab3d78573f69907e58f2bd21fb9084c00eb;p=sup diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index 629f8df..56dcdff 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", <= 0 && target_l < @threads.length + @threads[target_l] end - end or return + end - select t, b + if t # there's a next thread + set_cursor_pos target_l # move out of mutex? + select t, b + elsif b # no next thread. call the block anyways + b.call + end end def handle_single_message_labeled_update sender, m @@ -172,10 +194,16 @@ EOS end def handle_deleted_update sender, m - @ts_mutex.synchronize do - return unless @ts.contains? m - @ts.remove_thread_containing_id m.id - end + t = @ts_mutex.synchronize { @ts.thread_for m } + return unless t + hide_thread t + update + end + + def handle_spammed_update sender, m + t = @ts_mutex.synchronize { @ts.thread_for m } + return unless t + hide_thread t update end @@ -314,6 +342,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 @@ -359,14 +388,25 @@ EOS BufferManager.flash "#{threads.size.pluralize 'Thread'} killed." end - def save - dirty_threads = @mutex.synchronize { (@threads + @hidden_threads.keys).select { |t| t.dirty? } } - return if dirty_threads.empty? + def save background=true + if background + Redwood::reporting_thread("saving thread") { actually_save } + else + actually_save + end + end + + def actually_save + @save_thread_mutex.synchronize do + BufferManager.say("Saving contacts...") { ContactManager.instance.save } + dirty_threads = @mutex.synchronize { (@threads + @hidden_threads.keys).select { |t| t.dirty? } } + next if dirty_threads.empty? - BufferManager.say("Saving threads...") do |say_id| - dirty_threads.each_with_index do |t, i| - BufferManager.say "Saving modified thread #{i + 1} of #{dirty_threads.length}...", say_id - t.save Index + BufferManager.say("Saving threads...") do |say_id| + dirty_threads.each_with_index do |t, i| + BufferManager.say "Saving modified thread #{i + 1} of #{dirty_threads.length}...", say_id + t.save Index + end end end end @@ -380,7 +420,7 @@ EOS sleep 0.1 # TODO: necessary? BufferManager.erase_flash end - save + save false super end @@ -397,9 +437,14 @@ EOS end def tag_matching - query = BufferManager.ask :search, "tag threads matching: " + query = BufferManager.ask :search, "tag threads matching (regex): " return if query.nil? || query.empty? - query = /#{query}/i + query = begin + /#{query}/i + rescue RegexpError => e + BufferManager.flash "error interpreting '#{query}': #{e.message}" + return + end @mutex.synchronize { @threads.each { |t| @tags.tag t if thread_matches?(t, query) } } regen_text end @@ -416,18 +461,27 @@ EOS return unless user_labels thread.labels = keepl + user_labels user_labels.each { |l| LabelManager << l } + update_text_for_line curpos UpdateManager.relay self, :labeled, thread.first 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 } - - hl = user_labels.select { |l| @hidden_labels.member? l } + user_labels = BufferManager.ask_for_labels :labels, "Add/remove labels (use -label to remove): ", [], @hidden_labels + return unless user_labels + + 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? - threads.each { |t| user_labels.each { |l| t.apply_label l } } - user_labels.each { |l| LabelManager << l } + threads.each do |t| + user_labels.each do |(l, to_remove)| + if to_remove + t.remove_label l + else + t.apply_label l + end + end + end + user_labels.each { |(l,_)| LabelManager << l } else BufferManager.flash "'#{hl}' is a reserved label!" end @@ -540,7 +594,7 @@ protected def add_or_unhide m @ts_mutex.synchronize do if (is_relevant?(m) || @ts.is_relevant?(m)) && !@ts.contains?(m) - @ts.load_thread_for_message m + @ts.load_thread_for_message m, @load_thread_opts end @hidden_threads.delete @ts.thread_for(m) @@ -635,7 +689,6 @@ protected date = t.date.to_nice_s - new = t.has_label?(:unread) starred = t.has_label?(:starred) ## format the from column @@ -672,7 +725,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 @@ -692,13 +747,13 @@ 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} "] } + [[:snippet_color, snippet] ] - end def dirty?; @mutex.synchronize { (@hidden_threads.keys + @threads).any? { |t| t.dirty? } } end