rind: Don't set node iterators based on path

Instead, use the node id and node cache to find playlists.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-04-23 10:46:17 -04:00
parent e4d96755e9
commit dcc2f7e6d0
2 changed files with 62 additions and 84 deletions

View File

@ -87,17 +87,15 @@ class NodeTreeModel(GObject.GObject, Gtk.TreeModel):
plist = self.iter_playlist(iter)
if plist == None or plist.next_child == None:
return (False, None)
res = self.playlist_iter(plist.next_child)
iter.user_data = res.user_data
iter.user_data2 = res.user_data2
iter.user_data3 = id(plist.next_child)
return (True, iter)
def do_iter_parent(self, child):
plist = self.iter_playlist(child)
if plist.parent == None or plist.parent == curds.playlist.Root:
return (False, None)
return (True, self.playlist_iter(plist.parent))
if plist != None and plist.parent != None:
if plist.parent != curds.playlist.Root:
return (True, self.playlist_iter(plist.parent))
return (False, None)
def is_visible(self, model, iter, data):
plist = self.iter_playlist(iter)
@ -106,11 +104,8 @@ class NodeTreeModel(GObject.GObject, Gtk.TreeModel):
return True
def iter_playlist(self, iter):
if iter and iter.user_data > 0:
path = Gtk.TreePath(iter.user_data - 1)
if iter.user_data2 > 0:
path.append_index(iter.user_data2 - 1)
return curds.playlist.Root.get_node(path)
if iter and iter.user_data3 > 0:
return curds.playlist.Root.lookup_byid(iter.user_data3)
return curds.playlist.Root
def on_playlist_changed(self, plist):
@ -143,10 +138,7 @@ class NodeTreeModel(GObject.GObject, Gtk.TreeModel):
def playlist_iter(self, plist):
if plist == None or plist.parent == None:
return None
path = plist.get_path()
iter = Gtk.TreeIter()
iter.user_data = path[0] + 1
iter.user_data2 = path[1] + 1 if len(path) >= 2 else 0
iter.user_data3 = id(plist)
return iter

View File

@ -57,33 +57,31 @@ class TestNodeTreeModel(unittest.TestCase):
self.assertEqual(self.model.get_column_type(2), GObject.GType(int))
def test_model_get_iter(self):
for i, node in enumerate(plist_root.children):
path = Gtk.TreePath(node.get_path())
iter = self.model.get_iter(path)
self.assertTreeIterEqual(iter, (i + 1, 0, id(node)))
path = Gtk.TreePath.new_from_indices([ plist_root.n_children() ])
self.assertRaises(ValueError, self.model.get_iter, path)
index = self.genre.node_index()
for i, node in enumerate(self.genre.children):
for node in plist_root.children:
path = Gtk.TreePath(node.get_path())
iter = self.model.get_iter(path)
self.assertTreeIterEqual(iter, (index + 1, i + 1, id(node)))
self.assertTreeIterEqual(iter, (0, 0, id(node)))
for node in self.genre.children:
path = Gtk.TreePath(node.get_path())
iter = self.model.get_iter(path)
self.assertTreeIterEqual(iter, (0, 0, id(node)))
def test_model_get_path(self):
iter = Gtk.TreeIter()
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
for node in plist_root.children:
iter.user_data3 = id(node)
path = self.model.get_path(iter)
self.assertEqual(path.get_indices(), [ i ])
self.assertEqual(path.get_indices(), node.get_path())
iter = self.model.playlist_iter(self.genre)
for i, node in enumerate(self.genre.children):
iter.user_data2 = i + 1
for node in self.genre.children:
iter.user_data3 = id(node)
path = self.model.get_path(iter)
self.assertEqual(path.get_indices(), [ iter.user_data - 1, i ])
self.assertEqual(path.get_indices(), node.get_path())
def test_model_get_value(self):
col = node.Treeview.get_column(1)
@ -92,7 +90,7 @@ class TestNodeTreeModel(unittest.TestCase):
for i, child in enumerate(plist_root.children):
text = str(child) if i != 0 else f"<b>{str(child)}</b>"
iter.user_data = i + 1
iter.user_data3 = id(child)
self.assertEqual(self.model.get_value(iter, 0), child.icon)
self.assertEqual(self.model.get_value(iter, 1), text)
if isinstance(child, curds.Playlist):
@ -102,60 +100,56 @@ class TestNodeTreeModel(unittest.TestCase):
def test_model_iter_children(self):
iter = self.model.iter_children(None)
self.assertTreeIterEqual(iter, (1, 0, id(plist_root.nth_child(0))))
self.assertTreeIterEqual(iter, (0, 0, id(plist_root.nth_child(0))))
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
for node in plist_root.children:
iter.user_data3 = id(node)
child = self.model.iter_children(iter)
if node not in [ self.artist, self.decade, self.genre ]:
self.assertIsNone(child)
iter.user_data = plist_root.n_children()
iter.user_data3 = 42
self.assertIsNone(self.model.iter_children(iter))
iter = self.model.playlist_iter(self.genre)
child = self.model.iter_children(iter)
self.assertTreeIterEqual(child, (iter.user_data, 1, id(self.genre.nth_child(0))))
self.assertTreeIterEqual(child, (0, 0, id(self.genre.nth_child(0))))
for i, node in enumerate(self.genre.children):
child.user_data2 = i + 1
for node in self.genre.children:
child.user_data3 = id(node)
self.assertIsNone(self.model.iter_children(child))
def test_model_iter_has_child(self):
iter = Gtk.TreeIter()
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
for node in plist_root.children:
iter.user_data3 = id(node)
expected = node in [ self.artist, self.decade, self.genre ]
self.assertEqual(self.model.iter_has_child(iter), expected)
iter.user_data = plist_root.n_children()
iter.user_data3 = 42
self.assertFalse(self.model.iter_has_child(iter))
iter = self.model.playlist_iter(self.genre)
for i, node in enumerate(self.genre.children):
iter.user_data2 = i + 1
for node in self.genre.children:
iter.user_data3 = id(node)
self.assertFalse(self.model.iter_has_child(iter))
iter.user_data2 = self.genre.n_children()
self.assertFalse(self.model.iter_has_child(iter))
def test_model_iter_n_children(self):
iter = Gtk.TreeIter()
self.assertEqual(self.model.iter_n_children(None), plist_root.n_children())
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
for node in plist_root.children:
iter.user_data3 = id(node)
self.assertEqual(self.model.iter_n_children(iter), node.n_children())
iter.user_data = plist_root.n_children()
iter.user_data3 = 42
self.assertEqual(self.model.iter_n_children(iter), 0)
iter = self.model.playlist_iter(self.genre)
for i in range(self.genre.n_children() + 1):
iter.user_data2 = i + 1
for node in self.genre.children:
iter.user_data3 = id(node)
self.assertEqual(self.model.iter_n_children(iter), 0)
def test_model_iter_nth_child(self):
for i, node in enumerate(plist_root.children):
iter = self.model.iter_nth_child(None, i)
self.assertTreeIterEqual(iter, (i + 1, 0, id(node)))
self.assertTreeIterEqual(iter, (0, 0, id(node)))
if node not in [self.artist, self.decade, self.genre]:
self.assertIsNone(self.model.iter_nth_child(iter, 0))
self.assertIsNone(self.model.iter_nth_child(None, plist_root.n_children()))
@ -163,35 +157,33 @@ class TestNodeTreeModel(unittest.TestCase):
iter = self.model.playlist_iter(self.genre)
for i, node in enumerate(self.genre.children):
child = self.model.iter_nth_child(iter, i)
self.assertTreeIterEqual(child, (iter.user_data, i + 1, id(node)))
self.assertTreeIterEqual(child, (0, 0, id(node)))
self.assertIsNone(self.model.iter_nth_child(iter, i + 1))
def test_model_iter_next(self):
iter = self.model.iter_children(None)
for i, node in enumerate(plist_root.children):
self.assertTreeIterEqual(iter, (i + 1, 0, id(node)))
for node in plist_root.children:
self.assertTreeIterEqual(iter, (0, 0, id(node)))
iter = self.model.iter_next(iter)
self.assertIsNone(iter)
iter = self.model.playlist_iter(self.genre)
child = self.model.iter_children(iter)
for i, node in enumerate(self.genre.children):
self.assertTreeIterEqual(child, (iter.user_data, i + 1, id(node)))
for node in self.genre.children:
self.assertTreeIterEqual(child, (0, 0, id(node)))
child = self.model.iter_next(child)
self.assertIsNone(child)
def test_model_iter_parent(self):
iter = self.model.iter_children(None)
for i, node in enumerate(plist_root.children):
iter = Gtk.TreeIter()
for node in enumerate(plist_root.children):
iter.user_data3 = id(node)
self.assertIsNone(self.model.iter_parent(iter))
iter = self.model.iter_next(iter)
iter = self.model.playlist_iter(self.genre)
iter = self.model.iter_children(iter)
for i, node in enumerate(self.genre.children):
for node in self.genre.children:
iter.user_data3 = id(node)
parent = self.model.iter_parent(iter)
self.assertTreeIterEqual(parent, (iter.user_data, 0, id(self.genre)))
iter = self.model.iter_next(iter)
self.assertTreeIterEqual(parent, (0, 0, id(self.genre)))
def test_model_iter_playlist(self):
iter = Gtk.TreeIter()
@ -199,41 +191,35 @@ class TestNodeTreeModel(unittest.TestCase):
self.assertEqual(self.model.iter_playlist(None), plist_root)
self.assertEqual(self.model.iter_playlist(iter), plist_root)
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
self.assertEqual(self.model.iter_playlist(iter), node)
iter.user_data = plist_root.n_children() + 1
iter.user_data3 = 42
self.assertIsNone(self.model.iter_playlist(iter))
iter.user_data2 = 1
for i, node in enumerate(plist_root.children):
iter.user_data = i + 1
self.assertEqual(self.model.iter_playlist(iter), node.nth_child(0))
for node in plist_root.children:
iter.user_data3 = id(node)
self.assertEqual(self.model.iter_playlist(iter), node)
iter = self.model.playlist_iter(self.genre)
for i in range(self.genre.n_children() + 1):
iter.user_data2 = i + 1
expected = self.genre.nth_child(i) if i < self.genre.n_children() else None
self.assertEqual(self.model.iter_playlist(iter), expected)
for node in self.genre.children:
iter.user_data3 = id(node)
self.assertEqual(self.model.iter_playlist(iter), node)
def test_model_playlist_iter(self):
self.assertIsNone(self.model.playlist_iter(None))
for i, node in enumerate(plist_root.children):
for node in plist_root.children:
iter = self.model.playlist_iter(node)
self.assertTreeIterEqual(iter, (i + 1, 0, id(node)))
self.assertTreeIterEqual(iter, (0, 0, id(node)))
iter = self.model.playlist_iter(self.genre)
for i, node in enumerate(self.genre.children):
for node in self.genre.children:
child = self.model.playlist_iter(node)
self.assertTreeIterEqual(child, (iter.user_data, i + 1, id(node)))
self.assertTreeIterEqual(child, (0, 0, id(node)))
def test_node_selection(self):
selection = node.Treeview.get_selection()
self.assertIsInstance(selection, Gtk.TreeSelection)
for i, child in enumerate(plist_root.children):
path = Gtk.TreePath(i)
for child in plist_root.children:
path = Gtk.TreePath(child.get_path())
selection.select_path(path)
if isinstance(child, curds.Playlist):
self.assertTrue( selection.path_is_selected(path))