From a687b564a9f2fbcc74a5f78fb3eda2fb8df46c4d Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 28 Apr 2023 11:23:59 -0400 Subject: [PATCH] playlist: Give the Factory a track-requested signal Signed-off-by: Anna Schumaker --- emmental/playlist/__init__.py | 15 +++++++++++++++ tests/playlist/test_factory.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/emmental/playlist/__init__.py b/emmental/playlist/__init__.py index eeece53..e5875e9 100644 --- a/emmental/playlist/__init__.py +++ b/emmental/playlist/__init__.py @@ -56,6 +56,14 @@ class Factory(GObject.GObject): def __update_can_go_prev(self, *args) -> None: self.__update_can_go("previous", self.previous_playlist.can_go_next) + def __playlist_track_requested(self, playlist: playlist.Playlist, + track: db.tracks.Track) -> None: + album = isinstance(playlist.playlist, db.albums.Album) or \ + isinstance(playlist.playlist, db.media.Medium) + self.emit("track-requested", track, + "album" if album else "track", + playlist.playlist == self.sql.playlists.previous) + def __make_playlist(self, db_plist: db.playlist.Playlist) -> playlist.Playlist: if db_plist == self.sql.playlists.previous: @@ -65,6 +73,7 @@ class Factory(GObject.GObject): else: res = playlist.Playlist(self.sql, db_plist) res.connect("notify::can-go-next", self.__update_can_go_next) + res.connect("track-requested", self.__playlist_track_requested) return res def __free_playlist(self, plist: playlist.Playlist) -> None: @@ -72,6 +81,7 @@ class Factory(GObject.GObject): if isinstance(plist, previous.Previous): plist.disconnect_by_func(self.__update_can_go_prev) plist.disconnect_by_func(self.__update_can_go_next) + plist.disconnect_by_func(self.__playlist_track_requested) def __run_factory(self, label: str) -> None: db_plist = self.get_property(f"db-{label}") @@ -161,3 +171,8 @@ class Factory(GObject.GObject): if self.active_playlist.shuffle != newval: self.active_playlist.shuffle = newval self.notify("active-shuffle") + + @GObject.Signal(arg_types=(db.tracks.Track, str, bool)) + def track_requested(self, track: db.tracks.Track, + rg_auto: str, restarted: bool) -> None: + """Signal that a track has been requested by the user.""" diff --git a/tests/playlist/test_factory.py b/tests/playlist/test_factory.py index f7c5f3e..46ffb6f 100644 --- a/tests/playlist/test_factory.py +++ b/tests/playlist/test_factory.py @@ -360,3 +360,32 @@ class TestFactoryNextPreviousTrack(tests.util.TestCase): self.assertEqual(self.factory.previous_track(), self.tracks[1]) self.assertEqual(self.factory.previous_track(), self.tracks[0]) self.assertIsNone(self.factory.previous_track()) + + def test_track_requested(self, mock_stdout: io.StringIO): + """Test the track-requested signal.""" + requested = unittest.mock.Mock() + self.factory.connect("track-requested", requested) + + self.user_plist.add_track(self.tracks[0]) + self.factory.db_visible = self.user_plist + self.factory.visible_playlist.request_track(self.tracks[0]) + requested.assert_called_with(self.factory, self.tracks[0], + "track", False) + + self.album.add_track(self.tracks[0]) + self.factory.db_visible = self.album + self.factory.visible_playlist.request_track(self.tracks[0]) + requested.assert_called_with(self.factory, self.tracks[0], + "album", False) + + self.tracks[0].start() + self.factory.db_visible = self.sql.playlists.previous + self.factory.visible_playlist.request_track(self.tracks[0]) + requested.assert_called_with(self.factory, self.tracks[0], + "track", True) + + self.medium.add_track(self.tracks[0]) + self.factory.db_visible = self.medium + self.factory.visible_playlist.request_track(self.tracks[0]) + requested.assert_called_with(self.factory, self.tracks[0], + "album", False)