Use slots for some of the often called attributes in the editor

This commit is contained in:
Veronica Berglyd Olsen
2024-12-05 23:01:17 +01:00
parent 05385ba73b
commit 8dafaa13c0
3 changed files with 54 additions and 46 deletions
+45 -37
View File
@@ -87,6 +87,13 @@ class _SelectAction(Enum):
class GuiDocEditor(QPlainTextEdit): class GuiDocEditor(QPlainTextEdit):
"""Gui Widget: Main Document Editor""" """Gui Widget: Main Document Editor"""
__slots__ = (
"_nwDocument", "_nwItem", "_docChanged", "_docHandle", "_vpMargin",
"_lastEdit", "_lastActive", "_lastFind", "_doReplace", "_autoReplace",
"_completer", "_qDocument", "_keyContext", "_followTag1", "_followTag2",
"_timerDoc", "_wCounterDoc", "_timerSel", "_wCounterSel",
)
MOVE_KEYS = ( MOVE_KEYS = (
Qt.Key.Key_Left, Qt.Key.Key_Right, Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right, Qt.Key.Key_Up, Qt.Key.Key_Down,
Qt.Key.Key_PageUp, Qt.Key.Key_PageDown Qt.Key.Key_PageUp, Qt.Key.Key_PageDown
@@ -167,38 +174,38 @@ class GuiDocEditor(QPlainTextEdit):
self.setAcceptDrops(True) self.setAcceptDrops(True)
# Custom Shortcuts # Custom Shortcuts
self.keyContext = QShortcut(self) self._keyContext = QShortcut(self)
self.keyContext.setKey("Ctrl+.") self._keyContext.setKey("Ctrl+.")
self.keyContext.setContext(Qt.ShortcutContext.WidgetShortcut) self._keyContext.setContext(Qt.ShortcutContext.WidgetShortcut)
self.keyContext.activated.connect(self._openContextFromCursor) self._keyContext.activated.connect(self._openContextFromCursor)
self.followTag1 = QShortcut(self) self._followTag1 = QShortcut(self)
self.followTag1.setKey("Ctrl+Return") self._followTag1.setKey("Ctrl+Return")
self.followTag1.setContext(Qt.ShortcutContext.WidgetShortcut) self._followTag1.setContext(Qt.ShortcutContext.WidgetShortcut)
self.followTag1.activated.connect(self._processTag) self._followTag1.activated.connect(self._processTag)
self.followTag2 = QShortcut(self) self._followTag2 = QShortcut(self)
self.followTag2.setKey("Ctrl+Enter") self._followTag2.setKey("Ctrl+Enter")
self.followTag2.setContext(Qt.ShortcutContext.WidgetShortcut) self._followTag2.setContext(Qt.ShortcutContext.WidgetShortcut)
self.followTag2.activated.connect(self._processTag) self._followTag2.activated.connect(self._processTag)
# Set Up Document Word Counter # Set Up Document Word Counter
self.timerDoc = QTimer(self) self._timerDoc = QTimer(self)
self.timerDoc.timeout.connect(self._runDocumentTasks) self._timerDoc.timeout.connect(self._runDocumentTasks)
self.timerDoc.setInterval(5000) self._timerDoc.setInterval(5000)
self.wCounterDoc = BackgroundWordCounter(self) self._wCounterDoc = BackgroundWordCounter(self)
self.wCounterDoc.setAutoDelete(False) self._wCounterDoc.setAutoDelete(False)
self.wCounterDoc.signals.countsReady.connect(self._updateDocCounts) self._wCounterDoc.signals.countsReady.connect(self._updateDocCounts)
# Set Up Selection Word Counter # Set Up Selection Word Counter
self.timerSel = QTimer(self) self._timerSel = QTimer(self)
self.timerSel.timeout.connect(self._runSelCounter) self._timerSel.timeout.connect(self._runSelCounter)
self.timerSel.setInterval(500) self._timerSel.setInterval(500)
self.wCounterSel = BackgroundWordCounter(self, forSelection=True) self._wCounterSel = BackgroundWordCounter(self, forSelection=True)
self.wCounterSel.setAutoDelete(False) self._wCounterSel.setAutoDelete(False)
self.wCounterSel.signals.countsReady.connect(self._updateSelCounts) self._wCounterSel.signals.countsReady.connect(self._updateSelCounts)
# Install Event Filter for Mouse Wheel # Install Event Filter for Mouse Wheel
self.wheelEventFilter = WheelEventFilter(self) self.wheelEventFilter = WheelEventFilter(self)
@@ -252,8 +259,8 @@ class GuiDocEditor(QPlainTextEdit):
self._nwDocument = None self._nwDocument = None
self.setReadOnly(True) self.setReadOnly(True)
self.clear() self.clear()
self.timerDoc.stop() self._timerDoc.stop()
self.timerSel.stop() self._timerSel.stop()
self._docHandle = None self._docHandle = None
self._lastEdit = 0.0 self._lastEdit = 0.0
@@ -301,6 +308,7 @@ class GuiDocEditor(QPlainTextEdit):
settings. This function is both called when the editor is settings. This function is both called when the editor is
created, and when the user changes the main editor preferences. created, and when the user changes the main editor preferences.
""" """
print(len(self.__dict__), self.__dict__)
# Auto-Replace # Auto-Replace
self._autoReplace.initSettings() self._autoReplace.initSettings()
@@ -395,7 +403,7 @@ class GuiDocEditor(QPlainTextEdit):
self._lastEdit = time() self._lastEdit = time()
self._lastActive = time() self._lastActive = time()
self._runDocumentTasks() self._runDocumentTasks()
self.timerDoc.start() self._timerDoc.start()
self.setReadOnly(False) self.setReadOnly(False)
self.updateDocMargins() self.updateDocMargins()
@@ -1079,8 +1087,8 @@ class GuiDocEditor(QPlainTextEdit):
if not self._docChanged: if not self._docChanged:
self.setDocumentChanged(removed != 0 or added != 0) self.setDocumentChanged(removed != 0 or added != 0)
if not self.timerDoc.isActive(): if not self._timerDoc.isActive():
self.timerDoc.start() self._timerDoc.start()
if (block := self._qDocument.findBlock(pos)).isValid(): if (block := self._qDocument.findBlock(pos)).isValid():
text = block.text() text = block.text()
@@ -1222,8 +1230,8 @@ class GuiDocEditor(QPlainTextEdit):
if time() - self._lastEdit < 25.0: if time() - self._lastEdit < 25.0:
logger.debug("Running document tasks") logger.debug("Running document tasks")
if not self.wCounterDoc.isRunning(): if not self._wCounterDoc.isRunning():
SHARED.runInThreadPool(self.wCounterDoc) SHARED.runInThreadPool(self._wCounterDoc)
self.docHeader.setOutline({ self.docHeader.setOutline({
block.blockNumber(): block.text() block.blockNumber(): block.text()
@@ -1255,10 +1263,10 @@ class GuiDocEditor(QPlainTextEdit):
information to the footer, and start the selection word counter. information to the footer, and start the selection word counter.
""" """
if self.textCursor().hasSelection(): if self.textCursor().hasSelection():
if not self.timerSel.isActive(): if not self._timerSel.isActive():
self.timerSel.start() self._timerSel.start()
else: else:
self.timerSel.stop() self._timerSel.stop()
self.docFooter.updateWordCount(0, False) self.docFooter.updateWordCount(0, False)
return return
@@ -1268,11 +1276,11 @@ class GuiDocEditor(QPlainTextEdit):
if self._docHandle is None: if self._docHandle is None:
return return
if self.wCounterSel.isRunning(): if self._wCounterSel.isRunning():
logger.debug("Selection word counter is busy") logger.debug("Selection word counter is busy")
return return
SHARED.runInThreadPool(self.wCounterSel) SHARED.runInThreadPool(self._wCounterSel)
return return
@@ -1282,7 +1290,7 @@ class GuiDocEditor(QPlainTextEdit):
if self._docHandle and self._nwItem: if self._docHandle and self._nwItem:
logger.debug("User selected %d words", wCount) logger.debug("User selected %d words", wCount)
self.docFooter.updateWordCount(wCount, True) self.docFooter.updateWordCount(wCount, True)
self.timerSel.stop() self._timerSel.stop()
return return
@pyqtSlot() @pyqtSlot()
+8 -8
View File
@@ -1917,8 +1917,8 @@ def testGuiEditor_WordCounters(qtbot, monkeypatch, nwGUI, projPath, ipsumText, m
threadPool = MockThreadPool() threadPool = MockThreadPool()
monkeypatch.setattr(QThreadPool, "globalInstance", lambda *a: threadPool) monkeypatch.setattr(QThreadPool, "globalInstance", lambda *a: threadPool)
docEditor.timerDoc.blockSignals(True) docEditor._timerDoc.blockSignals(True)
docEditor.timerSel.blockSignals(True) docEditor._timerSel.blockSignals(True)
buildTestProject(nwGUI, projPath) buildTestProject(nwGUI, projPath)
@@ -1944,20 +1944,20 @@ def testGuiEditor_WordCounters(qtbot, monkeypatch, nwGUI, projPath, ipsumText, m
# Check that a busy counter is blocked # Check that a busy counter is blocked
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(docEditor.wCounterDoc, "isRunning", lambda *a: True) mp.setattr(docEditor._wCounterDoc, "isRunning", lambda *a: True)
docEditor._runDocumentTasks() docEditor._runDocumentTasks()
assert docEditor.docFooter.wordsText.text() == "Words: 0 (+0)" assert docEditor.docFooter.wordsText.text() == "Words: 0 (+0)"
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(docEditor.wCounterSel, "isRunning", lambda *a: True) mp.setattr(docEditor._wCounterSel, "isRunning", lambda *a: True)
docEditor._runSelCounter() docEditor._runSelCounter()
assert docEditor.docFooter.wordsText.text() == "Words: 0 (+0)" assert docEditor.docFooter.wordsText.text() == "Words: 0 (+0)"
# Run the full word counter # Run the full word counter
docEditor._runDocumentTasks() docEditor._runDocumentTasks()
assert threadPool.objectID() == id(docEditor.wCounterDoc) assert threadPool.objectID() == id(docEditor._wCounterDoc)
docEditor.wCounterDoc.run() docEditor._wCounterDoc.run()
# docEditor._updateDocCounts(cC, wC, pC) # docEditor._updateDocCounts(cC, wC, pC)
assert SHARED.project.tree[C.hSceneDoc]._charCount == cC # type: ignore assert SHARED.project.tree[C.hSceneDoc]._charCount == cC # type: ignore
assert SHARED.project.tree[C.hSceneDoc]._wordCount == wC # type: ignore assert SHARED.project.tree[C.hSceneDoc]._wordCount == wC # type: ignore
@@ -1967,9 +1967,9 @@ def testGuiEditor_WordCounters(qtbot, monkeypatch, nwGUI, projPath, ipsumText, m
# Select all text and run the selection word counter # Select all text and run the selection word counter
docEditor.docAction(nwDocAction.SEL_ALL) docEditor.docAction(nwDocAction.SEL_ALL)
docEditor._runSelCounter() docEditor._runSelCounter()
assert threadPool.objectID() == id(docEditor.wCounterSel) assert threadPool.objectID() == id(docEditor._wCounterSel)
docEditor.wCounterSel.run() docEditor._wCounterSel.run()
assert docEditor.docFooter.wordsText.text() == f"Words: {wC} selected" assert docEditor.docFooter.wordsText.text() == f"Words: {wC} selected"
# qtbot.stop() # qtbot.stop()
+1 -1
View File
@@ -564,7 +564,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, projPath, tstPaths, mockRnd):
qtbot.keyClick(docEditor, Qt.Key.Key_Return, delay=KEY_DELAY) qtbot.keyClick(docEditor, Qt.Key.Key_Return, delay=KEY_DELAY)
qtbot.keyClick(docEditor, Qt.Key.Key_Return, delay=KEY_DELAY) qtbot.keyClick(docEditor, Qt.Key.Key_Return, delay=KEY_DELAY)
docEditor.wCounterDoc.run() docEditor._wCounterDoc.run()
# Spell Checking # Spell Checking
# ============== # ==============