Add a `Delete` button to the GUI NavBar, and cleanup deletion callbacks.
[hooke.git] / hooke / ui / gui / panel / playlist.py
index e8c8f844e7c51f4d104efb1e62ff083e20e11a94..cf069e804fd5f9e701b64a1b5785e620cfc21518 100644 (file)
@@ -196,46 +196,39 @@ class Tree (wx.TreeCtrl):
         del(self._hit_id)
         name = self._name_for_id[_id]
         if self._is_curve(name):
-            self.delete_curve(playlist_name=name[0], name=name[1])
+            self._delete_curve(playlist_name=name[0], name=name[1])
         else:
-            self.delete_playlist(name)
+            self._delete_playlist(name)
 
-    def delete_playlist(self, name):
+    def _delete_playlist(self, name):
         """Delete a :class:`hooke.playlist.Playlist` by name.
 
-        Called by the :meth:`_on_delete` handler.
-
-        Removes the playlist and its curves from the tree, then calls
-        :meth:`_delete_playlist`.
+        Called by the :meth:`_on_delete` handler.  Calls the
+        approptiate interface callback.
         """
         _id = self._id_for_name[name]
-        self.Delete(_id)
         playlist = self._playlists[name]
-        self._delete_playlist(playlist)
         in_callback(self, playlist)
 
-    def _delete_playlist(self, playlist):
-        """Adjust name/id caches for the playlist and its curves.
+    def delete_playlist(self, playlist):
+        """Respond to playlist deletion.
 
         Called on *every* playlist deletion.
         """
         self._playlists.pop(playlist.name)
         _id = self._id_for_name.pop(playlist.name)
+        self.Delete(_id)
         del(self._name_for_id[_id])
         for curve in playlist:
             self._delete_curve(playlist, curve)
-        in_callback(self, playlist)
 
-    def delete_curve(self, playlist_name, name):
+    def _delete_curve(self, playlist_name, name):
         """Delete a :class:`hooke.curve.Curve` by name.
 
-        Called by the :meth:`_on_delete` handler.
-
-        Removes the curve from the tree, then calls
-        :meth:`_delete_curve`.
+        Called by the :meth:`_on_delete` handler.  Calls the
+        approptiate interface callback.
         """
         _id = self._id_for_name[(playlist_name, name)]
-        self.Delete(_id)
         playlist = self._playlists[playlist_name]
         curve = None
         for i,c in enumerate(playlist):
@@ -244,17 +237,16 @@ class Tree (wx.TreeCtrl):
                 break
         if curve is None:
             raise ValueError(name)
-        self._delete_curve(playlist=playlist, curve=curve)
         in_callback(self, playlist, curve)
 
-    def _delete_curve(self, playlist, curve):
-        """Adjust name/id caches.
+    def delete_curve(self, playlist_name, name):
+        """Respond to curve deletions.
 
-        Called on _every_ curve deletion.
+        Called on *every* curve deletion.
         """
-        _id = self._id_for_name.pop((playlist.name, curve.name))
+        _id = self._id_for_name.pop((playlist_name, name))
+        self.Delete(_id)
         del(self._name_for_id[_id])
-        in_callback(self, playlist=playlist, curve=curve)
 
     # Get selection
 
@@ -334,15 +326,11 @@ class Tree (wx.TreeCtrl):
         """Absorb changed `.index()`, etc.
         """
         self._playlists[playlist.name] = playlist
-        cnames = []
+        cnames = set()
         for curve in playlist:
             if (playlist.name, curve.name) not in self._id_for_name:
                 self._add_curve(playlist.name, curve)
-            cnames.append(curve.name)
-        dc = self._callbacks['delete_curve']
-        _dc = self._callbacks['_delete_curve']
-        self._callbacks['delete_curve'] = None
-        self._callbacks['_delete_curve'] = None
+            cnames.add(curve.name)
         for name in self._id_for_name.keys():
             if not self._is_curve(name):
                 continue
@@ -350,9 +338,7 @@ class Tree (wx.TreeCtrl):
             if pname != playlist.name:
                 continue
             if cname not in cnames:
-                self.delete_curve(playlist.name, cname)
-        self._callbacks['delete_curve'] = dc
-        self._callbacks['_delete_curve'] = _dc
+                self.delete_curve(playlist_name=pname, name=cname)
 
     def is_playlist_loaded(self, playlist):
         """Return `True` if `playlist` is loaded, `False` otherwise.