Copy/paste, insert track/header works
This commit is contained in:
parent
647e7d478a
commit
46f2b662f3
@ -759,7 +759,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
if ok:
|
if ok:
|
||||||
with Session() as session:
|
with Session() as session:
|
||||||
playlist_tab.insert_header(session, dlg.textValue())
|
playlist_tab.insert_header(session, dlg.textValue())
|
||||||
self.save_playlist(session)
|
playlist_tab.save_playlist(session)
|
||||||
|
|
||||||
def insert_track(self) -> None:
|
def insert_track(self) -> None:
|
||||||
"""Show dialog box to select and add track from database"""
|
"""Show dialog box to select and add track from database"""
|
||||||
|
|||||||
103
app/playlists.py
103
app/playlists.py
@ -595,45 +595,31 @@ class PlaylistTab(QTableWidget):
|
|||||||
to do the heavy lifing.
|
to do the heavy lifing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# PlaylistRows object requires a row number, but that number
|
row_number = self.get_new_row_number()
|
||||||
# can be reset by calling PlaylistRows.fixup_rownumbers() later,
|
|
||||||
# so just fudge a row number for now.
|
|
||||||
row_number = 0
|
|
||||||
plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
|
plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
|
||||||
self.insert_row(session, plr)
|
self.insert_row(session, plr, repaint)
|
||||||
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
|
self.save_playlist(session)
|
||||||
if repaint:
|
|
||||||
self.update_display(session, clear_selection=False)
|
|
||||||
|
|
||||||
def insert_row(self, session: Session, row_data: PlaylistRows,
|
def insert_row(self, session: Session, plr: PlaylistRows,
|
||||||
repaint: bool = True) -> None:
|
repaint: bool = True) -> None:
|
||||||
"""
|
"""
|
||||||
Insert a row into playlist tab.
|
Insert passed playlist row (plr) into playlist tab.
|
||||||
|
|
||||||
If playlist has a row selected, add new row above. Otherwise,
|
|
||||||
add to end of playlist.
|
|
||||||
|
|
||||||
Note: we ignore the row number in the PlaylistRows record. That is
|
|
||||||
used only to order the query that generates the records.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.selectionModel().hasSelection():
|
row = plr.row_number
|
||||||
row = self.currentRow()
|
|
||||||
else:
|
|
||||||
row = self.rowCount()
|
|
||||||
self.insertRow(row)
|
self.insertRow(row)
|
||||||
|
|
||||||
# Add row metadata to userdata column
|
# Add row metadata to userdata column
|
||||||
userdata_item = QTableWidgetItem()
|
userdata_item = QTableWidgetItem()
|
||||||
userdata_item.setData(self.ROW_FLAGS, 0)
|
userdata_item.setData(self.ROW_FLAGS, 0)
|
||||||
userdata_item.setData(self.PLAYLISTROW_ID, row_data.id)
|
userdata_item.setData(self.PLAYLISTROW_ID, plr.id)
|
||||||
userdata_item.setData(self.ROW_TRACK_ID, row_data.track_id)
|
userdata_item.setData(self.ROW_TRACK_ID, plr.track_id)
|
||||||
self.setItem(row, USERDATA, userdata_item)
|
self.setItem(row, USERDATA, userdata_item)
|
||||||
|
|
||||||
if row_data.track_id:
|
if plr.track_id:
|
||||||
# Add track details to items
|
# Add track details to items
|
||||||
try:
|
try:
|
||||||
start_gap = row_data.track.start_gap
|
start_gap = plr.track.start_gap
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return
|
||||||
start_gap_item = QTableWidgetItem(str(start_gap))
|
start_gap_item = QTableWidgetItem(str(start_gap))
|
||||||
@ -641,17 +627,17 @@ class PlaylistTab(QTableWidget):
|
|||||||
start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START))
|
start_gap_item.setBackground(QColor(Config.COLOUR_LONG_START))
|
||||||
self.setItem(row, START_GAP, start_gap_item)
|
self.setItem(row, START_GAP, start_gap_item)
|
||||||
|
|
||||||
title_item = QTableWidgetItem(row_data.track.title)
|
title_item = QTableWidgetItem(plr.track.title)
|
||||||
log.debug(f"KAE: insert_row:619, {title_item.text()=}")
|
log.debug(f"KAE: insert_row:619, {title_item.text()=}")
|
||||||
self.setItem(row, TITLE, title_item)
|
self.setItem(row, TITLE, title_item)
|
||||||
|
|
||||||
artist_item = QTableWidgetItem(row_data.track.artist)
|
artist_item = QTableWidgetItem(plr.track.artist)
|
||||||
self.setItem(row, ARTIST, artist_item)
|
self.setItem(row, ARTIST, artist_item)
|
||||||
|
|
||||||
duration_item = QTableWidgetItem(
|
duration_item = QTableWidgetItem(
|
||||||
ms_to_mmss(row_data.track.duration))
|
ms_to_mmss(plr.track.duration))
|
||||||
self.setItem(row, DURATION, duration_item)
|
self.setItem(row, DURATION, duration_item)
|
||||||
self._set_row_duration(row, row_data.track.duration)
|
self._set_row_duration(row, plr.track.duration)
|
||||||
|
|
||||||
start_item = QTableWidgetItem()
|
start_item = QTableWidgetItem()
|
||||||
self.setItem(row, START_TIME, start_item)
|
self.setItem(row, START_TIME, start_item)
|
||||||
@ -659,8 +645,8 @@ class PlaylistTab(QTableWidget):
|
|||||||
end_item = QTableWidgetItem()
|
end_item = QTableWidgetItem()
|
||||||
self.setItem(row, END_TIME, end_item)
|
self.setItem(row, END_TIME, end_item)
|
||||||
|
|
||||||
if row_data.track.bitrate:
|
if plr.track.bitrate:
|
||||||
bitrate = str(row_data.track.bitrate)
|
bitrate = str(plr.track.bitrate)
|
||||||
else:
|
else:
|
||||||
bitrate = ""
|
bitrate = ""
|
||||||
bitrate_item = QTableWidgetItem(bitrate)
|
bitrate_item = QTableWidgetItem(bitrate)
|
||||||
@ -668,23 +654,23 @@ class PlaylistTab(QTableWidget):
|
|||||||
|
|
||||||
# As we have track info, any notes should be contained in
|
# As we have track info, any notes should be contained in
|
||||||
# the notes column
|
# the notes column
|
||||||
notes_item = QTableWidgetItem(row_data.note)
|
notes_item = QTableWidgetItem(plr.note)
|
||||||
self.setItem(row, ROW_NOTES, notes_item)
|
self.setItem(row, ROW_NOTES, notes_item)
|
||||||
|
|
||||||
last_playtime = Playdates.last_played(session, row_data.track.id)
|
last_playtime = Playdates.last_played(session, plr.track.id)
|
||||||
last_played_str = get_relative_date(last_playtime)
|
last_played_str = get_relative_date(last_playtime)
|
||||||
last_played_item = QTableWidgetItem(last_played_str)
|
last_played_item = QTableWidgetItem(last_played_str)
|
||||||
self.setItem(row, LASTPLAYED, last_played_item)
|
self.setItem(row, LASTPLAYED, last_played_item)
|
||||||
|
|
||||||
# Mark track if file is unreadable
|
# Mark track if file is unreadable
|
||||||
if not file_is_readable(row_data.track.path):
|
if not file_is_readable(plr.track.path):
|
||||||
self._set_unreadable_row(row)
|
self._set_unreadable_row(row)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# This is a section header so it must have note text
|
# This is a section header so it must have note text
|
||||||
if row_data.note is None:
|
if plr.note is None:
|
||||||
log.debug(
|
log.debug(
|
||||||
f"insert_row({row_data=}) with no track_id and no note"
|
f"insert_row({plr=}) with no track_id and no note"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -698,17 +684,16 @@ class PlaylistTab(QTableWidget):
|
|||||||
continue
|
continue
|
||||||
self.setItem(row, i, QTableWidgetItem())
|
self.setItem(row, i, QTableWidgetItem())
|
||||||
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1)
|
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1)
|
||||||
notes_item = QTableWidgetItem(row_data.note)
|
notes_item = QTableWidgetItem(plr.note)
|
||||||
self.setItem(row, HEADER_NOTES_COLUMN, notes_item)
|
self.setItem(row, HEADER_NOTES_COLUMN, notes_item)
|
||||||
|
|
||||||
# Save (no) track_id
|
# Save (no) track_id
|
||||||
userdata_item.setData(self.ROW_TRACK_ID, 0)
|
userdata_item.setData(self.ROW_TRACK_ID, 0)
|
||||||
|
|
||||||
if repaint:
|
if repaint:
|
||||||
self.save_playlist(session)
|
|
||||||
self.update_display(session, clear_selection=False)
|
self.update_display(session, clear_selection=False)
|
||||||
|
|
||||||
def insert_track(self, session: Session, track: Optional[Tracks],
|
def insert_track(self, session: Session, track: Tracks,
|
||||||
note: str = None, repaint: bool = True) -> None:
|
note: str = None, repaint: bool = True) -> None:
|
||||||
"""
|
"""
|
||||||
Insert track into playlist tab.
|
Insert track into playlist tab.
|
||||||
@ -720,20 +705,30 @@ class PlaylistTab(QTableWidget):
|
|||||||
to do the heavy lifing.
|
to do the heavy lifing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# PlaylistRows object requires a row number, but that number
|
if not track and track.id:
|
||||||
# can be reset by calling PlaylistRows.fixup_rownumbers() later,
|
log.debug(
|
||||||
# so just fudge a row number for now.
|
f"insert_track({session=}, {track=}, {note=}, {repaint=}"
|
||||||
row_number = 0
|
" called with either no track or no track.id"
|
||||||
if track:
|
)
|
||||||
track_id = track.id
|
return
|
||||||
else:
|
|
||||||
track_id = None
|
row_number = self.get_new_row_number()
|
||||||
plr = PlaylistRows(session, self.playlist_id,
|
|
||||||
track_id, row_number, note)
|
# Check to see whether track is already in playlist
|
||||||
self.insert_row(session, plr)
|
existing_plr = PlaylistRows.get_track_plr(session, track.id,
|
||||||
PlaylistRows.fixup_rownumbers(session, self.playlist_id)
|
self.playlist_id)
|
||||||
if repaint:
|
if existing_plr and ask_yes_no("Duplicate row",
|
||||||
self.update_display(session, clear_selection=False)
|
"Track already in playlist. "
|
||||||
|
"Move to new location?"):
|
||||||
|
# Yes it is and we shoudl reuse it
|
||||||
|
return self._move_row(session, existing_plr, row_number)
|
||||||
|
|
||||||
|
# Build playlist_row object
|
||||||
|
plr = PlaylistRows(session, self.playlist_id, track.id,
|
||||||
|
row_number, note)
|
||||||
|
self.insert_row(session, plr, repaint)
|
||||||
|
# Let display update, then save playlist
|
||||||
|
QTimer.singleShot(0, lambda: self.save_playlist(session))
|
||||||
|
|
||||||
def play_started(self, session: Session) -> None:
|
def play_started(self, session: Session) -> None:
|
||||||
"""
|
"""
|
||||||
@ -796,8 +791,8 @@ class PlaylistTab(QTableWidget):
|
|||||||
|
|
||||||
# Add the rows
|
# Add the rows
|
||||||
playlist = session.get(Playlists, playlist_id)
|
playlist = session.get(Playlists, playlist_id)
|
||||||
for row in playlist.rows:
|
for plr in playlist.rows:
|
||||||
self.insert_row(session, row, repaint=False)
|
self.insert_row(session, plr, repaint=False)
|
||||||
|
|
||||||
# Scroll to top
|
# Scroll to top
|
||||||
if scroll_to_top:
|
if scroll_to_top:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user