From e82d5277c0ba6bc359661b9f314980323a147b40 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:03:12 +0100 Subject: [PATCH] Add signal for re-indexed document --- novelwriter/core/index.py | 7 +- novelwriter/gui/docviewerpanel.py | 112 +++++++++++++++++------------- novelwriter/guimain.py | 1 + novelwriter/shared.py | 6 ++ 4 files changed, 73 insertions(+), 53 deletions(-) diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index 14012193..dc7ac20a 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -34,8 +34,8 @@ import logging from time import time from typing import TYPE_CHECKING, ItemsView, Iterable, Iterator from pathlib import Path -from novelwriter import SHARED +from novelwriter import SHARED from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout from novelwriter.error import logException from novelwriter.common import checkInt, isHandle, isItemClass, isTitleTag, jsonEncode @@ -283,6 +283,7 @@ class NWIndex: nowTime = time() self._indexChange = nowTime self._rootChange[tItem.itemRoot] = nowTime + SHARED.indexDocumentScanned(tHandle) return True @@ -606,9 +607,7 @@ class NWIndex: return tRefs def getBackReferenceList(self, tHandle: str) -> dict[str, tuple[str, IndexHeading]]: - """Build a list of files referring back to our file, specified - by tHandle. - """ + """Build a dict of files referring back to our file.""" if tHandle is None or tHandle not in self._itemIndex: return {} diff --git a/novelwriter/gui/docviewerpanel.py b/novelwriter/gui/docviewerpanel.py index 4673043e..3bba1124 100644 --- a/novelwriter/gui/docviewerpanel.py +++ b/novelwriter/gui/docviewerpanel.py @@ -171,11 +171,11 @@ class GuiDocViewerPanel(QWidget): class _ViewPanelBackRefs(QTreeWidget): - C_DATA = 0 - C_TITLE = 0 - C_EDIT = 1 - C_VIEW = 2 - C_DOCUMENT = 3 + C_DATA = 0 + C_DOC = 0 + C_EDIT = 1 + C_VIEW = 2 + C_TITLE = 3 D_HANDLE = Qt.ItemDataRole.UserRole D_TITLE = Qt.ItemDataRole.UserRole + 1 @@ -183,11 +183,13 @@ class _ViewPanelBackRefs(QTreeWidget): def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) + self._treeMap: dict[str, QTreeWidgetItem] = {} + iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) # Content - self.setHeaderLabels([self.tr("Heading"), "", "", self.tr("Document")]) + self.setHeaderLabels([self.tr("Document"), "", "", self.tr("First Heading")]) self.setIndentation(0) self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.setIconSize(QSize(iPx, iPx)) @@ -195,7 +197,7 @@ class _ViewPanelBackRefs(QTreeWidget): treeHeader = self.header() treeHeader.setStretchLastSection(True) - treeHeader.setSectionResizeMode(self.C_DOCUMENT, QHeaderView.ResizeMode.ResizeToContents) + treeHeader.setSectionResizeMode(self.C_DOC, QHeaderView.ResizeMode.ResizeToContents) treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed) treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed) treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents) @@ -210,47 +212,59 @@ class _ViewPanelBackRefs(QTreeWidget): def refreshContent(self, dHandle: str | None) -> None: """Update the content.""" self.clear() + self._treeMap = {} if dHandle: refs = SHARED.project.index.getBackReferenceList(dHandle) for tHandle, (sTitle, hItem) in refs.items(): - nwItem = SHARED.project.tree[tHandle] - if nwItem is None: - continue - - docIcon = SHARED.theme.getItemIcon( - nwItem.itemType, nwItem.itemClass, - nwItem.itemLayout, nwItem.mainHeading - ) - iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) if nwItem.isDocumentLayout() else 5 - hDec = SHARED.theme.getHeaderDecorationNarrow(iLevel) - - trItem = QTreeWidgetItem() - trItem.setText(self.C_TITLE, hItem.title) - trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec) - trItem.setIcon(self.C_EDIT, self._editIcon) - trItem.setIcon(self.C_VIEW, self._viewIcon) - trItem.setIcon(self.C_DOCUMENT, docIcon) - trItem.setText(self.C_DOCUMENT, nwItem.itemName) - - trItem.setData(self.C_DATA, self.D_HANDLE, tHandle) - trItem.setData(self.C_DATA, self.D_TITLE, sTitle) - - self.addTopLevelItem(trItem) + self._setTreeItemValues(tHandle, sTitle, hItem) return def refreshDocument(self, tHandle: str) -> None: """Refresh document meta data.""" + print("Ping") + iItem = SHARED.project.index.getItemData(tHandle) + if iItem: + for sTitle, hItem in iItem.items(): + self._setTreeItemValues(tHandle, sTitle, hItem) + return + + ## + # Internal Functions + ## + + def _setTreeItemValues(self, tHandle: str, sTitle: str, hItem: IndexHeading) -> None: + """Add or update a tree item.""" nwItem = SHARED.project.tree[tHandle] - if nwItem: - docIcon = SHARED.theme.getItemIcon( - nwItem.itemType, nwItem.itemClass, - nwItem.itemLayout, nwItem.mainHeading - ) - for i in range(self.topLevelItemCount()): - trItem = self.topLevelItem(i) - if trItem and trItem.data(self.C_DATA, self.D_HANDLE) == tHandle: - trItem.setIcon(self.C_DOCUMENT, docIcon) - trItem.setText(self.C_DOCUMENT, nwItem.itemName) + if nwItem is None: + return + + docIcon = SHARED.theme.getItemIcon( + nwItem.itemType, nwItem.itemClass, + nwItem.itemLayout, nwItem.mainHeading + ) + iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) if nwItem.isDocumentLayout() else 5 + hDec = SHARED.theme.getHeaderDecorationNarrow(iLevel) + + tKey = f"{tHandle}:{sTitle}" + if tKey in self._treeMap: + trItem = self._treeMap[tKey] + else: + trItem = QTreeWidgetItem() + + trItem.setIcon(self.C_DOC, docIcon) + trItem.setText(self.C_DOC, nwItem.itemName) + trItem.setIcon(self.C_EDIT, self._editIcon) + trItem.setIcon(self.C_VIEW, self._viewIcon) + trItem.setText(self.C_TITLE, hItem.title) + trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec) + + trItem.setData(self.C_DATA, self.D_HANDLE, tHandle) + trItem.setData(self.C_DATA, self.D_TITLE, sTitle) + + if tKey not in self._treeMap: + self.addTopLevelItem(trItem) + self._treeMap[tKey] = trItem + return # END Class _ViewPanelBackRefs @@ -258,12 +272,12 @@ class _ViewPanelBackRefs(QTreeWidget): class _ViewPanelKeyWords(QTreeWidget): - C_DATA = 0 - C_NAME = 0 - C_EDIT = 1 - C_VIEW = 2 - C_TITLE = 3 - C_DOCUMENT = 4 + C_DATA = 0 + C_NAME = 0 + C_EDIT = 1 + C_VIEW = 2 + C_DOC = 3 + C_TITLE = 4 D_TAG = Qt.ItemDataRole.UserRole D_HANDLE = Qt.ItemDataRole.UserRole + 1 @@ -276,7 +290,7 @@ class _ViewPanelKeyWords(QTreeWidget): iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) - self.setHeaderLabels([self.tr("Tag"), "", "", self.tr("Heading"), self.tr("Document")]) + self.setHeaderLabels([self.tr("Tag"), "", "", self.tr("Document"), self.tr("Heading")]) self.setIndentation(0) self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.setIconSize(QSize(iPx, iPx)) @@ -325,10 +339,10 @@ class _ViewPanelKeyWords(QTreeWidget): trItem.setIcon(self.C_NAME, self._classIcon) trItem.setIcon(self.C_EDIT, self._editIcon) trItem.setIcon(self.C_VIEW, self._viewIcon) + trItem.setIcon(self.C_DOC, docIcon) + trItem.setText(self.C_DOC, nwItem.itemName) trItem.setText(self.C_TITLE, hItem.title) trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec) - trItem.setIcon(self.C_DOCUMENT, docIcon) - trItem.setText(self.C_DOCUMENT, nwItem.itemName) trItem.setData(self.C_DATA, self.D_TAG, tag) trItem.setData(self.C_DATA, self.D_HANDLE, iItem.handle) diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index ad08c920..ecabc2c0 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -244,6 +244,7 @@ class GuiMain(QMainWindow): SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage) SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage) SHARED.indexChangedTags.connect(self.docViewerPanel.updateChangedTags) + SHARED.indexScannedDocument.connect(self.docViewerPanel.projectItemChanged) self.mainMenu.requestDocAction.connect(self._passDocumentAction) self.mainMenu.requestDocInsert.connect(self._passDocumentInsert) diff --git a/novelwriter/shared.py b/novelwriter/shared.py index 8ed333d6..8980a520 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -52,6 +52,7 @@ class SharedData(QObject): projectStatusChanged = pyqtSignal(bool) projectStatusMessage = pyqtSignal(str) spellLanguageChanged = pyqtSignal(str, str) + indexScannedDocument = pyqtSignal(str) indexChangedTags = pyqtSignal(list, list) def __init__(self) -> None: @@ -220,6 +221,11 @@ class SharedData(QObject): self.indexChangedTags.emit(updated, deleted) return + def indexDocumentScanned(self, tHandle: str) -> None: + """Emit the index scanned document signal.""" + self.indexScannedDocument.emit(tHandle) + return + ## # Alert Boxes ##