"""The `note` module provides :class:`NotePlugin` the associated :class:`hooke.command.Command`\s for annotating several Hooke classes (:mod:`hooke.playlist.Playlist`, :mod:`hooke.curve.Curve`, ...). """ from ..command import Command, Argument, Failure from ..playlist import FilePlaylist from ..plugin import Builtin from ..plugin.playlist import current_playlist_callback class NotePlugin (Builtin): def __init__(self): super(NotePlugin, self).__init__(name='note') def commands(self): return [AddNoteCommand(), ClearNoteCommand(), GetNoteCommand()] def dependencies(self): return [ 'playlist', # for current_playlist_callback ] class AddNoteCommand (Command): """Add a note to one of several Hooke objects. """ def __init__(self): super(AddNoteCommand, self).__init__( name='add note', arguments=[ Argument( name='target', type='object', callback=current_playlist_callback, help=""" Target object for the note. Defaults to the current playlist. """.strip()), Argument( name='note', type='string', optional=False, help=""" The note text. """.strip()), ], help=self.__doc__) def _run(self, hooke, inqueue, outqueue, params): params['target'].info['note'].append(params['note']) class ClearNoteCommand (Command): """Remove a note or notes from one of several Hooke objects. """ def __init__(self): super(ClearNoteCommand, self).__init__( name='clear note', arguments=[ Argument( name='target', type='object', callback=current_playlist_callback, help=""" Target object for the note. Defaults to the current playlist. """.strip()), Argument(name='count', type='int', default=-1, help=""" Number of notes to remove. Defaults to all notes. """.strip()), Argument(name='force', type='bool', default=False, help=""" Run without prompting the user. Use if you save often or don't make typing mistakes ;). """.strip()), ], help=self.__doc__) def _run(self, hooke, inqueue, outqueue, params): num_notes = len(params['target'].info['note']) if params['count'] == -1: num_notes_removed = num_notes else: num_notes_removed = min(num_notes, params['count']) if params['force'] == False and num_notes_removed > 0: msg = 'Remove %d notes?' % num_notes_removed default = False outqueue.put(BooleanRequest(msg, default)) result = inqueue.get() assert result.type == 'boolean' if result.value == False: return params['target'].info['note'] = \ params['target'].info['note'][:-num_notes_removed] class GetNoteCommand (Command): """Retrieve notes from one of several Hooke objects. """ def __init__(self): super(GetNoteCommand, self).__init__( name='get note', arguments=[ Argument( name='target', type='object', callback=current_playlist_callback, help=""" Target object for the note. Defaults to the current playlist. """.strip()), ], help=self.__doc__) def _run(self, hooke, inqueue, outqueue, params): outqueue.put(params['target'].info['note'])