+"""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'])