Added hooke.plugin.playlist.AddGlobCommand.
authorW. Trevor King <wking@drexel.edu>
Sun, 9 May 2010 17:23:02 +0000 (13:23 -0400)
committerW. Trevor King <wking@drexel.edu>
Sun, 9 May 2010 17:23:02 +0000 (13:23 -0400)
This completes the rewrite of individual playlist handling.

Also:
  * Added hooke.plugin.playlist.FilePlaylist.set_path() to reduce
    duplicate code.

hooke/hooke.py
hooke/playlist.py
hooke/plugin/playlist.py

index 5e79d5737e7a73c3be47a1974d0289258b39f9da..88d1203c5eee34fab522c3fee357b2163f9bd9e0 100644 (file)
@@ -810,108 +810,6 @@ class Hooke (object):
 #        point.find_graph_coords(xvector, yvector)
 #        return point
 #
-##PLAYLIST INTERACTION COMMANDS
-##-------------------------------
-#    def do_genlist(self, folder=lh.hookeDir, filemask='*.*'):
-#        '''
-#        GENLIST
-#        Generates a file playlist.
-#        Note it doesn't *save* it: see savelist for this.
-#
-#        If [input files] is a directory, it will use all files in the directory for playlist.
-#        So:
-#        genlist dir
-#        genlist dir/
-#        genlist dir/*.*
-#
-#        are all equivalent syntax.
-#        ------------
-#        Syntax: genlist [input files]
-#        '''
-#        #args list is: input folder, file mask
-#        if os.path.isdir(folder):
-#            path = os.path.join(folder, filemask)
-#            #expanding correctly the input list with the glob module :)
-#            files = glob.glob(path)
-#            files.sort()
-#            #TODO: change cursor or progressbar (maybe in statusbar)
-#            #self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
-#            playlist = playlist.Playlist(self.drivers)
-#            for item in files:
-#                curve = playlist.append_curve_by_path(item)
-#                plot = copy.deepcopy(curve.plots[0])
-#                #add the 'raw' data
-#                curve.add_data('raw', plot.vectors[0][0], plot.vectors[0][1], color=plot.colors[0], style='plot')
-#                curve.add_data('raw', plot.vectors[1][0], plot.vectors[1][1], color=plot.colors[1], style='plot')
-#                #apply all active plotmanipulators and add the 'manipulated' data
-#                for plotmanipulator in self.plotmanipulators:
-#                    plot = plotmanipulator[1](plot, curve)
-#                    curve.set_data('manipulated', plot.vectors[0][0], plot.vectors[0][1], color=plot.colors[0], style='plot')
-#                    curve.add_data('manipulated', plot.vectors[1][0], plot.vectors[1][1], color=plot.colors[1], style='plot')
-#            if playlist.count > 0:
-#                playlist.name = self._GetUniquePlaylistName(os.path.basename(folder))
-#                playlist.reset()
-#                self.AddToPlaylists(playlist)
-#            self.AppendToOutput(playlist.get_status_string())
-#        else:
-#            self.AppendToOutput(''.join(['Cannot find folder ', folder]))
-#
-#    def do_loadlist(self, filename):
-#        '''
-#        LOADLIST
-#        Loads a file playlist
-#        -----------
-#        Syntax: loadlist [playlist file]
-#        '''
-#        #TODO: check for duplicate playlists, ask the user for a unique name
-#        #if self.playlist_name in self.playlists:
-#
-#        #add hkp extension if necessary
-#        if not filename.endswith('.hkp'):
-#            filename = ''.join([filename, '.hkp'])
-#        #prefix with 'hookeDir' if just a filename or a relative path
-#        filename = lh.get_file_path(filename)
-#        if os.path.isfile(filename):
-#            #TODO: change cursor
-#            #self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
-#            playlist_new = playlist.Playlist(self.drivers)
-#            playlist_new.load(filename)
-#            if playlist_new.count > 0:
-#                for curve in playlist_new.curves:
-#                    plot = copy.deepcopy(curve.plots[0])
-#                    for plotmanip in self.plotmanipulators:
-#                        #to_plot = plotmanip[1](to_plot, curve)
-#                        plot = plotmanip[1](plot, curve)
-#                        curve.set_data('manipulated', plot.vectors[0][0], plot.vectors[0][1], color=plot.colors[0], style='plot')
-#                        curve.add_data('manipulated', plot.vectors[1][0], plot.vectors[1][1], color=plot.colors[1], style='plot')
-#                self.AddToPlaylists(playlist_new)
-#            #else:
-#                ##TODO: display dialog
-#            self.AppendToOutput(playlist_new.get_status_string())
-#            #TODO: change cursor
-#            #self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
-#        else:
-#            #TODO: display dialog
-#            self.AppendToOutput(''.join['File ', filename, ' not found.\n'])
-#        pass
-#
-#    def do_savelist(self, filename):
-#        '''
-#        SAVELIST
-#        Saves the current file playlist on disk.
-#        ------------
-#        Syntax: savelist [filename]
-#        '''
-#
-#        #self.playlist_generics['pointer'] = self._GetActiveCurveIndex
-#        pointer = self._GetActiveCurveIndex()
-#        #autocomplete filename if not specified
-#        if not filename.endswith('.hkp'):
-#            filename = filename.join(['.hkp'])
-#
-#        playlist = self.GetActivePlaylist()
-#        playlist.set_XML()
-#        playlist.save(filename)
 #
 ##PLOT INTERACTION COMMANDS
 ##-------------------------------
index de58e9f57cac874962ff0dc1d2bca28e708b7bfe..35bf54781f8c1d887190fc672728e92b9ef89d43 100644 (file)
@@ -63,16 +63,21 @@ class Playlist (list):
             playlist._index = 0
         return playlist
 
+
 class FilePlaylist (Playlist):
     version = '0.1'
 
     def __init__(self, drivers, name=None, path=None):
-        if name == None and path != None:
-            name = os.path.basename(path)
         super(FilePlaylist, self).__init__(drivers, name)
-        self.path = path
+        self.set_path(path)
         self._digest = None
 
+    def set_path(self, path):
+        if not path.endswith('.hkp'):
+            path += '.hkp'
+        if name == None and path != None:
+            name = os.path.basename(path)
+
     def is_saved(self):
         return self.digest() == self._digest
 
@@ -215,16 +220,14 @@ class FilePlaylist (Playlist):
     def load(self, path=None):
         """Load a playlist from a file.
         """
-        if path != None:
-            self.path = path
-        if self.name == None:
-            self.name = os.path.basename(self.path)
-        doc = xml.dom.minidom.parse(path)
+        self.set_path(path)
+        doc = xml.dom.minidom.parse(self.path)
         return self._from_xml_doc(doc)
 
-    def save(self, path):
+    def save(self, path=None):
         """Saves the playlist in a XML file.
         """
-        f = file(path, 'w')
+        self.set_path(path)
+        f = file(self.path, 'w')
         f.write(self.flatten())
         f.close()
index 5b00260d677d3efbb958c2021b4f76901b636db1..422b679b9d6cf085de48e76c18f7b87f213295b6 100644 (file)
@@ -3,6 +3,8 @@
 classes.
 """
 
+import glob
+
 from ..playlist import FilePlaylist
 from ..plugin import Builtin, Command, Argument
 
@@ -14,7 +16,8 @@ class PlaylistPlugin (Builtin):
     def commands(self):
         return [NextCommand(), PreviousCommand(), JumpCommand(),
                 SaveCommand(), LoadCommand(),
-                AddCommand(), RemoveCommand(), FilterCommand()]
+                AddCommand(), AddGlobCommand(),
+                RemoveCommand(), FilterCommand()]
 
 class NextCommand (Command):
     """Move playlist to the next curve.
@@ -142,6 +145,36 @@ Additional information for the input :class:`hooke.curve.Curve`.
         params['playlist'].append_curve_by_path(params['input'],
                                                 params['info'])
 
+class AddGlobCommand (Command):
+    """Add curves to a playlist with file globbing.
+
+    Adding lots of files one at a time can be tedious.  With this
+    command you can use globs (`data/curves/*.dat`) to add curves
+    for all matching files at once.
+    """
+    def __init__(self):
+        super(AddCommand, self).__init__(
+            name='glob curves to playlist',
+            arguments=[
+                Argument(name='playlist', type='playlist', optional=False,
+                         help="""
+:class:``hooke.plugin.playlist.Playlist`` to act on.
+""".strip()),
+                Argument(name='input', type='glob', optional=False,
+                         help="""
+File name glob for the input :class:`hooke.curve.Curve`.
+""".strip()),
+                Argument(name='info', type='dict', optional=True,
+                         help="""
+Additional information for the input :class:`hooke.curve.Curve`.
+""".strip()),
+                ],
+            help=self.__doc__)
+
+    def _run(inqueue, outqueue, params):
+        for path in sorted(glob.glob(params['input'])):
+            params['playlist'].append_curve_by_path(path, params['info'])
+
 class RemoveCommand (Command):
     """Remove a curve from a playlist.
     """
@@ -165,6 +198,10 @@ Index of target curve.
 
 class FilterCommand (Command):
     """Create a subset playlist via a selection function.
+
+    Removing lots of curves one at a time can be tedious.  With this
+    command you can use a function `filter` to select the curves you
+    wish to keep.
     """
     def __init__(self):
         super(FilterCommand, self).__init__(
@@ -176,7 +213,7 @@ class FilterCommand (Command):
 """.strip()),
                 Argument(name='filter', type='function', optional=False,
                          help="""
-Function returning `True` for "good" curves.
+Function returning `True` for "good" curves.  `filter(curve) -> True/False`.
 """.strip()),
                 ],
             help=self.__doc__)