playlist: Have the Factory create a visible Playlist

I either create or reuse an existing Playlist object when the
db-visible property changes to a new value.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2023-04-20 11:43:27 -04:00
parent f5ef144419
commit b0734a41d0
2 changed files with 46 additions and 1 deletions

View File

@ -1,6 +1,7 @@
# Copyright 2023 (c) Anna Schumaker. # Copyright 2023 (c) Anna Schumaker.
"""An object for managing the visible and active playlists.""" """An object for managing the visible and active playlists."""
from gi.repository import GObject from gi.repository import GObject
from . import playlist
from .. import db from .. import db
@ -13,15 +14,37 @@ class Factory(GObject.GObject):
db_previous = GObject.Property(type=db.playlist.Playlist) db_previous = GObject.Property(type=db.playlist.Playlist)
db_visible = GObject.Property(type=db.playlist.Playlist) db_visible = GObject.Property(type=db.playlist.Playlist)
visible_playlist = GObject.Property(type=playlist.Playlist)
def __init__(self, sql: db.Connection): def __init__(self, sql: db.Connection):
"""Initialize the Playlist Factory.""" """Initialize the Playlist Factory."""
super().__init__(sql=sql) super().__init__(sql=sql)
self.sql.bind_property("active-playlist", self, "db-active") self.sql.bind_property("active-playlist", self, "db-active")
self.connect("notify", self.__notify_db_playlists) self.connect("notify", self.__notify_db_playlists)
def __run_factory(self, label: str) -> None:
db_plist = self.get_property(f"db-{label}")
plist = self.get_property(f"{label}-playlist")
print(f"factory: {label} playlist is:",
"<None>" if db_plist is None else db_plist.name)
if db_plist is None:
plist.playlist = None
new = None
elif plist is None:
new = playlist.Playlist(self.sql, db_plist)
else:
plist.playlist = db_plist
return
self.set_property(f"{label}-playlist", new)
def __notify_db_playlists(self, factory: GObject.GObject, param) -> None: def __notify_db_playlists(self, factory: GObject.GObject, param) -> None:
match param.name: match param.name:
case "db-active" | "db-previous" | "db-visible": case "db-active" | "db-previous":
plist = self.get_property(param.name) plist = self.get_property(param.name)
name = "<None>" if plist is None else plist.name name = "<None>" if plist is None else plist.name
print(f"factory: {param.name[3:]} playlist is:", name) print(f"factory: {param.name[3:]} playlist is:", name)
case "db-visible":
self.__run_factory("visible")

View File

@ -61,3 +61,25 @@ class TestFactory(tests.util.TestCase):
self.factory.db_visible = None self.factory.db_visible = None
self.assertRegex(mock_stdout.getvalue(), self.assertRegex(mock_stdout.getvalue(),
"factory: visible playlist is: <None>") "factory: visible playlist is: <None>")
def test_visible_playlist(self, mock_stdout: io.StringIO):
"""Test creating a Playlist when setting the db_visible property."""
self.assertIsNone(self.factory.visible_playlist)
self.factory.db_visible = self.user_plist
self.assertIsInstance(self.factory.visible_playlist,
emmental.playlist.playlist.Playlist)
self.assertEqual(self.factory.visible_playlist.sql, self.sql)
self.assertEqual(self.factory.visible_playlist.playlist,
self.user_plist)
orig_id = id(self.factory.visible_playlist)
self.factory.db_visible = self.sql.playlists.collection
self.assertEqual(id(self.factory.visible_playlist), orig_id)
self.assertEqual(self.factory.visible_playlist.playlist,
self.sql.playlists.collection)
visible = self.factory.visible_playlist
self.factory.db_visible = None
self.assertIsNone(self.factory.visible_playlist)
self.assertIsNone(visible.playlist)