From 46ffbb936da31890f439470470cda3bd4a5bbd5c Mon Sep 17 00:00:00 2001 From: RumovZ Date: Tue, 28 Sep 2021 11:47:13 +0200 Subject: [PATCH] Speed up `to_row_of_unselected_note()` Skip rows between selected rows and return fetched note ids. --- qt/aqt/browser/browser.py | 3 +-- qt/aqt/browser/table/table.py | 39 +++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 2cf2c1b19..3e0d10e01 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -619,8 +619,7 @@ class Browser(QMainWindow): if focus != self.form.tableView: return - nids = self.table.get_selected_note_ids() - self.table.to_row_of_unselected_note() + nids = self.table.to_row_of_unselected_note() remove_notes(parent=self, note_ids=nids).run_in_background() # legacy diff --git a/qt/aqt/browser/table/table.py b/qt/aqt/browser/table/table.py index 3ff64bae8..65981c87e 100644 --- a/qt/aqt/browser/table/table.py +++ b/qt/aqt/browser/table/table.py @@ -213,24 +213,37 @@ class Table: def to_last_row(self) -> None: self._move_current_to_row(self._model.len_rows() - 1) - def to_row_of_unselected_note(self) -> None: - """Select and set focus to a row whose note is not selected, - starting with the nearest row below, then above the focused row. + def to_row_of_unselected_note(self) -> Sequence[NoteId]: + """Select and set focus to a row whose note is not selected, trying + the rows below the bottomost, then above the topmost selected row. If that's not possible, clear selection. + Return previously selected note ids. """ nids = self.get_selected_note_ids() - for row in range(self._current().row(), self.len()): - nid = self._model.get_note_id(self._model.index(row, 0)) - if nid is not None and nid not in nids: - self._move_current_to_row(row) - return - for row in range(self._current().row() - 1, -1, -1): - nid = self._model.get_note_id(self._model.index(row, 0)) - if nid is not None and nid not in nids: - self._move_current_to_row(row) - return + + bottom = max(r.row() for r in self._selected()) + 1 + for row in range(bottom, self.len()): + index = self._model.index(row, 0) + if self._model.get_row(index).is_deleted: + continue + if self._model.get_note_id(index) in nids: + continue + self._move_current_to_row(row) + return nids + + top = min(r.row() for r in self._selected()) - 1 + for row in range(top, -1, -1): + index = self._model.index(row, 0) + if self._model.get_row(index).is_deleted: + continue + if self._model.get_note_id(index) in nids: + continue + self._move_current_to_row(row) + return nids + self._reset_selection() self.browser.on_row_changed() + return nids def clear_current(self) -> None: self._view.selectionModel().setCurrentIndex(