From: Mike Stipicevic Date: Mon, 16 Feb 2009 05:39:50 +0000 (-0500) Subject: Added UndoManager class X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=60922033349317bb6276ea928829bf0870c5b48a;p=sup Added UndoManager class The UndoManager keeps a list of lambdas that undo actions. It's designed to be used by keypress hooks. It is initialized in the main sup thread along with UpdateManager, etc. --- diff --git a/lib/sup.rb b/lib/sup.rb index 93369a5..eda673b 100644 --- a/lib/sup.rb +++ b/lib/sup.rb @@ -125,6 +125,7 @@ module Redwood Redwood::PollManager.new Redwood::SuicideManager.new Redwood::SUICIDE_FN Redwood::CryptoManager.new + Redwood::UndoManager.new end def finish @@ -281,6 +282,7 @@ require "sup/tagger" require "sup/draft" require "sup/poll" require "sup/crypto" +require "sup/undo" require "sup/horizontal-selector" require "sup/modes/line-cursor-mode" require "sup/modes/help-mode" diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index 4de4613..ee30284 100644 --- a/lib/sup/modes/thread-index-mode.rb +++ b/lib/sup/modes/thread-index-mode.rb @@ -44,6 +44,7 @@ EOS k.add :tag_matching, "Tag matching threads", 'g' k.add :apply_to_tagged, "Apply next command to all tagged threads", ';' k.add :join_threads, "Force tagged threads to be joined into the same thread", '#' + k.add :undo, "Undo the previous action", 'u' end def initialize hidden_labels=[], load_thread_opts={} @@ -83,6 +84,7 @@ EOS def reload drop_all_threads + UndoManager.clear BufferManager.draw_screen load_threads :num => buffer.content_height end @@ -208,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 diff --git a/lib/sup/undo.rb b/lib/sup/undo.rb new file mode 100644 index 0000000..250433d --- /dev/null +++ b/lib/sup/undo.rb @@ -0,0 +1,42 @@ +module Redwood + +## Implements a single undo list for the Sup instance +## +## The basic idea is to keep a list of lambdas to undo +## things. When an action is called (such as 'archive'), +## a lambda is registered with UndoManager that will +## undo the archival action + +class UndoManager + include Singleton + + def initialize + @@actionlist = [] + self.class.i_am_the_instance self + end + + def register desc, actions + actions = [actions] unless actions.is_a?Array + raise StandardError, "when would I need to undo 'nothing?'" unless actions.length > 0 + Redwood::log "registering #{actions.length} actions: #{desc}" + @@actionlist.push({:desc => desc, :actions => actions}) + end + + def undo + unless @@actionlist.length == 0 then + actionset = @@actionlist.pop + Redwood::log "undoing #{actionset[:desc]}..." + actionset[:actions].each{|action| + action.call + } + BufferManager.flash "undid #{actionset[:desc]}" + else + BufferManager.flash "nothing more to undo" + end + end + + def clear + @@actionlist = [] + end +end +end