From b0734a41d0d32d40516bda8f4ab76da50191a08c Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 20 Apr 2023 11:43:27 -0400 Subject: [PATCH] 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 --- emmental/playlist/__init__.py | 25 ++++++++++++++++++++++++- tests/playlist/test_factory.py | 22 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/emmental/playlist/__init__.py b/emmental/playlist/__init__.py index 11f7642..f45a6c0 100644 --- a/emmental/playlist/__init__.py +++ b/emmental/playlist/__init__.py @@ -1,6 +1,7 @@ # Copyright 2023 (c) Anna Schumaker. """An object for managing the visible and active playlists.""" from gi.repository import GObject +from . import playlist from .. import db @@ -13,15 +14,37 @@ class Factory(GObject.GObject): db_previous = 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): """Initialize the Playlist Factory.""" super().__init__(sql=sql) self.sql.bind_property("active-playlist", self, "db-active") 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:", + "" 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: match param.name: - case "db-active" | "db-previous" | "db-visible": + case "db-active" | "db-previous": plist = self.get_property(param.name) name = "" if plist is None else plist.name print(f"factory: {param.name[3:]} playlist is:", name) + case "db-visible": + self.__run_factory("visible") diff --git a/tests/playlist/test_factory.py b/tests/playlist/test_factory.py index 0b7e67d..b8d4a52 100644 --- a/tests/playlist/test_factory.py +++ b/tests/playlist/test_factory.py @@ -61,3 +61,25 @@ class TestFactory(tests.util.TestCase): self.factory.db_visible = None self.assertRegex(mock_stdout.getvalue(), "factory: visible playlist is: ") + + 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)