From: wmorgan Date: Sun, 11 Feb 2007 21:07:25 +0000 (+0000) Subject: 'A' archives and kills buffer in thread-view-mode (required significant updatedes... X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=d3093211872207e898cea6f197bd5a29fab3e221;p=sup 'A' archives and kills buffer in thread-view-mode (required significant updatedes to relay mechanism) git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@321 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- diff --git a/bin/sup b/bin/sup index 3d38aa0..fac2f3b 100644 --- a/bin/sup +++ b/bin/sup @@ -12,9 +12,9 @@ global_keymap = Keymap.new do |k| k.add :quit, "Quit Redwood", 'q' k.add :help, "Show help", 'H', '?' k.add :roll_buffers, "Switch to next buffer", 'b' - k.add :roll_buffers_backwards, "Switch to previous buffer", 'B' +# k.add :roll_buffers_backwards, "Switch to previous buffer", 'B' k.add :kill_buffer, "Kill the current buffer", 'x' - k.add :list_buffers, "List all buffers", 'A' + k.add :list_buffers, "List all buffers", 'B' k.add :list_contacts, "List contacts", 'C' k.add :redraw, "Redraw screen", :ctrl_l k.add :search, "Search messages", '/' diff --git a/doc/TODO b/doc/TODO index 1ca11fb..d840734 100644 --- a/doc/TODO +++ b/doc/TODO @@ -1,21 +1,27 @@ -for next release +for 0.0.7 ---------------- -make 'a' archive in thread-view-mode +de-archived messages should be auto-added to inbox + +for 0.0.8 +--------- message attachments warnings: top-posting, attachments maildir + +for 0.0.9 +--------- undo +use Net::SMTP +gmail future ------ -maybe: de-archived messages should be auto-added to inbox swappable keymappings bugfix: when returning from a shelling out, ncurses is crazy bugfix: miscellaneous weirdnesses in buffer line editing wide character support batch deletion support for message-content modules such as ruby-talk:XXXXX detection -use Net::SMTP forward attachments CREATE attachments tab completion on labels, contacts @@ -25,13 +31,13 @@ maybe: filters maybe: rangefilter on the initial inbox to only consider the most recent 1000 messages select all, starred, to me, etc annotations on messages -gmail pop be able to mark individual messages as spam in thread-view-mode toggle wrapping done ---- +x make 'A' archive in thread-view-mode x remove stupid percent_done source methods (still useful; made it optional) x don't quit while writing thread index state to disk or with unsaved drafts/messages x bugfix: deleted threads are showing up (i don't see this any more) diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb index 5974b57..e234c10 100644 --- a/lib/sup/draft.rb +++ b/lib/sup/draft.rb @@ -23,7 +23,7 @@ class DraftManager @source.each do |thisoffset, theselabels| m = Message.new :source => @source, :source_info => thisoffset, :labels => theselabels Index.add_message m - UpdateManager.relay :add, m + UpdateManager.relay self, :add, m my_message = m if thisoffset == offset end @@ -36,7 +36,7 @@ class DraftManager raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{mid.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id Index.drop_entry docid File.delete @source.fn_for_offset(entry[:source_info]) - UpdateManager.relay :delete, mid + UpdateManager.relay self, :delete, mid end end diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb index 3dfccbd..b33a484 100644 --- a/lib/sup/modes/inbox-mode.rb +++ b/lib/sup/modes/inbox-mode.rb @@ -15,7 +15,8 @@ class InboxMode < ThreadIndexMode def killable?; false; end def archive - remove_label_and_hide_thread cursor_thread, :inbox + cursor_thread.remove_label :inbox + hide_thread cursor_thread regen_text end @@ -24,6 +25,14 @@ class InboxMode < ThreadIndexMode regen_text end + def handle_archived_update sender, t + hide_thread t if contains_thread? t + end + + def handle_unarchived_update sender, t + ## XXX todo: fill me in + end + def status super + " #{Index.size} messages in index" end diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index 9cceaa6..de79900 100644 --- a/lib/sup/modes/thread-index-mode.rb +++ b/lib/sup/modes/thread-index-mode.rb @@ -46,6 +46,7 @@ class ThreadIndexMode < LineCursorMode def lines; @text.length; end def [] i; @text[i]; end + def contains_thread? t; !@lines[t].nil?; end def reload drop_all_threads @@ -58,7 +59,7 @@ class ThreadIndexMode < LineCursorMode t ||= @threads[curpos] ## this isn't working entirely. TODO:figure out why - t = t.clone # required so that messages added later on don't completely + # t = t.clone # required so that messages added later on don't completely # screw everything up ## TODO: don't regen text completely @@ -80,22 +81,24 @@ class ThreadIndexMode < LineCursorMode threads.each { |t| select t } end - def handle_starred_update m + def handle_starred_update sender, m return unless(t = @ts.thread_for m) update_text_for_line @lines[t] BufferManager.draw_screen end - def handle_read_update m - return unless(t = @ts.thread_for m) + def handle_read_update sender, t + return unless @lines[t] update_text_for_line @lines[t] BufferManager.draw_screen end + def handle_archived_update *a; handle_read_update *a; end + ## overwrite me! def is_relevant? m; false; end - def handle_add_update m + def handle_add_update sender, m if is_relevant?(m) || @ts.is_relevant?(m) @ts.load_thread_for_message m update @@ -103,7 +106,7 @@ class ThreadIndexMode < LineCursorMode end end - def handle_delete_update mid + def handle_delete_update sender, mid if @ts.contains_id? mid @ts.remove mid update @@ -129,8 +132,7 @@ class ThreadIndexMode < LineCursorMode end end - ## i always hate people who name things like this... - def actually_toggle_starred t=@threads[curpos] + def actually_toggle_starred t if t.has_label? :starred # if ANY message has a star t.remove_label :starred # remove from all else @@ -139,7 +141,8 @@ class ThreadIndexMode < LineCursorMode end def toggle_starred - actually_toggle_starred + t = @threads[curpos] or return + actually_toggle_starred t update_text_for_line curpos cursor_down end @@ -149,15 +152,24 @@ class ThreadIndexMode < LineCursorMode regen_text end + def actually_toggle_archived t + if t.has_label? :inbox + t.remove_label :inbox + UpdateManager.relay self, :unarchived, t + else + t.add_label :inbox + UpdateManager.relay self, :archived, t + end + end + def toggle_archived t = @threads[curpos] or return - t.toggle_label :inbox + actually_toggle_archived t update_text_for_line curpos - cursor_down end def multi_toggle_archived threads - threads.each { |t| t.toggle_label :inbox } + threads.each { |t| actually_toggle_archived t } regen_text end @@ -364,11 +376,6 @@ protected update end - def remove_label_and_hide_thread t, label - t.remove_label label - hide_thread t - end - def hide_thread t raise "already hidden" if @hidden_threads[t] @hidden_threads[t] = true diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb index 0cd70cd..eeef330 100644 --- a/lib/sup/modes/thread-view-mode.rb +++ b/lib/sup/modes/thread-view-mode.rb @@ -26,6 +26,7 @@ class ThreadViewMode < LineCursorMode k.add :edit_as_new, "Edit message as new", 'D' k.add :save_to_disk, "Save message/attachment to disk", 's' k.add :search, "Search for messages from particular people", 'S' + k.add :archive_and_kill, "Archive thread and kill buffer", 'A' end ## there are a couple important instance variables we hold to lay @@ -124,7 +125,7 @@ class ThreadViewMode < LineCursorMode ## TODO: don't recalculate EVERYTHING just to add a stupid little ## star to the display update - UpdateManager.relay :starred, m + UpdateManager.relay self, :starred, m end def toggle_expanded @@ -244,19 +245,18 @@ class ThreadViewMode < LineCursorMode end end - ## kinda slow for large threads. TODO: fasterify def cleanup - BufferManager.say "Marking messages as read..." do - @thread.each do |m, d, p| - if m && m.has_label?(:unread) - m.remove_label :unread - UpdateManager.relay :read, m - end - end - end + @thread.remove_label :unread + UpdateManager.relay self, :read, @thread @layout = @text = nil end + def archive_and_kill + @thread.remove_label :inbox + UpdateManager.relay self, :archived, @thread + BufferManager.kill_buffer_safely buffer + end + private def initial_state_for m diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb index fb29fab..03e0c9f 100644 --- a/lib/sup/poll.rb +++ b/lib/sup/poll.rb @@ -105,7 +105,7 @@ class PollManager Index.update_message m, docid, entry else Index.add_message m - UpdateManager.relay :add, m + UpdateManager.relay self, :add, m end rescue MessageFormatError, SourceError => e Redwood::log "ignoring erroneous message at #{source}##{offset}: #{e.message}" diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb index 1a82a94..53b3b85 100644 --- a/lib/sup/sent.rb +++ b/lib/sup/sent.rb @@ -24,7 +24,7 @@ class SentManager @source.each do |offset, labels| m = Message.new :source => @source, :source_info => offset, :labels => labels Index.add_message m - UpdateManager.relay :add, m + UpdateManager.relay self, :add, m end end end diff --git a/lib/sup/thread.rb b/lib/sup/thread.rb index 7082de1..92129e8 100644 --- a/lib/sup/thread.rb +++ b/lib/sup/thread.rb @@ -85,9 +85,7 @@ class Thread def authors; map { |m, *o| m.from if m }.compact.uniq; end def apply_label t; each { |m, *o| m && m.add_label(t) }; end - def remove_label t - each { |m, *o| m && m.remove_label(t) } - end + def remove_label t; each { |m, *o| m && m.remove_label(t) }; end def toggle_label label if has_label? label diff --git a/lib/sup/update.rb b/lib/sup/update.rb index 71f4d3b..9c28fdb 100644 --- a/lib/sup/update.rb +++ b/lib/sup/update.rb @@ -11,9 +11,9 @@ class UpdateManager def register o; @targets[o] = true; end def unregister o; @targets.delete o; end - def relay type, *args + def relay sender, type, *args meth = "handle_#{type}_update".intern - @targets.keys.each { |o| o.send meth, *args if o.respond_to? meth } + @targets.keys.each { |o| o.send meth, sender, *args unless o == sender if o.respond_to? meth } end end