X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=hooke%2Fplugin%2Fplaylist.py;h=f9d7f31ffa68b75db4ee4af9ec7943ff90d9ad4d;hb=2e895934d76c87076ce5a6cd6d7617e71c89f78a;hp=1439ba63d7e0b6b4b46bca1591d68aa4069da820;hpb=df84350d950dfdad8f281e22ead8056c7167d0fb;p=hooke.git diff --git a/hooke/plugin/playlist.py b/hooke/plugin/playlist.py index 1439ba6..f9d7f31 100644 --- a/hooke/plugin/playlist.py +++ b/hooke/plugin/playlist.py @@ -1,4 +1,4 @@ -# Copyright (C) 2010 W. Trevor King +# Copyright (C) 2010-2011 W. Trevor King # # This file is part of Hooke. # @@ -26,8 +26,9 @@ import logging import os.path from ..command import Command, Argument, Failure -from ..playlist import FilePlaylist from ..curve import NotRecognized +from ..playlist import load +from ..util.itertools import reverse_enumerate from . import Builtin @@ -37,9 +38,9 @@ class PlaylistPlugin (Builtin): self._commands = [ NextCommand(self), PreviousCommand(self), JumpCommand(self), GetCommand(self), IndexCommand(self), CurveListCommand(self), - SaveCommand(self), LoadCommand(self), + NameCommand(self), SaveCommand(self), LoadCommand(self), AddCommand(self), AddGlobCommand(self), - RemoveCommand(self), ApplyCommandStack(self), + RemoveCommand(self), ApplyCommand(self), FilterCommand(self), ] @@ -209,6 +210,26 @@ class CurveListCommand (PlaylistCommand): outqueue.put(list(self._playlist(hooke, params))) +class NameCommand (PlaylistCommand): + """(Re)name a playlist. + """ + def __init__(self, plugin): + super(NameCommand, self).__init__( + name='name playlist', + arguments=[ + Argument(name='name', type='string', optional=False, + help=""" +Name for the playlist. +""".strip()), + ], + help=self.__doc__, plugin=plugin) + + def _run(self, hooke, inqueue, outqueue, params): + p = self._playlist(hooke, params) + p.name = params['name'] + outqueue.put(p) + + class SaveCommand (PlaylistCommand): """Save a playlist. """ @@ -249,8 +270,7 @@ Drivers for loading curves. help=self.__doc__, plugin=plugin) def _run(self, hooke, inqueue, outqueue, params): - p = FilePlaylist(drivers=params['drivers'], path=params['input']) - p.load(hooke=hooke) + p = load(path=params['input'], drivers=params['drivers'], hooke=hooke) self._set_playlist(hooke, params, p) outqueue.put(p) @@ -329,19 +349,20 @@ Index of target curve. self._playlist(hooke, params).jump(params.index()) -class ApplyCommandStack (PlaylistCommand): +class ApplyCommand (PlaylistCommand): """Apply a :class:`~hooke.command_stack.CommandStack` to each curve in a playlist. TODO: discuss `evaluate`. """ def __init__(self, plugin): - super(ApplyCommandStack, self).__init__( - name='apply command stack', + super(ApplyCommand, self).__init__( + name='apply command stack to playlist', arguments=[ - Argument(name='commands', type='command stack', optional=False, + Argument(name='commands', type='command stack', help=""" -Command stack to apply to each curve. +Command stack to apply to each curve. Defaults to the `command_stack` +plugin's current stack. """.strip()), Argument(name='evaluate', type='bool', default=False, help=""" @@ -351,18 +372,27 @@ Evaluate the applied command stack immediately. help=self.__doc__, plugin=plugin) def _run(self, hooke, inqueue, outqueue, params): - if len(params['commands']) == 0: - return + params = self._setup_params(hooke=hooke, params=params) p = self._playlist(hooke, params) if params['evaluate'] == True: + exec_cmd = hooke.command_by_name['execute command stack'] for curve in p.items(): - for command in params['commands']: - curve.command_stack.execute_command(hooke, command) - curve.command_stack.append(command) + hooke.run_command(exec_cmd.name, + {'commands':params['commands'], + 'stack':True}) else: for curve in p: - curve.command_stack.extend(params['commands']) - curve.unload() # force command stack execution on next access. + for command in params['commands']: + curve.command_stack.append(command) + curve.set_hooke(hooke) + p.unload(curve) + + def _setup_params(self, hooke, params): + if params['commands'] == None: + cstack_plugin = [p for p in hooke.plugins + if p.name == 'command_stack'][0] + params['commands'] = cstack_plugin.command_stack + return params class FilterCommand (PlaylistAddingCommand, PlaylistCommand): @@ -382,9 +412,10 @@ class FilterCommand (PlaylistAddingCommand, PlaylistCommand): method of their subclass. See, for example, :meth:`NoteFilterCommand.filter`. """ - def __init__(self, plugin, name='filter playlist'): + def __init__(self, plugin, name='filter playlist', load_curves=True): super(FilterCommand, self).__init__( name=name, help=self.__doc__, plugin=plugin) + self._load_curves = load_curves if not hasattr(self, 'filter'): self.arguments.append( Argument(name='filter', type='function', optional=False, @@ -398,10 +429,10 @@ Function returning `True` for "good" curves. filter_fn = params['filter'] else: filter_fn = self.filter - p = self._playlist(hooke, params).filter(filter_fn, + p = self._playlist(hooke, params).filter( + filter_fn, load_curves=self._load_curves, hooke=hooke, inqueue=inqueue, outqueue=outqueue, params=params) - p.name = params['name'] + self._set_playlist(hooke, params, p) if hasattr(p, 'path') and p.path != None: p.set_path(os.path.join(os.path.dirname(p.path), p.name)) - self._set_playlist(hooke, params, p) outqueue.put(p)