playlist: Create a PlaylistModel list model
This will be used to display the tracks in a playlist Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
281fda1933
commit
f8dbb71581
|
@ -5,6 +5,45 @@ from lib import bus
|
|||
from gi.repository import GObject, Gio
|
||||
import audio
|
||||
|
||||
class PlaylistModel(GObject.GObject, Gio.ListModel):
|
||||
def __init__(self):
|
||||
GObject.GObject.__init__(self)
|
||||
self.playlist = None
|
||||
self.tracks = [ ]
|
||||
|
||||
def do_get_item_type(self): return GObject.TYPE_PYOBJECT
|
||||
def do_get_n_items(self): return len(self.tracks)
|
||||
def do_get_item(self, n):
|
||||
return self.tracks[n] if n < len(self.tracks) else None
|
||||
|
||||
def get_playlist(self): return self.playlist
|
||||
def set_playlist(self, playlist):
|
||||
if self.playlist:
|
||||
self.playlist.disconnect_by_func(self.refreshed)
|
||||
self.playlist.disconnect_by_func(self.track_added)
|
||||
self.playlist.disconnect_by_func(self.track_removed)
|
||||
self.playlist = playlist
|
||||
self.tracks = self.playlist.get_tracks()
|
||||
self.playlist.connect("refreshed", self.refreshed)
|
||||
self.playlist.connect("track-added", self.track_added)
|
||||
self.playlist.connect("track-removed", self.track_removed)
|
||||
|
||||
def track_added(self, plist, track):
|
||||
index = plist.get_track_index(track)
|
||||
self.tracks.insert(index, track)
|
||||
self.emit("items-changed", index, 0, 1)
|
||||
|
||||
def track_removed(self, plist, track, adjusted_current):
|
||||
index = self.tracks.index(track)
|
||||
del self.tracks[index]
|
||||
self.emit("items-changed", index, 1, 0)
|
||||
|
||||
def refreshed(self, plist):
|
||||
rm = len(self.tracks)
|
||||
self.tracks = plist.get_tracks()
|
||||
self.emit("items-changed", 0, rm, len(self.tracks))
|
||||
|
||||
|
||||
class TagModel(GObject.GObject, Gio.ListModel):
|
||||
def __init__(self, tag=None):
|
||||
GObject.GObject.__init__(self)
|
||||
|
|
|
@ -1,12 +1,72 @@
|
|||
# Copyright 2021 (c) Anna Schumaker.
|
||||
import db
|
||||
import unittest
|
||||
from gi.repository import GObject, Gio
|
||||
from . import controls
|
||||
from . import model
|
||||
from . import runtime
|
||||
from lib import bus
|
||||
from lib import fake
|
||||
from lib import tag
|
||||
from gi.repository import GObject, Gio
|
||||
import unittest
|
||||
|
||||
|
||||
class TestPlaylistModel(unittest.TestCase):
|
||||
def items_changed(self, mod, pos, rm, add): self.changed = (pos, rm, add)
|
||||
def setUp(self): db.reset()
|
||||
|
||||
def test_init(self):
|
||||
plist = model.PlaylistModel()
|
||||
self.assertIsInstance(plist, Gio.ListModel)
|
||||
self.assertIsNone(plist.playlist)
|
||||
self.assertEqual(plist.tracks, [ ])
|
||||
|
||||
self.assertEqual(plist.get_item_type(), GObject.TYPE_PYOBJECT)
|
||||
self.assertEqual(plist.get_n_items(), 0)
|
||||
self.assertIsNone(plist.get_item(0))
|
||||
|
||||
def test_set_playlist(self):
|
||||
test1 = db.user.Table.find("Test Playlist 1")
|
||||
test2 = db.user.Table.find("Test Playlist 2")
|
||||
track = db.make_fake_track(1, 1, "Test Track 1", "/a/b/c/1.ogg")
|
||||
plist = model.PlaylistModel()
|
||||
|
||||
test1.add_track(track)
|
||||
plist.set_playlist(test1)
|
||||
self.assertEqual(plist.playlist, test1)
|
||||
self.assertEqual(plist.get_playlist(), test1)
|
||||
self.assertEqual(plist.tracks, [ track ])
|
||||
|
||||
plist.set_playlist(test2)
|
||||
self.assertEqual(plist.tracks, [ ])
|
||||
test1.add_track(db.make_fake_track(2, 2, "Test Track 2", "/a/b/c/2.ogg"))
|
||||
self.assertEqual(plist.tracks, [ ])
|
||||
|
||||
def test_add_remove(self):
|
||||
test = db.user.Table.find("Test Playlist")
|
||||
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
|
||||
plist = model.PlaylistModel()
|
||||
plist.set_playlist(test)
|
||||
plist.connect("items-changed", self.items_changed)
|
||||
|
||||
test.add_track(track)
|
||||
self.assertEqual(plist.get_n_items(), 1)
|
||||
self.assertEqual(plist.get_item(0), track)
|
||||
self.assertEqual(self.changed, (0, 0, 1))
|
||||
|
||||
test.remove_track(track)
|
||||
self.assertEqual(plist.get_n_items(), 0)
|
||||
self.assertEqual(self.changed, (0, 1, 0))
|
||||
|
||||
def test_refresh(self):
|
||||
test = db.user.Table.find("Test Playlist")
|
||||
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
|
||||
plist = model.PlaylistModel()
|
||||
|
||||
test.add_track(track)
|
||||
plist.set_playlist(test)
|
||||
plist.connect("items-changed", self.items_changed)
|
||||
test.refresh()
|
||||
self.assertEqual(self.changed, (0, 1, 1))
|
||||
|
||||
|
||||
class TestTagModel(unittest.TestCase):
|
||||
|
|
Loading…
Reference in New Issue