diff --git a/emmental/__init__.py b/emmental/__init__.py index 010129f..a3374eb 100644 --- a/emmental/__init__.py +++ b/emmental/__init__.py @@ -105,6 +105,10 @@ class Application(Adw.Application): self.__load_track(self.factory.previous_track(), rg_auto="track", restart=True) + def __track_requested(self, factory: playlist.Factory, track, + rg_auto: str, restarted: bool) -> None: + self.__load_track(track, rg_auto=rg_auto, restart=restarted) + def __tracks_table_loaded(self, track_table, param) -> None: if track_table.current_track is not None: self.player.file = track_table.current_track.path @@ -225,6 +229,7 @@ class Application(Adw.Application): self.factory, "db-previous") self.win.sidebar.bind_property("selected-playlist", self.factory, "db-visible") + self.factory.connect("track-requested", self.__track_requested) def connect_player(self) -> None: """Connect the audio.Player.""" diff --git a/emmental/tracklist/trackview.py b/emmental/tracklist/trackview.py index 7331569..2fe3431 100644 --- a/emmental/tracklist/trackview.py +++ b/emmental/tracklist/trackview.py @@ -55,6 +55,7 @@ class TrackView(Gtk.Frame): self._selection.bind_property("n-items", self, "n-tracks") self._selection.connect("items-changed", self.__runtime_changed) + self._columnview.connect("activate", self.__track_activated) self._columnview.add_css_class("emmental-track-list") self.set_child(self._scrollwin) @@ -71,6 +72,11 @@ class TrackView(Gtk.Frame): position: int, removed: int, added: int) -> None: self.runtime = sum(t.length for t in self._selection) + def __track_activated(self, columnview: Gtk.ColumnView, + position: int) -> None: + self.playlist.request_track(self._selection[position]) + self._selection.unselect_all() + @GObject.Property(type=Gio.ListModel) def columns(self) -> Gio.ListModel: """Get the ListModel for the columns.""" diff --git a/tests/tracklist/test_trackview.py b/tests/tracklist/test_trackview.py index 9353234..d1517da 100644 --- a/tests/tracklist/test_trackview.py +++ b/tests/tracklist/test_trackview.py @@ -1,6 +1,7 @@ # Copyright 2022 (c) Anna Schumaker. """Tests our Track ColumnView.""" import pathlib +import unittest.mock import emmental.tracklist.trackview import tests.util from gi.repository import Gtk @@ -61,6 +62,20 @@ class TestTrackView(tests.util.TestCase): self.assertTrue(self.trackview._columnview.has_css_class( "emmental-track-list")) + def test_track_activated(self): + """Test activating a row in the columnview.""" + requested = unittest.mock.Mock() + self.playlist.connect("track-requested", requested) + self.trackview.playlist = self.playlist + self.trackview._selection.set_model(self.playlist) + self.db_plist.add_track(self.track) + + with unittest.mock.patch.object(self.trackview._selection, + "unselect_all") as mock_unselect: + self.trackview._columnview.emit("activate", 0) + requested.assert_called_with(self.playlist, self.track) + mock_unselect.assert_called() + def test_playlist(self): """Test the playlist property.""" self.assertIsNone(self.trackview.playlist)