get prev/next playlist buttons working in the navbar
[hooke.git] / hooke / playlist.py
index ca38b4e923936c77ff57f807564613a75cae0979..8efac4770568a3a6923c83a138317349494ad7d8 100644 (file)
@@ -45,10 +45,17 @@ class NoteIndexList (list):
     def __str__(self):
         return '<%s %s>' % (self.__class__.__name__, self.name)
 
+    def _setup_item(self, item):
+        """Perform any required initialization before returning an item.
+        """
+        pass
+
     def current(self):
         if len(self) == 0:
             return None
-        return self[self._index]
+        item = self[self._index]
+        self._setup_item(item)
+        return item
 
     def jump(self, index):
         if len(self) == 0:
@@ -62,10 +69,11 @@ class NoteIndexList (list):
     def previous(self):
         self.jump(self._index - 1)
 
-    def filter(self, keeper_fn=lambda item:True):
+    def filter(self, keeper_fn=lambda item:True, *args, **kwargs):
         c = copy.deepcopy(self)
         for item in reversed(c):
-            if keeper_fn(item) != True:
+            c._setup_item(item)
+            if keeper_fn(item, *args, **kwargs) != True:
                 c.remove(item)
         try: # attempt to maintain the same current item
             c._index = c.index(self.current())
@@ -81,7 +89,7 @@ class Playlist (NoteIndexList):
     def __init__(self, drivers, name=None):
         super(Playlist, self).__init__(name=name)
         self.drivers = drivers
-        self._loaded = [] # List of loaded curves, see :meth:`._load`.
+        self._loaded = [] # List of loaded curves, see :meth:`._setup_item`.
         self._max_loaded = 100 # curves to hold in memory simultaneously.
 
     def append_curve_by_path(self, path, info=None, identify=True):
@@ -94,12 +102,7 @@ class Playlist (NoteIndexList):
         self.append(c)
         return c
 
-    def current(self):
-        curve = super(Playlist, self).current()
-        self._load(curve)
-        return curve
-
-    def _load(self, curve):
+    def _setup_item(self, curve):
         if curve != None and curve not in self._loaded:
             if curve not in self:
                 self.append(curve)
@@ -119,6 +122,9 @@ class FilePlaylist (Playlist):
         super(FilePlaylist, self).__init__(drivers, name)
         self.set_path(path)
         self._digest = None
+        self._ignored_keys = [
+            'experiment',  # class instance, not very exciting.
+            ]
 
     def set_path(self, path):
         if path != None:
@@ -149,7 +155,7 @@ class FilePlaylist (Playlist):
         >>> c.info['note'] = 'The second curve'
         >>> p.append(c)
         >>> p.digest()
-        "\xa1\x99\x8a\x99\xed\xad\x13'\xa7w\x12\x00\x07Z\xb3\xd0zN\xa2\xe1"
+        '\\\x14\x87\x88*q\xf8\xaa\xa7\x84f\x82\xa1S>\xfd3+\xd0o'
         """
         string = self.flatten()
         return hashlib.sha1(string).digest()
@@ -184,8 +190,8 @@ class FilePlaylist (Playlist):
         >>> print p.flatten() # doctest: +NORMALIZE_WHITESPACE +REPORT_UDIFF
         <?xml version="1.0" encoding="utf-8"?>
         <playlist index="0" note="An example playlist" version="0.1">
-            <curve note="The first curve" path="../curve/one"/>
-            <curve note="The second curve" path="../curve/two"/>
+            <curve note="The first curve" path="curve/one"/>
+            <curve note="The second curve" path="curve/two"/>
         </playlist>
         <BLANKLINE>
         >>> print p.flatten(absolute_paths=True) # doctest: +NORMALIZE_WHITESPACE +REPORT_UDIFF
@@ -211,9 +217,13 @@ class FilePlaylist (Playlist):
             if absolute_paths == False:
                 path = os.path.relpath(
                     path,
-                    os.path.abspath(os.path.expanduser(self.path)))
+                    os.path.dirname(
+                        os.path.abspath(
+                            os.path.expanduser(self.path))))
             curve_element.setAttribute('path', path)
             for key,value in curve.info.items():
+                if key in self._ignored_keys:
+                    continue
                 curve_element.setAttribute(key, str(value))
         string = doc.toprettyxml(encoding='utf-8')
         root.unlink() # break circular references for garbage collection