From 49bef912d26b6ff3dbbee8e7f2bad9184df5ad21 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Mon, 15 Aug 2022 09:10:26 +0100 Subject: [PATCH] Refactor playlist searching --- app/musicmuster.py | 5 ++- app/playlists.py | 91 +++++++++++++++++++--------------------------- 2 files changed, 41 insertions(+), 55 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 735c907..bc865ae 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -638,6 +638,9 @@ class Window(QMainWindow, Ui_MainWindow): self.disable_play_next_controls() self.txtSearch.setHidden(False) self.txtSearch.setFocus() + # Select any text that may already be there + self.txtSearch.selectAll() + def search_playlist_clear(self) -> None: """Tidy up and reset search bar""" @@ -651,7 +654,7 @@ class Window(QMainWindow, Ui_MainWindow): def search_playlist_return(self) -> None: """Initiate search when return pressed""" - self.visible_playlist_tab().search(self.txtSearch.text()) + self.visible_playlist_tab().set_search(self.txtSearch.text()) self.enable_play_next_controls() # def search_playlist_update(self): diff --git a/app/playlists.py b/app/playlists.py index 7e541c6..addff38 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -776,31 +776,37 @@ class PlaylistTab(QTableWidget): session.commit() PlaylistRows.delete_higher_rows(session, self.playlist_id, row) - def search(self, text: str) -> None: + def set_search(self, text: str) -> None: """Set search text and find first match""" self.search_text = text if not text: # Search string has been reset return - self.search_next() + self._search(next=True) - def search_next(self) -> None: + def _search(self, next: bool = True) -> None: """ - Select next row containg self.search_string. Start from + Select next/previous row containg self.search_string. Start from top selected row if there is one, else from top. - Wrap at last row. + Wrap at last/first row. """ if not self.search_text: return selected_row = self._get_selected_row() - if selected_row is not None and selected_row < self.rowCount() - 1: - starting_row = selected_row + 1 + if next: + if selected_row is not None and selected_row < self.rowCount() - 1: + starting_row = selected_row + 1 + else: + starting_row = 0 else: - starting_row = 0 + if selected_row is not None and selected_row > 0: + starting_row = selected_row - 1 + else: + starting_row = self.rowCount() - 1 wrapped = False match_row = None @@ -820,60 +826,37 @@ class PlaylistTab(QTableWidget): if note and needle in note.lower(): match_row = row break - row += 1 - if wrapped and row >= starting_row: - break - if row >= self.rowCount(): - row = 0 - wrapped = True + if next: + row += 1 + if wrapped and row >= starting_row: + break + if row >= self.rowCount(): + row = 0 + wrapped = True + else: + row -= 1 + if wrapped and row <= starting_row: + break + if row < 0: + row = self.rowCount() - 1 + wrapped = True if match_row is not None: self.selectRow(row) + def search_next(self) -> None: + """ + Select next row containg self.search_string. + """ + + self._search(next=True) + def search_previous(self) -> None: """ - Select previous row containg self.search_string. Start from - top selected row if there is one, else from top. - - Wrap at last row. + Select previous row containg self.search_string. """ - if not self.search_text: - return - - selected_row = self._get_selected_row() - if selected_row is not None and selected_row > 0: - starting_row = selected_row - 1 - else: - starting_row = self.rowCount() - 1 - - wrapped = False - match_row = None - row = starting_row - needle = self.search_text.lower() - while True: - # Check for match in title, artist or notes - title = self._get_row_title(row) - if title and needle in title.lower(): - match_row = row - break - artist = self._get_row_title(row) - if artist and needle in artist.lower(): - match_row = row - break - note = self._get_row_note(row) - if note and needle in note.lower(): - match_row = row - break - row -= 1 - if wrapped and row <= starting_row: - break - if row < 0: - row = self.rowCount() - 1 - wrapped = True - - if match_row is not None: - self.selectRow(row) + self._search(next=False) def select_next_row(self) -> None: """