rind: Add library playlists to the playlist manager

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-03-17 11:15:04 -04:00
parent 9f690ae204
commit 57b642265c
3 changed files with 118 additions and 22 deletions

View File

@ -27,11 +27,13 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="expander_column">treeviewcolumn1</property>
<property name="enable_tree_lines">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="sizing">fixed</property>
<property name="fixed_width">50</property>
<property name="title" translatable="yes">column</property>

View File

@ -9,19 +9,26 @@ class ManagerModel(GObject.GObject, Gtk.TreeModel):
def __init__(self, *args, **kwargs):
GObject.GObject.__init__(self)
curds.Notify.notify_me("add-track", self.on_add_track)
curds.Notify.notify_me("new-library-playlist", self.on_new_library)
def do_get_column_type(self, col):
return str
def do_get_iter(self, path):
return self.do_iter_nth_child(None, path.get_indices()[0])
res = (False, None)
for i in path.get_indices():
res = self.do_iter_nth_child(res[1], i)
return res
def do_get_n_columns(self):
return 2
def do_get_path(self, iter):
if iter != None:
return Gtk.TreePath((iter.user_data - 1))
indices = [ iter.user_data - 1 ]
if iter.user_data2 > 0:
indices.append(iter.user_data2 - 1)
return Gtk.TreePath().new_from_indices(indices)
return None
def do_get_value(self, iter, column):
@ -32,22 +39,31 @@ class ManagerModel(GObject.GObject, Gtk.TreeModel):
return plist.icon
return str(plist)
def do_iter_children(self, parent):
return self.do_iter_nth_child(parent, 0)
def do_iter_has_child(self, iter):
return False
return self.iter_n_children(iter) > 0
def do_iter_n_children(self, iter):
if iter == None:
return len(toplevel)
return 0
if iter != None:
plist = self.iter_playlist(iter)
if plist == curds.PlaylistManager["Library"]:
return len(plist)
return 0
return len(toplevel)
def do_iter_nth_child(self, iter, n):
if n < len(toplevel):
iter = Gtk.TreeIter()
iter.user_data = n + 1
iter.user_data2 = 0
iter.user_data3 = 0
return (True, iter)
return (False, None)
if n >= self.iter_n_children(iter):
return (False, None)
ret = Gtk.TreeIter()
if iter == None:
ret.user_data = n + 1
elif iter.user_data2 == 0:
ret.user_data = iter.user_data
ret.user_data2 = n + 1
return (True, ret)
def do_iter_next(self, iter):
iter.user_data += 1
@ -55,19 +71,45 @@ class ManagerModel(GObject.GObject, Gtk.TreeModel):
return (False, None)
return (True, iter)
def do_iter_parent(self, child):
iter = Gtk.TreeIter()
iter.user_data = child.user_data
return (True, iter)
def find_playlist(self, plist):
if plist != None:
if isinstance(plist, curds.LibraryPlaylist):
iter = self.iter_nth_child(None, toplevel.index("Library"))
index = curds.PlaylistManager["Library"].index(plist)
return self.iter_nth_child(iter, index)
elif plist.name in toplevel:
return self.iter_nth_child(None, toplevel.index(plist.name))
return None
def iter_playlist(self, iter):
top = toplevel[iter.user_data - 1]
if top != None:
return curds.PlaylistManager[top]
item = toplevel[iter.user_data - 1]
if item != None:
plist = curds.PlaylistManager[item]
if iter.user_data2 > 0:
plist = plist[iter.user_data2 - 1]
return plist
return None
def on_add_track(self, plist, track):
if plist.name in toplevel:
iter = self.iter_nth_child(None, toplevel.index(plist.name))
path = self.get_path(iter)
self.row_changed(path, iter)
iter = self.find_playlist(plist)
if iter != None:
self.row_changed(self.get_path(iter), iter)
def on_new_library(self, plist):
iter = self.find_playlist(plist)
if iter != None:
self.row_inserted(self.get_path(iter), iter)
if len(curds.PlaylistManager["Library"]) == 1:
parent = self.iter_parent(iter)
self.row_has_child_toggled(self.get_path(parent), parent)
MgrModel = ManagerModel()
Treeview = gtk.Builder.get_object("manager_treeview")
Treeview.set_model(MgrModel)
Treeview.expand_all()

View File

@ -16,7 +16,13 @@ class TestManager(unittest.TestCase):
def setUp(self):
curds.tags.tag_map.clear()
curds.PlaylistManager["Collection"].list.clear()
curds.PlaylistManager["Library"].clear()
curds.Notify.notify_me("new-track", curds.PlaylistManager["Collection"].add)
if not curds.playlist.library.library_thread.is_alive():
curds.playlist.library.library_thread = curds.ThreadQueue()
def tearDown(self):
curds.playlist.library.library_thread.stop()
def test_init(self):
self.assertIsInstance(gtk.Builder.get_object("manager_treeview"), Gtk.TreeView)
@ -58,7 +64,7 @@ class TestManager(unittest.TestCase):
self.assertEqual(iter.user_data, i + 1)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
self.assertEqual(path.get_indices()[0], i)
self.assertEqual(path.get_indices(), [ i ])
self.assertEqual(model.iter_n_children(iter), 0)
self.assertEqual(model.iter_playlist(iter), toplevel_plist[i])
self.assertEqual(model.get_value(iter, 0), toplevel_icons[i])
@ -68,3 +74,49 @@ class TestManager(unittest.TestCase):
self.assertEqual(iter.user_data, 3)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
iter = model.find_playlist(plist_mgr["Collection"])
self.assertEqual(iter.user_data, 1)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
self.assertIsNone(model.find_playlist(None))
def test_model_library(self):
model = manager.ManagerModel()
iter = model.find_playlist(plist_mgr["Library"])
self.assertEqual(iter.user_data, 3)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
self.assertFalse(model.iter_has_child(iter))
self.assertEqual(model.iter_n_children(iter), 0)
plist = plist_mgr["Library"].add(test_album)
self.assertTrue(model.iter_has_child(iter))
self.assertEqual(model.iter_n_children(iter), 1)
child = model.iter_children(iter)
self.assertEqual(child.user_data, 3)
self.assertEqual(child.user_data2, 1)
self.assertEqual(child.user_data3, 0)
self.assertEqual(model.get_path(child).get_indices(), [ 2, 0 ])
child = model.find_playlist(plist)
path = model.get_path(child)
self.assertEqual(child.user_data, 3)
self.assertEqual(child.user_data2, 1)
self.assertEqual(child.user_data3, 0)
self.assertEqual(model.iter_playlist(child), plist)
self.assertEqual(path.get_indices(), [ 2, 0 ])
citer = model.get_iter(path)
self.assertEqual(citer.user_data, 3)
self.assertEqual(citer.user_data2, 1)
self.assertEqual(citer.user_data3, 0)
iter = model.iter_parent(child)
self.assertEqual(iter.user_data, 3)
self.assertEqual(iter.user_data2, 0)
self.assertEqual(iter.user_data3, 0)
curds.playlist.library.library_thread.join()
self.assertEqual(model.get_value(child, 0), "folder")
self.assertEqual(model.get_value(child, 1), f"{test_album}\n10 Tracks")