From 9c0371d41cb59569a042027ad8b85ca609dc27e1 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Fri, 4 Mar 2022 18:17:57 +0000 Subject: [PATCH] Scroll current row to top; improve session handling --- app/config.py | 1 + app/musicmuster.py | 7 ++++-- app/playlists.py | 58 +++++++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/app/config.py b/app/config.py index eb14842..a25f66d 100644 --- a/app/config.py +++ b/app/config.py @@ -54,6 +54,7 @@ class Config(object): NORMALISE_ON_IMPORT = True NOTE_TIME_FORMAT = "%H:%M:%S" ROOT = os.environ.get('ROOT') or "/home/kae/music" + SCROLL_TOP_MARGIN = 3 TESTMODE = True TOD_TIME_FORMAT = "%H:%M:%S" TIMER_MS = 500 diff --git a/app/musicmuster.py b/app/musicmuster.py index d28e819..80dda91 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -235,8 +235,7 @@ class Window(QMainWindow, Ui_MainWindow): "Can't close next track playlist", 5000) return # It's OK to close this playlist so remove from open playlist list - with Session() as session: - self.tabPlaylist.widget(index).playlist.close(session) + self.tabPlaylist.widget(index).close() # Close regardless of tab type self.tabPlaylist.removeTab(index) @@ -516,6 +515,10 @@ class Window(QMainWindow, Ui_MainWindow): self.current_track = self.next_track self.next_track = None + # Ensure track is in session + if self.current_track not in session: + session.add(self.current_track) + # If current track on different playlist_tab to last, reset # last track playlist_tab colour # Set current track playlist_tab colour diff --git a/app/playlists.py b/app/playlists.py index bc4e314..a52b029 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -220,8 +220,9 @@ class PlaylistTab(QTableWidget): if row not in self._get_notes_rows(): if not current and not next_row: act_setnext = self.menu.addAction("Set next") - act_setnext.triggered.connect( - lambda: self._set_next(row)) + with Session() as session: + act_setnext.triggered.connect( + lambda: self._set_next(row, session)) act_copypath = self.menu.addAction("Copy track path") act_copypath.triggered.connect( lambda: self._copy_path(row)) @@ -397,7 +398,7 @@ class PlaylistTab(QTableWidget): - Note start time - Mark next-track row as current - Mark current row as played - - Scroll to put current track in middle + - Scroll to put current track as required - Set next track - Update display """ @@ -414,15 +415,20 @@ class PlaylistTab(QTableWidget): # Mark current row as played self._set_played_row(current_row) - # Scroll to put current track in middle - scroll_to = self.item(current_row, self.COL_MSS) - self.scrollToItem(scroll_to, QAbstractItemView.PositionAtCenter) + # Scroll to put current track as requiredin middle We want this + # row to be Config.SCROLL_TOP_MARGIN from the top. Rows number + # from zero, so set (current_row - Config.SCROLL_TOP_MARGIN + 1) + # row to be top row + + top_row = max(0, current_row - Config.SCROLL_TOP_MARGIN + 1) + scroll_item = self.item(top_row, self.COL_MSS) + self.scrollToItem(scroll_item, QAbstractItemView.PositionAtTop) # Set next track search_from = current_row + 1 next_row = self._find_next_track_row(search_from) if next_row: - self._set_next(next_row) + self._set_next(next_row, session) # Update display self.update_display(session) @@ -636,7 +642,8 @@ class PlaylistTab(QTableWidget): if row is None: return None - self._set_next(row) + with Session() as session: + self._set_next(row, session) def update_display(self, session, clear_selection: bool = True) -> None: """ @@ -1398,7 +1405,7 @@ class PlaylistTab(QTableWidget): else: self.setColumnWidth(column, Config.DEFAULT_COLUMN_WIDTH) - def _set_next(self, row: int) -> None: + def _set_next(self, row: int, session: Session) -> None: """ Set passed row as next track to play. @@ -1412,27 +1419,26 @@ class PlaylistTab(QTableWidget): DEBUG(f"_set_next({row=})") - with Session() as session: - # Check row is a track row - if row in self._get_notes_rows(): - return None - track: Tracks = self._get_row_track_object(row, session) - if not track: - return None + # Check row is a track row + if row in self._get_notes_rows(): + return None + track: Tracks = self._get_row_track_object(row, session) + if not track: + return None - # Check track is readable - if not self._file_is_readable(track.path): - self._set_unreadable_row(row) - return None + # Check track is readable + if not self._file_is_readable(track.path): + self._set_unreadable_row(row) + return None - # Mark as next track - self._set_next_track_row(row) + # Mark as next track + self._set_next_track_row(row) - # Update display - self.update_display(session) + # Update display + self.update_display(session) - # Notify musicmuster - self.musicmuster.this_is_the_next_track(self, track) + # Notify musicmuster + self.musicmuster.this_is_the_next_track(self, track) def _set_row_bold(self, row: int, bold: bool = True) -> None: """Make row bold (bold=True) or not bold"""