From 7fc32db0c95e9a7f84fa3742844f057bc71a75d3 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 2 Feb 2021 15:47:51 +1000 Subject: [PATCH] fix: slowdowns after import; hard to read popup QTextEdit() will pin the CPU at 100% for seconds to minutes when fed a large string to display - work around it by switching to QPlainTextEdit(). Also strip HTML before showing the user - easier to read, and less text to display. And turn off word wrap, as it makes it easier to skim, and further reduces the work the widget needs to do. https://forums.ankiweb.net/t/big-issue-where-anki-gets-slow-when-you-import-this-deck/7050 --- pylib/anki/importing/anki2.py | 6 ++++-- qt/aqt/importing.py | 2 +- qt/aqt/utils.py | 11 +++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pylib/anki/importing/anki2.py b/pylib/anki/importing/anki2.py index 5c1bbec6b..f66c90d87 100644 --- a/pylib/anki/importing/anki2.py +++ b/pylib/anki/importing/anki2.py @@ -10,7 +10,7 @@ from anki.consts import * from anki.decks import DeckManager from anki.importing.base import Importer from anki.lang import TR -from anki.utils import intTime, joinFields, splitFields +from anki.utils import intTime, joinFields, splitFields, stripHTMLMedia GUID = 1 MID = 2 @@ -71,7 +71,9 @@ class Anki2Importer(Importer): ###################################################################### def _logNoteRow(self, action: str, noteRow: List[str]) -> None: - self.log.append("[%s] %s" % (action, noteRow[6].replace("\x1f", ", "))) + self.log.append( + "[%s] %s" % (action, stripHTMLMedia(noteRow[6].replace("\x1f", ", "))) + ) def _importNotes(self) -> None: # build guid -> (id,mod,mid) hash & map of existing note ids diff --git a/qt/aqt/importing.py b/qt/aqt/importing.py index 956c8374e..58e51d94f 100644 --- a/qt/aqt/importing.py +++ b/qt/aqt/importing.py @@ -398,7 +398,7 @@ def importFile(mw: AnkiQt, file: str) -> None: if "\n" not in log: tooltip(log) else: - showText(log) + showText(log, plain_text_edit=True) mw.reset() diff --git a/qt/aqt/utils.py b/qt/aqt/utils.py index 3c0407e06..ceaa25b7c 100644 --- a/qt/aqt/utils.py +++ b/qt/aqt/utils.py @@ -204,6 +204,7 @@ def showText( minHeight: int = 400, title: str = "Anki", copyBtn: bool = False, + plain_text_edit: bool = False, ) -> Optional[Tuple[QDialog, QDialogButtonBox]]: if not parent: parent = aqt.mw.app.activeWindow() or aqt.mw @@ -212,8 +213,14 @@ def showText( disable_help_button(diag) layout = QVBoxLayout(diag) diag.setLayout(layout) - text = QTextBrowser() - text.setOpenExternalLinks(True) + if plain_text_edit: + # used by the importer + text = QPlainTextEdit() + text.setReadOnly(True) + text.setWordWrapMode(QTextOption.NoWrap) + else: + text = QTextBrowser() + text.setOpenExternalLinks(True) if type == "text": text.setPlainText(txt) else: