Extend and refactor current open document highlighting

This commit is contained in:
Veronica Berglyd Olsen
2024-10-30 19:12:09 +01:00
parent 92d148b03d
commit fa0bef5500
4 changed files with 68 additions and 34 deletions
+17 -11
View File
@@ -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
+27 -18
View File
@@ -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
## ##
+20
View File
@@ -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
+4 -5
View File
@@ -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: