playlist: Give the Factory a track-requested signal

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2023-04-28 11:23:59 -04:00
parent 6bbc423193
commit a687b564a9
2 changed files with 44 additions and 0 deletions

View File

@ -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."""

View File

@ -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)