Manage deleting rows better

Fix incorrect updating of track_sequence row numbers.
This commit is contained in:
Keith Edmunds 2024-06-18 19:45:12 +01:00
parent a4174e84ce
commit 6e4c386fe2
2 changed files with 15 additions and 31 deletions

View File

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

View File

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