diff --git a/emmental/playlist/__init__.py b/emmental/playlist/__init__.py index 42e7583..a68db00 100644 --- a/emmental/playlist/__init__.py +++ b/emmental/playlist/__init__.py @@ -2,6 +2,7 @@ """An object for managing the visible and active playlists.""" from gi.repository import GObject from . import playlist +from . import previous from .. import db @@ -15,6 +16,7 @@ class Factory(GObject.GObject): db_visible = GObject.Property(type=db.playlist.Playlist) active_playlist = GObject.Property(type=playlist.Playlist) + previous_playlist = GObject.Property(type=previous.Previous) visible_playlist = GObject.Property(type=playlist.Playlist) def __init__(self, sql: db.Connection): @@ -24,7 +26,8 @@ class Factory(GObject.GObject): self.connect("notify", self.__notify_db_playlists) def __get_playlists(self) -> list[playlist.Playlist]: - plists = [self.active_playlist, self.visible_playlist] + plists = [self.active_playlist, self.previous_playlist, + self.visible_playlist] return [p for p in plists if p is not None] def __search_playlists(self, db_plist: db.playlist.Playlist) \ @@ -33,6 +36,12 @@ class Factory(GObject.GObject): if plist.playlist == db_plist: return plist + def __make_playlist(self, + db_plist: db.playlist.Playlist) -> playlist.Playlist: + if db_plist == self.sql.playlists.previous: + return previous.Previous(self.sql, db_plist) + return playlist.Playlist(self.sql, db_plist) + def __run_factory(self, label: str) -> None: db_plist = self.get_property(f"db-{label}") plist = self.get_property(f"{label}-playlist") @@ -46,7 +55,7 @@ class Factory(GObject.GObject): new = None elif plist is None or self.__get_playlists().count(plist) > 1: if (new := self.__search_playlists(db_plist)) is None: - new = playlist.Playlist(self.sql, db_plist) + new = self.__make_playlist(db_plist) elif (new := self.__search_playlists(db_plist)) is None: plist.playlist = db_plist return @@ -62,9 +71,7 @@ class Factory(GObject.GObject): self.notify("active-loop") self.notify("active-shuffle") case "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) + self.__run_factory("previous") case "db-visible": self.__run_factory("visible") diff --git a/tests/playlist/test_factory.py b/tests/playlist/test_factory.py index 66b5b95..9754c00 100644 --- a/tests/playlist/test_factory.py +++ b/tests/playlist/test_factory.py @@ -145,6 +145,22 @@ class TestFactory(tests.util.TestCase): self.assertRegex(mock_stdout.getvalue(), "factory: previous playlist is: ") + def test_previous_playlist(self, mock_stdout: io.StringIO): + """Test creating a Playlist when setting the db_previous property.""" + self.assertIsNone(self.factory.previous_playlist) + + self.factory.db_previous = self.sql.playlists.previous + self.assertIsInstance(self.factory.previous_playlist, + emmental.playlist.previous.Previous) + self.assertEqual(self.factory.previous_playlist.sql, self.sql) + self.assertEqual(self.factory.previous_playlist.playlist, + self.sql.playlists.previous) + + previous = self.factory.previous_playlist + self.factory.db_previous = None + self.assertIsNone(self.factory.previous_playlist) + self.assertIsNone(previous.playlist) + def test_visible(self, mock_stdout: io.StringIO): """Test the visible playlist property.""" self.assertIsNone(self.factory.db_visible) @@ -205,3 +221,14 @@ class TestFactory(tests.util.TestCase): self.factory.db_visible = None self.assertEqual(visible.playlist, self.user_plist) self.assertIsNone(self.factory.visible_playlist) + + def test_visible_previous_playlist(self, mock_stdout: io.StringIO): + """Test setting the visible playlist to the previous playlist.""" + self.factory.db_previous = self.sql.playlists.previous + self.factory.db_visible = self.sql.playlists.previous + self.assertEqual(id(self.factory.visible_playlist), + id(self.factory.previous_playlist)) + + self.factory.db_visible = self.user_plist + self.assertNotEqual(id(self.factory.visible_playlist), + id(self.factory.previous_playlist))