Extend and refactor current open document highlighting
This commit is contained in:
@@ -90,20 +90,21 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Custom Signals
|
# Custom Signals
|
||||||
statusMessage = pyqtSignal(str)
|
closeEditorRequest = pyqtSignal()
|
||||||
docCountsChanged = pyqtSignal(str, int, int, int)
|
docCountsChanged = pyqtSignal(str, int, int, int)
|
||||||
docTextChanged = pyqtSignal(str, float)
|
docTextChanged = pyqtSignal(str, float)
|
||||||
editedStatusChanged = pyqtSignal(bool)
|
editedStatusChanged = pyqtSignal(bool)
|
||||||
|
itemHandleChanged = pyqtSignal(str)
|
||||||
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
||||||
novelStructureChanged = pyqtSignal()
|
|
||||||
novelItemMetaChanged = pyqtSignal(str)
|
novelItemMetaChanged = pyqtSignal(str)
|
||||||
spellCheckStateChanged = pyqtSignal(bool)
|
novelStructureChanged = pyqtSignal()
|
||||||
closeDocumentRequest = pyqtSignal()
|
|
||||||
toggleFocusModeRequest = pyqtSignal()
|
|
||||||
requestProjectItemSelected = pyqtSignal(str, bool)
|
|
||||||
requestProjectItemRenamed = pyqtSignal(str, str)
|
|
||||||
requestNewNoteCreation = pyqtSignal(str, nwItemClass)
|
requestNewNoteCreation = pyqtSignal(str, nwItemClass)
|
||||||
requestNextDocument = pyqtSignal(str, bool)
|
requestNextDocument = pyqtSignal(str, bool)
|
||||||
|
requestProjectItemRenamed = pyqtSignal(str, str)
|
||||||
|
requestProjectItemSelected = pyqtSignal(str, bool)
|
||||||
|
spellCheckStateChanged = pyqtSignal(bool)
|
||||||
|
toggleFocusModeRequest = pyqtSignal()
|
||||||
|
updateStatusMessage = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self, parent: QWidget) -> None:
|
def __init__(self, parent: QWidget) -> None:
|
||||||
super().__init__(parent=parent)
|
super().__init__(parent=parent)
|
||||||
@@ -271,6 +272,8 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
self.docFooter.setHandle(self._docHandle)
|
self.docFooter.setHandle(self._docHandle)
|
||||||
self.docToolBar.setVisible(False)
|
self.docToolBar.setVisible(False)
|
||||||
|
|
||||||
|
self.itemHandleChanged.emit("")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def updateTheme(self) -> None:
|
def updateTheme(self) -> None:
|
||||||
@@ -430,12 +433,15 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
self.setDocumentChanged(False)
|
self.setDocumentChanged(False)
|
||||||
self._qDocument.clearUndoRedoStacks()
|
self._qDocument.clearUndoRedoStacks()
|
||||||
self.docToolBar.setVisible(CONFIG.showEditToolBar)
|
self.docToolBar.setVisible(CONFIG.showEditToolBar)
|
||||||
|
self.itemHandleChanged.emit(tHandle)
|
||||||
|
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
|
|
||||||
# Update the status bar
|
# Update the status bar
|
||||||
if self._nwItem is not None:
|
if self._nwItem is not None:
|
||||||
self.statusMessage.emit(self.tr("Opened Document: {0}").format(self._nwItem.itemName))
|
self.updateStatusMessage.emit(
|
||||||
|
self.tr("Opened Document: {0}").format(self._nwItem.itemName)
|
||||||
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -506,7 +512,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
self.docFooter.updateInfo()
|
self.docFooter.updateInfo()
|
||||||
|
|
||||||
# Update the status bar
|
# Update the status bar
|
||||||
self.statusMessage.emit(self.tr("Saved Document: {0}").format(self._nwItem.itemName))
|
self.updateStatusMessage.emit(self.tr("Saved Document: {0}").format(self._nwItem.itemName))
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -701,7 +707,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
self._qDocument.syntaxHighlighter.rehighlight()
|
self._qDocument.syntaxHighlighter.rehighlight()
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
logger.debug("Document highlighted in %.3f ms", 1000*(time() - start))
|
logger.debug("Document highlighted in %.3f ms", 1000*(time() - start))
|
||||||
self.statusMessage.emit(self.tr("Spell check complete"))
|
self.updateStatusMessage.emit(self.tr("Spell check complete"))
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -1274,7 +1280,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def _closeCurrentDocument(self) -> None:
|
def _closeCurrentDocument(self) -> None:
|
||||||
"""Close the document. Forwarded to the main Gui."""
|
"""Close the document. Forwarded to the main Gui."""
|
||||||
self.closeDocumentRequest.emit()
|
self.closeEditorRequest.emit()
|
||||||
self.docToolBar.setVisible(False)
|
self.docToolBar.setVisible(False)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ class GuiNovelView(QWidget):
|
|||||||
|
|
||||||
# Function Mappings
|
# Function Mappings
|
||||||
self.getSelectedHandle = self.novelTree.getSelectedHandle
|
self.getSelectedHandle = self.novelTree.getSelectedHandle
|
||||||
self.setActiveHandle = self.novelTree.setActiveHandle
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -163,6 +162,12 @@ class GuiNovelView(QWidget):
|
|||||||
# Public Slots
|
# Public Slots
|
||||||
##
|
##
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def setActiveHandle(self, tHandle: str) -> None:
|
||||||
|
"""Highlight the rows associated with a given handle."""
|
||||||
|
self.novelTree.setActiveHandle(tHandle)
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def refreshTree(self) -> None:
|
def refreshTree(self) -> None:
|
||||||
"""Refresh the current tree."""
|
"""Refresh the current tree."""
|
||||||
@@ -367,11 +372,11 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
self.novelView = novelView
|
self.novelView = novelView
|
||||||
|
|
||||||
# Internal Variables
|
# Internal Variables
|
||||||
self._treeMap = {}
|
|
||||||
self._lastBuild = 0
|
self._lastBuild = 0
|
||||||
self._lastCol = NovelTreeColumn.POV
|
self._lastCol = NovelTreeColumn.POV
|
||||||
self._lastColSize = 0.25
|
self._lastColSize = 0.25
|
||||||
self._actHandle = None
|
self._actHandle = None
|
||||||
|
self._treeMap: dict[str, QTreeWidgetItem] = {}
|
||||||
|
|
||||||
# Cached Strings
|
# Cached Strings
|
||||||
self._povLabel = trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY])
|
self._povLabel = trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY])
|
||||||
@@ -540,25 +545,29 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
self._lastColSize = minmax(colSize, 15, 75)/100.0
|
self._lastColSize = minmax(colSize, 15, 75)/100.0
|
||||||
return
|
return
|
||||||
|
|
||||||
def setActiveHandle(self, tHandle: str | None, doScroll: bool = False) -> None:
|
def setActiveHandle(self, tHandle: str | None) -> None:
|
||||||
"""Highlight the rows associated with a given handle."""
|
"""Highlight the rows associated with a given handle."""
|
||||||
didScroll = False
|
didScroll = False
|
||||||
self._actHandle = tHandle
|
brushOn = self.palette().alternateBase()
|
||||||
for i in range(self.topLevelItemCount()):
|
brushOff = self.palette().base()
|
||||||
if tItem := self.topLevelItem(i):
|
if pHandle := self._actHandle:
|
||||||
if tItem.data(self.C_DATA, self.D_HANDLE) == tHandle:
|
for key, item in self._treeMap.items():
|
||||||
tItem.setBackground(self.C_TITLE, self.palette().alternateBase())
|
if key.startswith(pHandle):
|
||||||
tItem.setBackground(self.C_WORDS, self.palette().alternateBase())
|
item.setBackground(self.C_TITLE, brushOff)
|
||||||
tItem.setBackground(self.C_EXTRA, self.palette().alternateBase())
|
item.setBackground(self.C_WORDS, brushOff)
|
||||||
tItem.setBackground(self.C_MORE, self.palette().alternateBase())
|
item.setBackground(self.C_EXTRA, brushOff)
|
||||||
if doScroll and not didScroll:
|
item.setBackground(self.C_MORE, brushOff)
|
||||||
self.scrollToItem(tItem, QAbstractItemView.ScrollHint.PositionAtCenter)
|
if tHandle:
|
||||||
|
for key, item in self._treeMap.items():
|
||||||
|
if key.startswith(tHandle):
|
||||||
|
item.setBackground(self.C_TITLE, brushOn)
|
||||||
|
item.setBackground(self.C_WORDS, brushOn)
|
||||||
|
item.setBackground(self.C_EXTRA, brushOn)
|
||||||
|
item.setBackground(self.C_MORE, brushOn)
|
||||||
|
if not didScroll:
|
||||||
|
self.scrollToItem(item, QAbstractItemView.ScrollHint.PositionAtCenter)
|
||||||
didScroll = True
|
didScroll = True
|
||||||
else:
|
self._actHandle = tHandle or None
|
||||||
tItem.setBackground(self.C_TITLE, self.palette().base())
|
|
||||||
tItem.setBackground(self.C_WORDS, self.palette().base())
|
|
||||||
tItem.setBackground(self.C_EXTRA, self.palette().base())
|
|
||||||
tItem.setBackground(self.C_MORE, self.palette().base())
|
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -211,6 +211,12 @@ class GuiProjectView(QWidget):
|
|||||||
self.projTree.setSelectedHandle(tHandle, doScroll=doScroll)
|
self.projTree.setSelectedHandle(tHandle, doScroll=doScroll)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def setActiveHandle(self, tHandle: str | None) -> None:
|
||||||
|
"""Highlight the active handle."""
|
||||||
|
self.projTree.setActiveHandle(tHandle)
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def updateItemValues(self, tHandle: str) -> None:
|
def updateItemValues(self, tHandle: str) -> None:
|
||||||
"""Update tree item."""
|
"""Update tree item."""
|
||||||
@@ -500,6 +506,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
self._treeMap: dict[str, QTreeWidgetItem] = {}
|
self._treeMap: dict[str, QTreeWidgetItem] = {}
|
||||||
self._timeChanged = 0.0
|
self._timeChanged = 0.0
|
||||||
self._popAlert = None
|
self._popAlert = None
|
||||||
|
self._actHandle = None
|
||||||
|
|
||||||
# Cached Translations
|
# Cached Translations
|
||||||
self.trActive = self.tr("Active")
|
self.trActive = self.tr("Active")
|
||||||
@@ -1144,6 +1151,19 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def setActiveHandle(self, tHandle: str | None) -> None:
|
||||||
|
"""Highlight the rows associated with a given handle."""
|
||||||
|
brushOn = self.palette().alternateBase()
|
||||||
|
brushOff = self.palette().base()
|
||||||
|
if (pHandle := self._actHandle) and (item := self._treeMap.get(pHandle)):
|
||||||
|
for i in range(self.columnCount()):
|
||||||
|
item.setBackground(i, brushOff)
|
||||||
|
if tHandle and (item := self._treeMap.get(tHandle)):
|
||||||
|
for i in range(self.columnCount()):
|
||||||
|
item.setBackground(i, brushOn)
|
||||||
|
self._actHandle = tHandle or None
|
||||||
|
return
|
||||||
|
|
||||||
def setExpandedFromHandle(self, tHandle: str | None, isExpanded: bool) -> None:
|
def setExpandedFromHandle(self, tHandle: str | None, isExpanded: bool) -> None:
|
||||||
"""Iterate through items below tHandle and change expanded
|
"""Iterate through items below tHandle and change expanded
|
||||||
status for all child items. If tHandle is None, it affects the
|
status for all child items. If tHandle is None, it affects the
|
||||||
|
|||||||
@@ -249,11 +249,13 @@ class GuiMain(QMainWindow):
|
|||||||
self.projSearch.openDocumentSelectRequest.connect(self._openDocumentSelection)
|
self.projSearch.openDocumentSelectRequest.connect(self._openDocumentSelection)
|
||||||
self.projSearch.selectedItemChanged.connect(self.itemDetails.updateViewBox)
|
self.projSearch.selectedItemChanged.connect(self.itemDetails.updateViewBox)
|
||||||
|
|
||||||
self.docEditor.closeDocumentRequest.connect(self.closeDocEditor)
|
self.docEditor.closeEditorRequest.connect(self.closeDocEditor)
|
||||||
self.docEditor.docCountsChanged.connect(self.itemDetails.updateCounts)
|
self.docEditor.docCountsChanged.connect(self.itemDetails.updateCounts)
|
||||||
self.docEditor.docCountsChanged.connect(self.projView.updateCounts)
|
self.docEditor.docCountsChanged.connect(self.projView.updateCounts)
|
||||||
self.docEditor.docTextChanged.connect(self.projSearch.textChanged)
|
self.docEditor.docTextChanged.connect(self.projSearch.textChanged)
|
||||||
self.docEditor.editedStatusChanged.connect(self.mainStatus.updateDocumentStatus)
|
self.docEditor.editedStatusChanged.connect(self.mainStatus.updateDocumentStatus)
|
||||||
|
self.docEditor.itemHandleChanged.connect(self.novelView.setActiveHandle)
|
||||||
|
self.docEditor.itemHandleChanged.connect(self.projView.setActiveHandle)
|
||||||
self.docEditor.loadDocumentTagRequest.connect(self._followTag)
|
self.docEditor.loadDocumentTagRequest.connect(self._followTag)
|
||||||
self.docEditor.novelItemMetaChanged.connect(self.novelView.updateNovelItemMeta)
|
self.docEditor.novelItemMetaChanged.connect(self.novelView.updateNovelItemMeta)
|
||||||
self.docEditor.novelStructureChanged.connect(self.novelView.refreshTree)
|
self.docEditor.novelStructureChanged.connect(self.novelView.refreshTree)
|
||||||
@@ -262,8 +264,8 @@ class GuiMain(QMainWindow):
|
|||||||
self.docEditor.requestProjectItemRenamed.connect(self.projView.renameTreeItem)
|
self.docEditor.requestProjectItemRenamed.connect(self.projView.renameTreeItem)
|
||||||
self.docEditor.requestProjectItemSelected.connect(self.projView.setSelectedHandle)
|
self.docEditor.requestProjectItemSelected.connect(self.projView.setSelectedHandle)
|
||||||
self.docEditor.spellCheckStateChanged.connect(self.mainMenu.setSpellCheckState)
|
self.docEditor.spellCheckStateChanged.connect(self.mainMenu.setSpellCheckState)
|
||||||
self.docEditor.statusMessage.connect(self.mainStatus.setStatusMessage)
|
|
||||||
self.docEditor.toggleFocusModeRequest.connect(self.toggleFocusMode)
|
self.docEditor.toggleFocusModeRequest.connect(self.toggleFocusMode)
|
||||||
|
self.docEditor.updateStatusMessage.connect(self.mainStatus.setStatusMessage)
|
||||||
|
|
||||||
self.docViewer.closeDocumentRequest.connect(self.closeDocViewer)
|
self.docViewer.closeDocumentRequest.connect(self.closeDocViewer)
|
||||||
self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle)
|
self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle)
|
||||||
@@ -518,8 +520,6 @@ class GuiMain(QMainWindow):
|
|||||||
SHARED.setFocusMode(False)
|
SHARED.setFocusMode(False)
|
||||||
self.saveDocument()
|
self.saveDocument()
|
||||||
self.docEditor.clearEditor()
|
self.docEditor.clearEditor()
|
||||||
if not beforeOpen:
|
|
||||||
self.novelView.setActiveHandle(None)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def openDocument(
|
def openDocument(
|
||||||
@@ -554,7 +554,6 @@ class GuiMain(QMainWindow):
|
|||||||
if self.docEditor.loadText(tHandle, tLine):
|
if self.docEditor.loadText(tHandle, tLine):
|
||||||
SHARED.project.data.setLastHandle(tHandle, "editor")
|
SHARED.project.data.setLastHandle(tHandle, "editor")
|
||||||
self.projView.setSelectedHandle(tHandle, doScroll=doScroll)
|
self.projView.setSelectedHandle(tHandle, doScroll=doScroll)
|
||||||
self.novelView.setActiveHandle(tHandle, doScroll=doScroll)
|
|
||||||
if changeFocus:
|
if changeFocus:
|
||||||
self.docEditor.setFocus()
|
self.docEditor.setFocus()
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user