From 4b104798b8f737ce44c78fb23f34f3b82e018e0c Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Wed, 8 Feb 2023 20:52:42 +0000 Subject: [PATCH] Add unmark as next, played to context menu Fixes #166 Fixex #138 --- app/musicmuster.py | 11 ++- app/playlists.py | 212 +++++++++++++++++++++++++++------------------ 2 files changed, 136 insertions(+), 87 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 89384d1..7d583d7 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -427,6 +427,13 @@ class Window(QMainWindow, Ui_MainWindow): btn.setStyleSheet("background-color: " + colour + ";\n") btn.pgb.setValue(0) + def clear_next(self) -> None: + """ + Clear next track + """ + + self.next_track = PlaylistTrack() + def clear_selection(self) -> None: """ Clear selected row""" @@ -1183,7 +1190,7 @@ class Window(QMainWindow, Ui_MainWindow): # stop_playing() above has called end_of_track_actions() # which will have populated self.previous_track self.current_track = self.next_track - self.next_track = PlaylistTrack() + self.clear_next() if not self.current_track.track_id: log.debug("musicmuster.play_next(): no id for next track") @@ -1490,7 +1497,7 @@ class Window(QMainWindow, Ui_MainWindow): QColor(Config.COLOUR_NORMAL_TAB)) # Discard now-incorrect next_track PlaylistTrack - self.next_track = PlaylistTrack() + self.clear_next() self.next_track.set_plr(session, plr, playlist_tab) if self.next_track.playlist_tab: diff --git a/app/playlists.py b/app/playlists.py index 072c84f..c337df1 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -265,111 +265,132 @@ class PlaylistTab(QTableWidget): self.menu = QMenu(self) item = self.itemAt(event.pos()) if item is not None: - row_number = item.row() - track_id = self._get_row_track_id(row_number) - track_row = track_id > 0 - header_row = not track_row - if track_row: - current = ( - row_number == self._get_current_track_row_number() - ) - next_row = row_number == self._get_next_track_row_number() - else: - current = next_row = False + with Session() as session: + row_number = item.row() + plr_id = self._get_playlistrow_id(row_number) + plr = session.get(PlaylistRows, plr_id) + track_id = plr.track_id + track_row = track_id > 0 + header_row = not track_row + if track_row: + current = ( + row_number == self._get_current_track_row_number() + ) + next_row = ( + row_number == self._get_next_track_row_number()) + else: + current = next_row = False - # Cut/paste - act_cut = self.menu.addAction( - "Mark for moving") - act_cut.triggered.connect( - lambda: self.musicmuster.cut_rows()) + # Mark unplayed / un-next + sep = False + if plr.played: + sep = True + 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( - "Paste") - act_paste.setDisabled( - self.musicmuster.selected_plrs is None) - act_paste.triggered.connect( - lambda: self.musicmuster.paste_rows()) + # Cut/paste + act_cut = self.menu.addAction( + "Mark for moving") + act_cut.triggered.connect( + lambda: self.musicmuster.cut_rows()) - self.menu.addSeparator() - - if track_row: - # Info - act_info = self.menu.addAction('Info') - act_info.triggered.connect( - lambda: self._info_row(track_id) - ) - act_copypath = self.menu.addAction("Copy track path") - act_copypath.triggered.connect( - lambda: self._copy_path(row_number)) + act_paste = self.menu.addAction( + "Paste") + act_paste.setDisabled( + self.musicmuster.selected_plrs is None) + act_paste.triggered.connect( + lambda: self.musicmuster.paste_rows()) self.menu.addSeparator() - # Play with mplayer - act_mplayer = self.menu.addAction( - "Play with mplayer") - act_mplayer.triggered.connect( - lambda: self._mplayer_play(track_id)) + if track_row: + # Info + act_info = self.menu.addAction('Info') + act_info.triggered.connect( + 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 - if not current and not next_row: - act_setnext = self.menu.addAction("Set next") - with Session() as session: + self.menu.addSeparator() + + # Play with mplayer + 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( lambda: self._set_next(session, row_number)) - if not current: - # Open in Audacity - act_audacity = self.menu.addAction( - "Open in Audacity") - act_audacity.triggered.connect( - lambda: self._open_in_audacity(track_id)) + if not current: + # Open in Audacity + act_audacity = self.menu.addAction( + "Open in Audacity") + act_audacity.triggered.connect( + lambda: self._open_in_audacity(track_id)) - # Rescan - act_rescan = self.menu.addAction("Rescan") - act_rescan.triggered.connect( - lambda: self._rescan(row_number, track_id) - ) + # Rescan + act_rescan = self.menu.addAction("Rescan") + act_rescan.triggered.connect( + lambda: self._rescan(row_number, track_id) + ) - self.menu.addSeparator() + self.menu.addSeparator() - # Look up in wikipedia - act_wikip = self.menu.addAction("Wikipedia") - act_wikip.triggered.connect( - lambda: self._wikipedia(row_number) - ) + # Look up in wikipedia + act_wikip = self.menu.addAction("Wikipedia") + act_wikip.triggered.connect( + lambda: self._wikipedia(row_number) + ) - # Look up in songfacts - act_songfacts = self.menu.addAction("Songfacts") - act_songfacts.triggered.connect( - lambda: self._songfacts(row_number) - ) + # Look up in songfacts + act_songfacts = self.menu.addAction("Songfacts") + act_songfacts.triggered.connect( + lambda: self._songfacts(row_number) + ) - self.menu.addSeparator() + self.menu.addSeparator() - # Remove track - act_remove_track = self.menu.addAction('Remove track') - act_remove_track.triggered.connect( - lambda: self._remove_track(row_number) - ) - if header_row: - # Add track to section header (ie, make this a track - # row) - act_add_track = self.menu.addAction('Add track') - act_add_track.triggered.connect( - lambda: self._add_track(row_number)) + # Remove track + act_remove_track = self.menu.addAction( + 'Remove track') + act_remove_track.triggered.connect( + lambda: self._remove_track(row_number) + ) + if header_row: + # Add track to section header (ie, make this a track + # row) + act_add_track = self.menu.addAction('Add track') + act_add_track.triggered.connect( + lambda: self._add_track(row_number)) - if not current and not next_row: - # Remove row - act_delete = self.menu.addAction('Remove row') - act_delete.triggered.connect(self._delete_rows) + if not current and not next_row: + # Remove row + act_delete = self.menu.addAction('Remove row') + 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() + 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) def mouseReleaseEvent(self, event): @@ -1569,6 +1590,27 @@ class PlaylistTab(QTableWidget): 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, new_row_number: int) -> None: """Move playlist row to new_row_number using parent copy/paste"""