.__setup_params() -> ._setup_params() in hooke/plugin/*.py.
[hooke.git] / hooke / plugin / command_stack.py
index 3b81c24eed93499f0f3940c48139b2a6a2e4febb..59ca5ddbe79e98782ff5d60f3d038cf2293349cf 100644 (file)
@@ -39,6 +39,11 @@ from . import Builtin
 class CommandStackCommand (Command):
     """Subclass to avoid pushing control commands to the stack.
     """
+    def __init__(self, *args, **kwargs):
+        super(CommandStackCommand, self).__init__(*args, **kwargs)
+        stack = [a for a in self.arguments if a.name == 'stack'][0]
+        stack.default = False
+
     def _set_state(self, state):
         try:
             self.plugin.set_state(state)
@@ -76,7 +81,8 @@ class CaptureCommand (CommandStackCommand):
                 return
             assert isinstance(msg, CommandMessage), type(msg)
             cmd = hooke.command_by_name[msg.command]
-            if isinstance(cmd, CommandStackCommand):
+            if (msg.explicit_user_call == False
+                or isinstance(cmd, CommandStackCommand)):
                 if isinstance(cmd, StopCaptureCommand):
                     outqueue = Queue()  # Grab StopCaptureCommand's completion.
                 cmd.run(hooke, inqueue, outqueue, **msg.arguments)
@@ -102,7 +108,7 @@ class CommandStackPlugin (Builtin):
             StartCaptureCommand(self), StopCaptureCommand(self),
            ReStartCaptureCommand(self),
             PopCommand(self), GetCommand(self), GetStateCommand(self),
-           SaveCommand(self), LoadCommand(self),
+           SaveCommand(self), LoadCommand(self), ExecuteCommand(self),
            ]
         self._settings = [
             Setting(section=self.setting_section, help=self.__doc__),
@@ -222,10 +228,10 @@ input command stack.  If the command stack does not have an input file
             help=self.__doc__, plugin=plugin)
 
     def _run(self, hooke, inqueue, outqueue, params):
-        params = self.__setup_params(hooke, params)
+        params = self._setup_params(hooke, params)
         self.plugin.command_stack.save(params['output'])
 
-    def __setup_params(self, hooke, params):
+    def _setup_params(self, hooke, params):
         if params['output'] == None and self.plugin.command_stack.path == None:
             params['output'] = 'default'
         if params['output'] != None:
@@ -250,14 +256,41 @@ File name for the input command stack.
             help=self.__doc__, plugin=plugin)
 
     def _run(self, hooke, inqueue, outqueue, params):
-        params = self.__setup_params(hooke, params)
+        params = self._setup_params(hooke, params)
         self.plugin.command_stack.clear()
         self.plugin.command_stack.load(params['input'])
 
-    def __setup_params(self, hooke, params):
+    def _setup_params(self, hooke, params):
         if params['input'] == None and self.plugin.command_stack.path == None:
             params['input'] = 'default'
         if params['input'] != None:
             params['input'] = os.path.join(
                 self.plugin.config['path'], params['input'])
         return params
+
+
+class ExecuteCommand (Command):
+    """Execute a :class:`~hooke.command_stack.CommandStack`.
+    """
+    def __init__(self, plugin):
+        super(ExecuteCommand, self).__init__(
+            name='execute command stack',
+            arguments=[
+                Argument(name='commands', type='command stack',
+                         help="""
+Command stack to apply to each curve.  Defaults to the plugin's
+current stack.
+""".strip()),
+                ],
+            help=self.__doc__, plugin=plugin)
+
+    def _run(self, hooke, inqueue, outqueue, params):
+        params = self._setup_params(hooke=hooke, params=params)
+        if len(params['commands']) == 0:
+            return
+        params['commands'].execute(hooke=hooke, stack=params['stack'])
+
+    def _setup_params(self, hooke, params):
+        if params['commands'] == None:
+            params['commands'] = self.plugin.command_stack
+        return params