Add unmark as next, played to context menu

Fixes #166
Fixex #138
This commit is contained in:
Keith Edmunds 2023-02-08 20:52:42 +00:00
parent a15f181008
commit 4b104798b8
2 changed files with 136 additions and 87 deletions

View File

@ -427,6 +427,13 @@ class Window(QMainWindow, Ui_MainWindow):
btn.setStyleSheet("background-color: " + colour + ";\n") btn.setStyleSheet("background-color: " + colour + ";\n")
btn.pgb.setValue(0) btn.pgb.setValue(0)
def clear_next(self) -> None:
"""
Clear next track
"""
self.next_track = PlaylistTrack()
def clear_selection(self) -> None: def clear_selection(self) -> None:
""" Clear selected row""" """ Clear selected row"""
@ -1183,7 +1190,7 @@ class Window(QMainWindow, Ui_MainWindow):
# stop_playing() above has called end_of_track_actions() # stop_playing() above has called end_of_track_actions()
# which will have populated self.previous_track # which will have populated self.previous_track
self.current_track = self.next_track self.current_track = self.next_track
self.next_track = PlaylistTrack() self.clear_next()
if not self.current_track.track_id: if not self.current_track.track_id:
log.debug("musicmuster.play_next(): no id for next track") log.debug("musicmuster.play_next(): no id for next track")
@ -1490,7 +1497,7 @@ class Window(QMainWindow, Ui_MainWindow):
QColor(Config.COLOUR_NORMAL_TAB)) QColor(Config.COLOUR_NORMAL_TAB))
# Discard now-incorrect next_track PlaylistTrack # Discard now-incorrect next_track PlaylistTrack
self.next_track = PlaylistTrack() self.clear_next()
self.next_track.set_plr(session, plr, playlist_tab) self.next_track.set_plr(session, plr, playlist_tab)
if self.next_track.playlist_tab: if self.next_track.playlist_tab:

View File

@ -265,111 +265,132 @@ class PlaylistTab(QTableWidget):
self.menu = QMenu(self) self.menu = QMenu(self)
item = self.itemAt(event.pos()) item = self.itemAt(event.pos())
if item is not None: if item is not None:
row_number = item.row() with Session() as session:
track_id = self._get_row_track_id(row_number) row_number = item.row()
track_row = track_id > 0 plr_id = self._get_playlistrow_id(row_number)
header_row = not track_row plr = session.get(PlaylistRows, plr_id)
if track_row: track_id = plr.track_id
current = ( track_row = track_id > 0
row_number == self._get_current_track_row_number() header_row = not track_row
) if track_row:
next_row = row_number == self._get_next_track_row_number() current = (
else: row_number == self._get_current_track_row_number()
current = next_row = False )
next_row = (
row_number == self._get_next_track_row_number())
else:
current = next_row = False
# Cut/paste # Mark unplayed / un-next
act_cut = self.menu.addAction( sep = False
"Mark for moving") if plr.played:
act_cut.triggered.connect( sep = True
lambda: self.musicmuster.cut_rows()) act_unplay = self.menu.addAction("Mark unplayed")
act_unplay.triggered.connect(
lambda: self._mark_unplayed(plr))
if next_row:
sep = True
act_unnext = self.menu.addAction(
"Unmark as next track")
act_unnext.triggered.connect(
lambda: self._mark_unnext(row_number))
if sep:
self.menu.addSeparator()
act_paste = self.menu.addAction( # Cut/paste
"Paste") act_cut = self.menu.addAction(
act_paste.setDisabled( "Mark for moving")
self.musicmuster.selected_plrs is None) act_cut.triggered.connect(
act_paste.triggered.connect( lambda: self.musicmuster.cut_rows())
lambda: self.musicmuster.paste_rows())
self.menu.addSeparator() act_paste = self.menu.addAction(
"Paste")
if track_row: act_paste.setDisabled(
# Info self.musicmuster.selected_plrs is None)
act_info = self.menu.addAction('Info') act_paste.triggered.connect(
act_info.triggered.connect( lambda: self.musicmuster.paste_rows())
lambda: self._info_row(track_id)
)
act_copypath = self.menu.addAction("Copy track path")
act_copypath.triggered.connect(
lambda: self._copy_path(row_number))
self.menu.addSeparator() self.menu.addSeparator()
# Play with mplayer if track_row:
act_mplayer = self.menu.addAction( # Info
"Play with mplayer") act_info = self.menu.addAction('Info')
act_mplayer.triggered.connect( act_info.triggered.connect(
lambda: self._mplayer_play(track_id)) lambda: self._info_row(track_id)
)
act_copypath = self.menu.addAction("Copy track path")
act_copypath.triggered.connect(
lambda: self._copy_path(row_number))
# Set next self.menu.addSeparator()
if not current and not next_row:
act_setnext = self.menu.addAction("Set next") # Play with mplayer
with Session() as session: act_mplayer = self.menu.addAction(
"Play with mplayer")
act_mplayer.triggered.connect(
lambda: self._mplayer_play(track_id))
# Set next
if not current and not next_row:
act_setnext = self.menu.addAction("Set next")
act_setnext.triggered.connect( act_setnext.triggered.connect(
lambda: self._set_next(session, row_number)) lambda: self._set_next(session, row_number))
if not current: if not current:
# Open in Audacity # Open in Audacity
act_audacity = self.menu.addAction( act_audacity = self.menu.addAction(
"Open in Audacity") "Open in Audacity")
act_audacity.triggered.connect( act_audacity.triggered.connect(
lambda: self._open_in_audacity(track_id)) lambda: self._open_in_audacity(track_id))
# Rescan # Rescan
act_rescan = self.menu.addAction("Rescan") act_rescan = self.menu.addAction("Rescan")
act_rescan.triggered.connect( act_rescan.triggered.connect(
lambda: self._rescan(row_number, track_id) lambda: self._rescan(row_number, track_id)
) )
self.menu.addSeparator() self.menu.addSeparator()
# Look up in wikipedia # Look up in wikipedia
act_wikip = self.menu.addAction("Wikipedia") act_wikip = self.menu.addAction("Wikipedia")
act_wikip.triggered.connect( act_wikip.triggered.connect(
lambda: self._wikipedia(row_number) lambda: self._wikipedia(row_number)
) )
# Look up in songfacts # Look up in songfacts
act_songfacts = self.menu.addAction("Songfacts") act_songfacts = self.menu.addAction("Songfacts")
act_songfacts.triggered.connect( act_songfacts.triggered.connect(
lambda: self._songfacts(row_number) lambda: self._songfacts(row_number)
) )
self.menu.addSeparator() self.menu.addSeparator()
# Remove track # Remove track
act_remove_track = self.menu.addAction('Remove track') act_remove_track = self.menu.addAction(
act_remove_track.triggered.connect( 'Remove track')
lambda: self._remove_track(row_number) act_remove_track.triggered.connect(
) lambda: self._remove_track(row_number)
if header_row: )
# Add track to section header (ie, make this a track if header_row:
# row) # Add track to section header (ie, make this a track
act_add_track = self.menu.addAction('Add track') # row)
act_add_track.triggered.connect( act_add_track = self.menu.addAction('Add track')
lambda: self._add_track(row_number)) act_add_track.triggered.connect(
lambda: self._add_track(row_number))
if not current and not next_row: if not current and not next_row:
# Remove row # Remove row
act_delete = self.menu.addAction('Remove row') act_delete = self.menu.addAction('Remove row')
act_delete.triggered.connect(self._delete_rows) act_delete.triggered.connect(self._delete_rows)
self.menu.addSeparator()
if not current and not next_row:
act_move = self.menu.addAction('Move to playlist...')
act_move.triggered.connect(self.musicmuster.move_selected)
self.menu.addSeparator() self.menu.addSeparator()
if not current and not next_row:
act_move = self.menu.addAction('Move to playlist...')
act_move.triggered.connect(
self.musicmuster.move_selected)
self.menu.addSeparator()
return super(PlaylistTab, self).eventFilter(source, event) return super(PlaylistTab, self).eventFilter(source, event)
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
@ -1569,6 +1590,27 @@ class PlaylistTab(QTableWidget):
and pos.y() >= rect.center().y() # noqa W503 and pos.y() >= rect.center().y() # noqa W503
) )
def _mark_unnext(self, row: int) -> None:
"""
Unmark passed row as next track
"""
self.musicmuster.clear_next()
with Session() as session:
self.update_display(session)
self.musicmuster.update_headers()
def _mark_unplayed(self, plr: PlaylistRows) -> None:
"""
Mark passed row as unplayed in this playlist
"""
with Session() as session:
session.add(plr)
plr.played = False
session.flush()
self.update_display(session)
def _move_row(self, session: scoped_session, plr: PlaylistRows, def _move_row(self, session: scoped_session, plr: PlaylistRows,
new_row_number: int) -> None: new_row_number: int) -> None:
"""Move playlist row to new_row_number using parent copy/paste""" """Move playlist row to new_row_number using parent copy/paste"""