WIP V3: copy and paste rows to same or other playlist works
This commit is contained in:
parent
551a574eac
commit
c626d91f26
@ -221,6 +221,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
self.active_tab = lambda: self.tabPlaylist.currentWidget()
|
self.active_tab = lambda: self.tabPlaylist.currentWidget()
|
||||||
self.active_model = lambda: self.tabPlaylist.currentWidget().model()
|
self.active_model = lambda: self.tabPlaylist.currentWidget().model()
|
||||||
|
self.move_source_rows: Optional[List[int]] = None
|
||||||
|
self.move_source_model: Optional[PlaylistModel] = None
|
||||||
|
|
||||||
self.load_last_playlists()
|
self.load_last_playlists()
|
||||||
if Config.CARTS_HIDE:
|
if Config.CARTS_HIDE:
|
||||||
@ -612,7 +614,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
# Save the selected PlaylistRows items ready for a later
|
# Save the selected PlaylistRows items ready for a later
|
||||||
# paste
|
# paste
|
||||||
self.selected_rows = self.active_tab().get_selected_rows()
|
self.move_source_rows = self.active_tab().get_selected_rows()
|
||||||
|
self.move_source_model = self.active_model()
|
||||||
|
|
||||||
def debug(self):
|
def debug(self):
|
||||||
"""Invoke debugger"""
|
"""Invoke debugger"""
|
||||||
@ -955,7 +958,9 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
to_row = 0
|
to_row = 0
|
||||||
|
|
||||||
# Move rows
|
# Move rows
|
||||||
self.active_model().move_rows_between_playlists(row_numbers, to_row, to_playlist_id)
|
self.active_model().move_rows_between_playlists(
|
||||||
|
row_numbers, to_row, to_playlist_id
|
||||||
|
)
|
||||||
|
|
||||||
def move_selected(self) -> None:
|
def move_selected(self) -> None:
|
||||||
"""
|
"""
|
||||||
@ -1017,69 +1022,25 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
def paste_rows(self) -> None:
|
def paste_rows(self) -> None:
|
||||||
"""
|
"""
|
||||||
Paste earlier cut rows.
|
Paste earlier cut rows.
|
||||||
|
|
||||||
Process:
|
|
||||||
- ensure we have some cut rows
|
|
||||||
- if not pasting at end of playlist, move later rows down
|
|
||||||
- update plrs with correct playlist and row
|
|
||||||
- if moving between playlists: renumber source playlist rows
|
|
||||||
- else: check integrity of playlist rows
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not self.selected_plrs:
|
if self.move_source_rows is None or self.move_source_model is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
playlist_tab = self.active_tab()
|
to_playlist_id = self.active_tab().playlist_id
|
||||||
dst_playlist_id = playlist_tab.playlist_id
|
selected_rows = self.active_tab().get_selected_rows()
|
||||||
dst_row = self.active_tab().get_new_row_number()
|
if selected_rows:
|
||||||
|
destination_row = selected_rows[0]
|
||||||
|
else:
|
||||||
|
destination_row = self.active_model().rowCount()
|
||||||
|
|
||||||
with Session() as session:
|
if to_playlist_id == self.move_source_model.playlist_id:
|
||||||
# Create space in destination playlist
|
self.move_source_model.move_rows(self.move_source_rows, destination_row)
|
||||||
PlaylistRows.move_rows_down(
|
else:
|
||||||
session, dst_playlist_id, dst_row, len(self.selected_plrs)
|
self.move_source_model.move_rows_between_playlists(
|
||||||
|
self.move_source_rows, destination_row, to_playlist_id
|
||||||
)
|
)
|
||||||
session.commit()
|
self.move_source_rows = self.move_source_model = None
|
||||||
|
|
||||||
# Update plrs
|
|
||||||
row = dst_row
|
|
||||||
src_playlist_id = None
|
|
||||||
for plr in self.selected_plrs:
|
|
||||||
# Update moved rows
|
|
||||||
session.add(plr)
|
|
||||||
if not src_playlist_id:
|
|
||||||
src_playlist_id = plr.playlist_id
|
|
||||||
plr.playlist_id = dst_playlist_id
|
|
||||||
plr.plr_rownum = row
|
|
||||||
row += 1
|
|
||||||
|
|
||||||
if not src_playlist_id:
|
|
||||||
return
|
|
||||||
|
|
||||||
session.flush()
|
|
||||||
|
|
||||||
# Update display
|
|
||||||
self.active_tab().populate_display(
|
|
||||||
session, dst_playlist_id, scroll_to_top=False
|
|
||||||
)
|
|
||||||
|
|
||||||
# If source playlist is not destination playlist, fixup row
|
|
||||||
# numbers and update display
|
|
||||||
if src_playlist_id != dst_playlist_id:
|
|
||||||
PlaylistRows.fixup_rownumbers(session, src_playlist_id)
|
|
||||||
# Update source playlist_tab if visible (if not visible, it
|
|
||||||
# will be re-populated when it is opened)
|
|
||||||
source_playlist_tab = None
|
|
||||||
for tab in range(self.tabPlaylist.count()):
|
|
||||||
if self.tabPlaylist.widget(tab).playlist_id == src_playlist_id:
|
|
||||||
source_playlist_tab = self.tabPlaylist.widget(tab)
|
|
||||||
break
|
|
||||||
if source_playlist_tab:
|
|
||||||
source_playlist_tab.populate_display(
|
|
||||||
session, src_playlist_id, scroll_to_top=False
|
|
||||||
)
|
|
||||||
|
|
||||||
# Reset so rows can't be repasted
|
|
||||||
self.selected_plrs = None
|
|
||||||
|
|
||||||
def play_next(self, position: Optional[float] = None) -> None:
|
def play_next(self, position: Optional[float] = None) -> None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -366,7 +366,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
|
|
||||||
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
|
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
|
||||||
self.refresh_data(session)
|
self.refresh_data(session)
|
||||||
self.update_track_times()
|
self.row_order_changed(self.playlist_id)
|
||||||
|
|
||||||
def display_role(self, row: int, column: int, prd: PlaylistRowData) -> QVariant:
|
def display_role(self, row: int, column: int, prd: PlaylistRowData) -> QVariant:
|
||||||
"""
|
"""
|
||||||
@ -422,6 +422,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
with Session() as session:
|
with Session() as session:
|
||||||
self.refresh_data(session)
|
self.refresh_data(session)
|
||||||
super().endResetModel()
|
super().endResetModel()
|
||||||
|
self.row_order_changed(self.playlist_id)
|
||||||
|
|
||||||
def get_duplicate_rows(self) -> List[int]:
|
def get_duplicate_rows(self) -> List[int]:
|
||||||
"""
|
"""
|
||||||
@ -702,7 +703,8 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
self.refresh_data(session)
|
self.refresh_data(session)
|
||||||
super().endInsertRows()
|
super().endInsertRows()
|
||||||
|
|
||||||
self.invalidate_rows(list(range(plr.plr_rownum, len(self.playlist_rows))))
|
self.row_order_changed(self.playlist_id)
|
||||||
|
self.invalidate_rows(list(range(plr.plr_rownum, len(self.playlist_rows))))
|
||||||
|
|
||||||
return plr
|
return plr
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user