From 6e4c386fe2b645f524bd2cacc62b194ec1bd96d3 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Tue, 18 Jun 2024 19:45:12 +0100 Subject: [PATCH] Manage deleting rows better Fix incorrect updating of track_sequence row numbers. --- app/classes.py | 1 - app/playlistmodel.py | 45 +++++++++++++++----------------------------- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/app/classes.py b/app/classes.py index c98e92a..32f6728 100644 --- a/app/classes.py +++ b/app/classes.py @@ -42,7 +42,6 @@ class MusicMusterSignals(QObject): end_reset_model_signal = pyqtSignal(int) next_track_changed_signal = pyqtSignal() resize_rows_signal = pyqtSignal(int) - row_order_changed_signal = pyqtSignal(int) search_songfacts_signal = pyqtSignal(str) search_wikipedia_signal = pyqtSignal(str) show_warning_signal = pyqtSignal(str, str) diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 5a5e356..4db53b9 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -127,7 +127,6 @@ class PlaylistModel(QAbstractTableModel): self.signals.begin_reset_model_signal.connect(self.begin_reset_model) self.signals.end_reset_model_signal.connect(self.end_reset_model) - self.signals.row_order_changed_signal.connect(self.row_order_changed) with db.Session() as session: # Ensure row numbers in playlist are contiguous @@ -976,7 +975,6 @@ class PlaylistModel(QAbstractTableModel): # Reset of model must come after session has been closed self.reset_track_sequence_row_numbers() - self.signals.row_order_changed_signal.emit(to_playlist_id) self.signals.end_reset_model_signal.emit(to_playlist_id) self.update_track_times() @@ -1130,7 +1128,12 @@ class PlaylistModel(QAbstractTableModel): def reset_track_sequence_row_numbers(self) -> None: """ - Signal handler for when row ordering has changed + Signal handler for when row ordering has changed. + + Example: row 4 is marked as next. Row 2 is deleted. The PlaylistRows table will + be correctly updated with change of row number, but track_sequence.next will still + contain row_number==4. This function fixes up the track_sequence row numbers by + looking up the plr_id and retrieving the row number from the database. """ log.debug("reset_track_sequence_row_numbers()") @@ -1138,20 +1141,15 @@ class PlaylistModel(QAbstractTableModel): # Check the track_sequence next, current and previous plrs and # update the row number with db.Session() as session: - if track_sequence.next and track_sequence.next.row_number: - next_plr = session.get(PlaylistRows, track_sequence.next.row_number) - if next_plr: - track_sequence.next.row_number = next_plr.plr_rownum - if track_sequence.current and track_sequence.current.row_number: - now_plr = session.get(PlaylistRows, track_sequence.current.row_number) - if now_plr: - track_sequence.current.row_number = now_plr.plr_rownum - if track_sequence.previous and track_sequence.previous.row_number: - previous_plr = session.get( - PlaylistRows, track_sequence.previous.row_number - ) - if previous_plr: - track_sequence.previous.row_number = previous_plr.plr_rownum + for ts in [track_sequence.next, track_sequence.current, track_sequence.previous]: + if ts and ts.row_number: + plr = session.get(PlaylistRows, ts.plr_id) + if plr and plr.plr_rownum != ts.row_number: + log.error( + "reset_track_sequence_row_numbers: " + f"from {ts=} to {plr.plr_rownum=}" + ) + ts.row_number = plr.plr_rownum self.update_track_times() @@ -1191,19 +1189,6 @@ class PlaylistModel(QAbstractTableModel): return len(self.playlist_rows) - def row_order_changed(self, playlist_id: int) -> None: - """ - Signal handler for when row ordering has changed - """ - - log.debug(f"row_order_changed({playlist_id=}) {self.playlist_id=}") - - # Only action if this is for us - if playlist_id != self.playlist_id: - return - - self.reset_track_sequence_row_numbers() - def selection_is_sortable(self, row_numbers: List[int]) -> bool: """ Return True if the selection is sortable. That means: