WIP V3: move selected tracks works
This commit is contained in:
parent
223fb3bdec
commit
48b180e280
@ -924,93 +924,49 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
|
||||
self.signals.search_wikipedia_signal.emit(track_info.title)
|
||||
|
||||
def move_playlist_rows(
|
||||
self, session: scoped_session, playlistrows: Sequence[PlaylistRows]
|
||||
) -> None:
|
||||
def move_playlist_rows(self, row_numbers: List[int]) -> None:
|
||||
"""
|
||||
Move passed playlist rows to another playlist
|
||||
|
||||
Actions required:
|
||||
- exclude current/next tracks from being moved
|
||||
- identify destination playlist
|
||||
- update playlist for the rows in the database
|
||||
- remove them from the display
|
||||
- update destination playlist display if loaded
|
||||
"""
|
||||
|
||||
# Remove current/next rows from list
|
||||
plrs_to_move = [
|
||||
plr
|
||||
for plr in playlistrows
|
||||
if plr.id not in [track_sequence.now.plr_id, track_sequence.next.plr_id]
|
||||
]
|
||||
|
||||
rows_to_delete = [
|
||||
plr.plr_rownum for plr in plrs_to_move if plr.plr_rownum is not None
|
||||
]
|
||||
if not rows_to_delete:
|
||||
return
|
||||
|
||||
# Identify destination playlist
|
||||
playlists = []
|
||||
visible_tab = self.active_tab()
|
||||
source_playlist_id = visible_tab.playlist_id
|
||||
|
||||
for playlist in Playlists.get_all(session):
|
||||
if playlist.id == source_playlist_id:
|
||||
continue
|
||||
with Session() as session:
|
||||
for playlist in Playlists.get_all(session):
|
||||
if playlist.id == source_playlist_id:
|
||||
continue
|
||||
else:
|
||||
playlists.append(playlist)
|
||||
|
||||
dlg = SelectPlaylistDialog(self, playlists=playlists, session=session)
|
||||
dlg.exec()
|
||||
if not dlg.playlist:
|
||||
return
|
||||
to_playlist_id = dlg.playlist.id
|
||||
|
||||
# Get row number in destination playlist
|
||||
last_row = PlaylistRows.get_last_used_row(session, to_playlist_id)
|
||||
if last_row is not None:
|
||||
to_row = last_row + 1
|
||||
else:
|
||||
playlists.append(playlist)
|
||||
to_row = 0
|
||||
|
||||
dlg = SelectPlaylistDialog(self, playlists=playlists, session=session)
|
||||
dlg.exec()
|
||||
if not dlg.playlist:
|
||||
return
|
||||
destination_playlist_id = dlg.playlist.id
|
||||
|
||||
# Update destination playlist in the database
|
||||
last_row = PlaylistRows.get_last_used_row(session, destination_playlist_id)
|
||||
if last_row is not None:
|
||||
next_row = last_row + 1
|
||||
else:
|
||||
next_row = 0
|
||||
|
||||
for plr in plrs_to_move:
|
||||
plr.plr_rownum = next_row
|
||||
next_row += 1
|
||||
plr.playlist_id = destination_playlist_id
|
||||
# Reset played as it's not been played on this playlist
|
||||
plr.played = False
|
||||
session.commit()
|
||||
|
||||
# Remove moved rows from display and save visible playlist
|
||||
visible_tab.remove_rows(rows_to_delete)
|
||||
visible_tab.save_playlist(session)
|
||||
|
||||
# Disable sort undo
|
||||
self.sort_undo: List[int] = []
|
||||
|
||||
# Update destination playlist_tab if visible (if not visible, it
|
||||
# will be re-populated when it is opened)
|
||||
destination_playlist_tab = None
|
||||
for tab in range(self.tabPlaylist.count()):
|
||||
if self.tabPlaylist.widget(tab).playlist_id == dlg.playlist.id:
|
||||
destination_playlist_tab = self.tabPlaylist.widget(tab)
|
||||
break
|
||||
if destination_playlist_tab:
|
||||
destination_playlist_tab.populate_display(session, dlg.playlist.id)
|
||||
# Move rows
|
||||
self.active_model().move_rows_between_playlists(row_numbers, to_row, to_playlist_id)
|
||||
|
||||
def move_selected(self) -> None:
|
||||
"""
|
||||
Move selected rows to another playlist
|
||||
"""
|
||||
|
||||
with Session() as session:
|
||||
selected_plrs = self.active_tab().get_selected_playlistrows(session)
|
||||
if not selected_plrs:
|
||||
return
|
||||
selected_rows = self.active_tab().get_selected_rows()
|
||||
if not selected_rows:
|
||||
return
|
||||
|
||||
self.move_playlist_rows(session, selected_plrs)
|
||||
self.move_playlist_rows(selected_rows)
|
||||
|
||||
def move_unplayed(self) -> None:
|
||||
"""
|
||||
|
||||
@ -422,6 +422,8 @@ class PlaylistModel(QAbstractTableModel):
|
||||
|
||||
if playlist_id != self.playlist_id:
|
||||
return
|
||||
with Session() as session:
|
||||
self.refresh_data(session)
|
||||
super().endResetModel()
|
||||
|
||||
def get_duplicate_rows(self) -> List[int]:
|
||||
@ -809,6 +811,10 @@ class PlaylistModel(QAbstractTableModel):
|
||||
# the highest rows first so the lower row numbers are unchanged
|
||||
row_groups = self._reversed_contiguous_row_groups(from_rows)
|
||||
next_to_row = to_row_number
|
||||
|
||||
# Prepare destination playlist for a reset
|
||||
self.signals.begin_reset_model_signal.emit(to_playlist_id)
|
||||
|
||||
with Session() as session:
|
||||
# Make room in destination playlist
|
||||
max_destination_row_number = PlaylistRows.get_last_used_row(
|
||||
@ -822,8 +828,6 @@ class PlaylistModel(QAbstractTableModel):
|
||||
session, to_playlist_id, to_row_number, len(from_rows)
|
||||
)
|
||||
|
||||
# Prepare destination playlist for a reset
|
||||
self.signals.begin_reset_model_signal.emit(to_playlist_id)
|
||||
for row_group in row_groups:
|
||||
super().beginRemoveRows(QModelIndex(), min(row_group), max(row_group))
|
||||
for plr in PlaylistRows.plrids_to_plrs(
|
||||
@ -831,17 +835,21 @@ class PlaylistModel(QAbstractTableModel):
|
||||
self.playlist_id,
|
||||
[self.playlist_rows[a].plrid for a in row_group],
|
||||
):
|
||||
if plr.id == track_sequence.now.plr_id:
|
||||
# Don't move current track
|
||||
continue
|
||||
plr.playlist_id = to_playlist_id
|
||||
plr.plr_rownum = next_to_row
|
||||
next_to_row += 1
|
||||
self.refresh_data(session)
|
||||
super().endRemoveRows()
|
||||
self.signals.end_reset_model_signal.emit(to_playlist_id)
|
||||
# We need to remove gaps in row numbers after tracks have
|
||||
# moved.
|
||||
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
|
||||
self.refresh_data(session)
|
||||
|
||||
# Reset of model must come after session has been closed
|
||||
self.signals.end_reset_model_signal.emit(to_playlist_id)
|
||||
self.update_track_times()
|
||||
|
||||
def open_in_audacity(self, row_number: int) -> None:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user