diff --git a/app/classes.py b/app/classes.py index b51575b..0db282d 100644 --- a/app/classes.py +++ b/app/classes.py @@ -218,6 +218,12 @@ class InsertTrack: note: str +@dataclass +class SelectedRows: + playlist_id: int + rows: list[int] + + @dataclass class TrackAndPlaylist: playlist_id: int @@ -233,25 +239,58 @@ class MusicMusterSignals(QObject): - https://stackoverflow.com/questions/62654525/emit-a-signal-from-another-class-to-main-class """ + # Used to en/disable escape as a shortcut key to "clear selection". + # We disable it when editing a field in the playlist because we use + # escape there to abandon an edit. enable_escape_signal = pyqtSignal(bool) + + # Signals that the next-cued track has changed. Used to update + # playlist headers. next_track_changed_signal = pyqtSignal() + + # Signals that the playlist_id passed should resize all rows. resize_rows_signal = pyqtSignal(int) + + # Signal to open browser at songfacts or wikipedia page matching + # passed string. search_songfacts_signal = pyqtSignal(str) search_wikipedia_signal = pyqtSignal(str) + + # Displays a warning dialog show_warning_signal = pyqtSignal(str, str) - signal_add_track_to_header = pyqtSignal(int) + + # Signal to add a track to a header row + signal_add_track_to_header = pyqtSignal(TrackAndPlaylist) + + # Signal to receving model that rows will be / have been inserter signal_begin_insert_rows = pyqtSignal(InsertRows) signal_end_insert_rows = pyqtSignal(int) + + # TBD signal_insert_track = pyqtSignal(InsertTrack) - signal_playlist_selected_rows = pyqtSignal(int, list) + + # Keep track of which rows are selected (between playlist and model) + signal_playlist_selected_rows = pyqtSignal(SelectedRows) + + # Signal to model that selected row is to be next row signal_set_next_row = pyqtSignal(int) + # signal_set_next_track takes a PlaylistRow as an argument. We can't # specify that here as it requires us to import PlaylistRow from # playlistrow.py, which itself imports MusicMusterSignals + + # TBD signal_set_next_track = pyqtSignal(object) + + # Emited when a track starts playing signal_track_started = pyqtSignal(TrackAndPlaylist) + + # Used by model to signal spanning of cells to playlist for headers span_cells_signal = pyqtSignal(int, int, int, int, int) + + # Dispay status message to user status_message_signal = pyqtSignal(str, int) + track_ended_signal = pyqtSignal() def __post_init__(self): diff --git a/app/musicmuster.py b/app/musicmuster.py index 5af05c3..61bbed4 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -1789,6 +1789,7 @@ class Window(QMainWindow): self.track_sequence.move_current_to_previous() # Tell playlist previous track has finished + # TODO: it should just catch track_ended_signal self.current.base_model.previous_track_ended() # Reset clocks diff --git a/app/playlistmodel.py b/app/playlistmodel.py index f7d4a56..d9b3524 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -36,6 +36,7 @@ from classes import ( InsertRows, InsertTrack, MusicMusterSignals, + SelectedRows, TrackAndPlaylist, ) from config import Config @@ -1230,16 +1231,16 @@ class PlaylistModel(QAbstractTableModel): return True # @log_call - def set_selected_rows(self, playlist_id: int, selected_row_numbers: list[int]) -> None: + def set_selected_rows(self, selected_rows: SelectedRows) -> None: """ Handle signal_playlist_selected_rows to keep track of which rows are selected in the view """ - if playlist_id != self.playlist_id: + if selected_rows.playlist_id != self.playlist_id: return - self.selected_rows = [self.playlist_rows[a] for a in selected_row_numbers] + self.selected_rows = [self.playlist_rows[a] for a in selected_rows.rows] # @log_call def set_next_row(self, playlist_id: int) -> None: @@ -1247,9 +1248,7 @@ class PlaylistModel(QAbstractTableModel): Handle signal_set_next_row """ - log.debug(f"{self}: set_next_row({playlist_id=})") if playlist_id != self.playlist_id: - # Not for us return if len(self.selected_rows) == 0: diff --git a/app/playlists.py b/app/playlists.py index 077acfd..0b5fe09 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -40,6 +40,7 @@ from classes import ( Col, MusicMusterSignals, PlaylistStyle, + SelectedRows, TrackAndPlaylist, TrackInfo ) @@ -471,7 +472,9 @@ class PlaylistTab(QTableView): selected_row_numbers = self.get_selected_rows() # Signal selected rows to model - self.signals.signal_playlist_selected_rows.emit(self.playlist_id, selected_row_numbers) + self.signals.signal_playlist_selected_rows.emit( + SelectedRows(self.playlist_id, selected_row_numbers) + ) # Put sum of selected tracks' duration in status bar # If no rows are selected, we have nothing to do diff --git a/app/utilities.py b/app/utilities.py index 5c8c72f..820cd3d 100755 --- a/app/utilities.py +++ b/app/utilities.py @@ -91,6 +91,6 @@ def update_bitrates() -> None: for track in ds.tracks_all(): try: t = get_tags(track.path) - ds.track_update(t) + ds.track_update(track.track_id, t._asdict()) except FileNotFoundError: continue