diff --git a/pylib/anki/collection.py b/pylib/anki/collection.py index fcae9dc79..cc54c9ea1 100644 --- a/pylib/anki/collection.py +++ b/pylib/anki/collection.py @@ -608,7 +608,7 @@ class Collection: return self._backend.field_names_for_notes(nids) # returns array of ("dupestr", [nids]) - def findDupes(self, fieldName: str, search: str = "") -> List[Tuple[Any, list]]: + def findDupes(self, fieldName: str, search: str = "") -> List[Tuple[str, list]]: nids = self.find_notes( self.build_search_string(search, SearchNode(field_name=fieldName)) ) diff --git a/qt/aqt/browser/find_duplicates.py b/qt/aqt/browser/find_duplicates.py index 283c06a7a..9703a9ce7 100644 --- a/qt/aqt/browser/find_duplicates.py +++ b/qt/aqt/browser/find_duplicates.py @@ -4,15 +4,17 @@ from __future__ import annotations import html -from typing import Any, List, Optional +from typing import Any, List, Optional, Tuple import anki import anki.find import aqt from anki.collection import SearchNode +from anki.notes import NoteId from aqt.qt import * -from ..main import ResetReason +from ..operations import QueryOp +from ..operations.tag import add_tags_to_notes from ..utils import ( disable_help_button, restore_combo_history, @@ -21,11 +23,8 @@ from ..utils import ( save_combo_history, save_combo_index_for_session, saveGeom, - showWarning, - tooltip, tr, ) -from ..webview import AnkiWebView from . import Browser @@ -35,7 +34,7 @@ class FindDuplicatesDialog(QDialog): self.browser = browser self.mw = mw self.mw.garbage_collect_on_dialog_finish(self) - form = aqt.forms.finddupes.Ui_Dialog() + self.form = form = aqt.forms.finddupes.Ui_Dialog() form.setupUi(self) restoreGeom(self, "findDupes") disable_help_button(self) @@ -50,56 +49,47 @@ class FindDuplicatesDialog(QDialog): # links form.webView.set_title("find duplicates") - form.webView.set_bridge_command(self.dupeLinkClicked, context=self) + form.webView.set_bridge_command(self._on_duplicate_clicked, context=self) form.webView.stdHtml("", context=self) - def onFin(code: Any) -> None: + def on_finished(code: Any) -> None: saveGeom(self, "findDupes") - qconnect(self.finished, onFin) + qconnect(self.finished, on_finished) - def onClick() -> None: + def on_click() -> None: search_text = save_combo_history( form.search, searchHistory, "findDupesFind" ) save_combo_index_for_session(form.fields, "findDupesFields") field = fields[form.fields.currentIndex()] - self.duplicatesReport(form.webView, field, search_text, form) + QueryOp( + parent=self.browser, + op=lambda col: col.findDupes(field, search_text), + success=self.show_duplicates_report, + ).run_in_background() search = form.buttonBox.addButton( tr.actions_search(), QDialogButtonBox.ActionRole ) - qconnect(search.clicked, onClick) + qconnect(search.clicked, on_click) self.show() - def duplicatesReport( - self, - web: AnkiWebView, - fname: str, - search: str, - frm: aqt.forms.finddupes.Ui_Dialog, - ) -> None: - self.mw.progress.start() - try: - res = self.mw.col.findDupes(fname, search) - except Exception as e: - self.mw.progress.finish() - showWarning(str(e)) - return + def show_duplicates_report(self, dupes: List[Tuple[str, List[NoteId]]]) -> None: if not self._dupesButton: - self._dupesButton = b = frm.buttonBox.addButton( + self._dupesButton = b = self.form.buttonBox.addButton( tr.browsing_tag_duplicates(), QDialogButtonBox.ActionRole ) - qconnect(b.clicked, lambda: self._onTagDupes(res)) - t = "" - groups = len(res) - notes = sum(len(r[1]) for r in res) + qconnect(b.clicked, lambda: self._tag_duplicates(dupes)) + text = "" + groups = len(dupes) + notes = sum(len(r[1]) for r in dupes) part1 = tr.browsing_group(count=groups) part2 = tr.browsing_note_count(count=notes) - t += tr.browsing_found_as_across_bs(part=part1, whole=part2) - t += "