Use slots for some of the often called attributes in the editor
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
# ==============
|
# ==============
|
||||||
|
|||||||
Reference in New Issue
Block a user