WIP V3: better handle row order changing

This commit is contained in:
Keith Edmunds 2023-11-23 04:44:17 +00:00
parent 48b180e280
commit 80c363c316
3 changed files with 32 additions and 4 deletions

View File

@ -85,6 +85,7 @@ class MusicMusterSignals(QObject):
enable_escape_signal = pyqtSignal(bool) enable_escape_signal = pyqtSignal(bool)
end_reset_model_signal = pyqtSignal(int) end_reset_model_signal = pyqtSignal(int)
next_track_changed_signal = pyqtSignal() next_track_changed_signal = pyqtSignal()
row_order_changed_signal = pyqtSignal(int)
search_songfacts_signal = pyqtSignal(str) search_songfacts_signal = pyqtSignal(str)
search_wikipedia_signal = pyqtSignal(str) search_wikipedia_signal = pyqtSignal(str)
show_warning_signal = pyqtSignal(str, str) show_warning_signal = pyqtSignal(str, str)
@ -138,10 +139,10 @@ class PlaylistTrack:
Update with new plr information Update with new plr information
""" """
session.add(plr)
self.plr_rownum = plr.plr_rownum
if not plr.track: if not plr.track:
return return
session.add(plr)
track = plr.track track = plr.track
self.artist = track.artist self.artist = track.artist
@ -151,7 +152,6 @@ class PlaylistTrack:
self.path = track.path self.path = track.path
self.playlist_id = plr.playlist_id self.playlist_id = plr.playlist_id
self.plr_id = plr.id self.plr_id = plr.id
self.plr_rownum = plr.plr_rownum
self.silence_at = track.silence_at self.silence_at = track.silence_at
self.start_gap = track.start_gap self.start_gap = track.start_gap
self.start_time = None self.start_time = None

View File

@ -315,6 +315,7 @@ class Playlists(Base):
"""Mark playlist as loaded and used now""" """Mark playlist as loaded and used now"""
self.open = True self.open = True
self.last_used = datetime.now()
@staticmethod @staticmethod
def name_is_available(session: scoped_session, name: str) -> bool: def name_is_available(session: scoped_session, name: str) -> bool:

View File

@ -127,6 +127,7 @@ class PlaylistModel(QAbstractTableModel):
self.signals.add_track_to_playlist_signal.connect(self.add_track) self.signals.add_track_to_playlist_signal.connect(self.add_track)
self.signals.begin_reset_model_signal.connect(self.begin_reset_model) self.signals.begin_reset_model_signal.connect(self.begin_reset_model)
self.signals.end_reset_model_signal.connect(self.end_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 Session() as session: with Session() as session:
# Ensure row numbers in playlist are contiguous # Ensure row numbers in playlist are contiguous
@ -796,7 +797,7 @@ class PlaylistModel(QAbstractTableModel):
self.refresh_data(session) self.refresh_data(session)
# Update display # Update display
self.update_track_times() self.signals.row_order_changed_signal.emit(self.playlist_id)
self.invalidate_rows(list(row_map.keys())) self.invalidate_rows(list(row_map.keys()))
def move_rows_between_playlists( def move_rows_between_playlists(
@ -849,6 +850,8 @@ class PlaylistModel(QAbstractTableModel):
self.refresh_data(session) self.refresh_data(session)
# Reset of model must come after session has been closed # Reset of model must come after session has been closed
self.signals.row_order_changed_signal.emit(self.playlist_id)
self.signals.row_order_changed_signal.emit(to_playlist_id)
self.signals.end_reset_model_signal.emit(to_playlist_id) self.signals.end_reset_model_signal.emit(to_playlist_id)
self.update_track_times() self.update_track_times()
@ -960,6 +963,30 @@ class PlaylistModel(QAbstractTableModel):
return len(self.playlist_rows) return len(self.playlist_rows)
def row_order_changed(self, playlist_id: int) -> None:
"""
Signal handler for when row ordering has changed
"""
if playlist_id != self.playlist_id:
return
with Session() as session:
if track_sequence.next.plr_rownum:
next_plr = session.get(PlaylistRows, track_sequence.next.plr_rownum)
if next_plr:
track_sequence.next.plr_rownum = next_plr.plr_rownum
if track_sequence.now.plr_rownum:
now_plr = session.get(PlaylistRows, track_sequence.now.plr_rownum)
if now_plr:
track_sequence.now.plr_rownum = now_plr.plr_rownum
if track_sequence.previous.plr_rownum:
previous_plr = session.get(PlaylistRows, track_sequence.previous.plr_rownum)
if previous_plr:
track_sequence.previous.plr_rownum = previous_plr.plr_rownum
self.update_track_times()
def selection_is_sortable(self, row_numbers: List[int]) -> bool: def selection_is_sortable(self, row_numbers: List[int]) -> bool:
""" """
Return True if the selection is sortable. That means: Return True if the selection is sortable. That means: