Initial work on hooke.command_stack and hooke.playlist integration.
[hooke.git] / hooke / playlist.py
index 8444c9aac883f151e274a9810e7ef7ee4976326f..906cb061a7c089220cfb49e07b679dd880c12b8a 100644 (file)
@@ -45,7 +45,13 @@ class NoteIndexList (list):
         self._index = 0
 
     def __str__(self):
-        return '<%s %s>' % (self.__class__.__name__, self.name)
+        return str(self.__unicode__())
+
+    def __unicode__(self):
+        return u'<%s %s>' % (self.__class__.__name__, self.name)
+
+    def __repr__(self):
+        return self.__str__()
 
     def _setup_item(self, item):
         """Perform any required initialization before returning an item.
@@ -101,6 +107,7 @@ class NoteIndexList (list):
             c._index = 0
         return c
 
+
 class Playlist (NoteIndexList):
     """A :class:`NoteIndexList` of :class:`hooke.curve.Curve`\s.
 
@@ -111,10 +118,10 @@ class Playlist (NoteIndexList):
         self.drivers = drivers
         self._loaded = [] # List of loaded curves, see :meth:`._setup_item`.
         self._max_loaded = 100 # curves to hold in memory simultaneously.
+        self._curve_load_args = ()
+        self._curve_load_kwargs = {}
 
     def append_curve_by_path(self, path, info=None, identify=True):
-        if self.path != None:
-            path = os.path.join(os.path.dirname(self.path), path)
         path = os.path.normpath(path)
         c = curve.Curve(path, info=info)
         if identify == True:
@@ -122,6 +129,10 @@ class Playlist (NoteIndexList):
         self.append(c)
         return c
 
+    def set_curve_load_args(self, *args, **kwargs):
+        self._curve_load_args = args
+        self._curve_load_kwargs = kwargs
+
     def _setup_item(self, curve):
         if curve != None and curve not in self._loaded:
             if curve not in self:
@@ -129,17 +140,19 @@ class Playlist (NoteIndexList):
             if curve.driver == None:
                 c.identify(self.drivers)
             if curve.data == None:
-                curve.load()
+                curve.load(*self._curve_load_args, **self._curve_load_kwargs)
             self._loaded.append(curve)
             if len(self._loaded) > self._max_loaded:
                 oldest = self._loaded.pop(0)
                 oldest.unload()
 
+
 class FilePlaylist (Playlist):
     version = '0.1'
 
     def __init__(self, drivers, name=None, path=None):
         super(FilePlaylist, self).__init__(drivers, name)
+        self.path = None
         self.set_path(path)
         self._digest = None
         self._ignored_keys = [
@@ -154,6 +167,11 @@ class FilePlaylist (Playlist):
             if self.name == None:
                 self.name = os.path.basename(path)
 
+    def append_curve_by_path(self, path, *args, **kwargs):
+        if self.path != None:
+            path = os.path.join(os.path.dirname(self.path), path)
+        super(FilePlaylist, self).append_curve_by_path(path, *args, **kwargs)
+
     def is_saved(self):
         return self.digest() == self._digest
 
@@ -338,6 +356,6 @@ class FilePlaylist (Playlist):
         """Saves the playlist in a XML file.
         """
         self.set_path(path)
-        f = file(self.path, 'w')
-        f.write(self.flatten())
-        f.close()
+        with open(self.path, 'w') as f:
+            f.write(self.flatten())
+            self._digest = self.digest()