Add signal for re-indexed document

This commit is contained in:
Veronica Berglyd Olsen
2023-11-15 21:03:12 +01:00
parent 6b9d92e75a
commit e82d5277c0
4 changed files with 73 additions and 53 deletions
+3 -4
View File
@@ -34,8 +34,8 @@ import logging
from time import time from time import time
from typing import TYPE_CHECKING, ItemsView, Iterable, Iterator from typing import TYPE_CHECKING, ItemsView, Iterable, Iterator
from pathlib import Path from pathlib import Path
from novelwriter import SHARED
from novelwriter import SHARED
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
from novelwriter.error import logException from novelwriter.error import logException
from novelwriter.common import checkInt, isHandle, isItemClass, isTitleTag, jsonEncode from novelwriter.common import checkInt, isHandle, isItemClass, isTitleTag, jsonEncode
@@ -283,6 +283,7 @@ class NWIndex:
nowTime = time() nowTime = time()
self._indexChange = nowTime self._indexChange = nowTime
self._rootChange[tItem.itemRoot] = nowTime self._rootChange[tItem.itemRoot] = nowTime
SHARED.indexDocumentScanned(tHandle)
return True return True
@@ -606,9 +607,7 @@ class NWIndex:
return tRefs return tRefs
def getBackReferenceList(self, tHandle: str) -> dict[str, tuple[str, IndexHeading]]: def getBackReferenceList(self, tHandle: str) -> dict[str, tuple[str, IndexHeading]]:
"""Build a list of files referring back to our file, specified """Build a dict of files referring back to our file."""
by tHandle.
"""
if tHandle is None or tHandle not in self._itemIndex: if tHandle is None or tHandle not in self._itemIndex:
return {} return {}
+63 -49
View File
@@ -171,11 +171,11 @@ class GuiDocViewerPanel(QWidget):
class _ViewPanelBackRefs(QTreeWidget): class _ViewPanelBackRefs(QTreeWidget):
C_DATA = 0 C_DATA = 0
C_TITLE = 0 C_DOC = 0
C_EDIT = 1 C_EDIT = 1
C_VIEW = 2 C_VIEW = 2
C_DOCUMENT = 3 C_TITLE = 3
D_HANDLE = Qt.ItemDataRole.UserRole D_HANDLE = Qt.ItemDataRole.UserRole
D_TITLE = Qt.ItemDataRole.UserRole + 1 D_TITLE = Qt.ItemDataRole.UserRole + 1
@@ -183,11 +183,13 @@ class _ViewPanelBackRefs(QTreeWidget):
def __init__(self, parent: QWidget) -> None: def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self._treeMap: dict[str, QTreeWidgetItem] = {}
iPx = SHARED.theme.baseIconSize iPx = SHARED.theme.baseIconSize
cMg = CONFIG.pxInt(6) cMg = CONFIG.pxInt(6)
# Content # Content
self.setHeaderLabels([self.tr("Heading"), "", "", self.tr("Document")]) self.setHeaderLabels([self.tr("Document"), "", "", self.tr("First Heading")])
self.setIndentation(0) self.setIndentation(0)
self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
self.setIconSize(QSize(iPx, iPx)) self.setIconSize(QSize(iPx, iPx))
@@ -195,7 +197,7 @@ class _ViewPanelBackRefs(QTreeWidget):
treeHeader = self.header() treeHeader = self.header()
treeHeader.setStretchLastSection(True) 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_EDIT, QHeaderView.ResizeMode.Fixed)
treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed) treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed)
treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents) treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents)
@@ -210,47 +212,59 @@ class _ViewPanelBackRefs(QTreeWidget):
def refreshContent(self, dHandle: str | None) -> None: def refreshContent(self, dHandle: str | None) -> None:
"""Update the content.""" """Update the content."""
self.clear() self.clear()
self._treeMap = {}
if dHandle: if dHandle:
refs = SHARED.project.index.getBackReferenceList(dHandle) refs = SHARED.project.index.getBackReferenceList(dHandle)
for tHandle, (sTitle, hItem) in refs.items(): for tHandle, (sTitle, hItem) in refs.items():
nwItem = SHARED.project.tree[tHandle] self._setTreeItemValues(tHandle, sTitle, hItem)
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)
return return
def refreshDocument(self, tHandle: str) -> None: def refreshDocument(self, tHandle: str) -> None:
"""Refresh document meta data.""" """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] nwItem = SHARED.project.tree[tHandle]
if nwItem: if nwItem is None:
docIcon = SHARED.theme.getItemIcon( return
nwItem.itemType, nwItem.itemClass,
nwItem.itemLayout, nwItem.mainHeading docIcon = SHARED.theme.getItemIcon(
) nwItem.itemType, nwItem.itemClass,
for i in range(self.topLevelItemCount()): nwItem.itemLayout, nwItem.mainHeading
trItem = self.topLevelItem(i) )
if trItem and trItem.data(self.C_DATA, self.D_HANDLE) == tHandle: iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) if nwItem.isDocumentLayout() else 5
trItem.setIcon(self.C_DOCUMENT, docIcon) hDec = SHARED.theme.getHeaderDecorationNarrow(iLevel)
trItem.setText(self.C_DOCUMENT, nwItem.itemName)
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 return
# END Class _ViewPanelBackRefs # END Class _ViewPanelBackRefs
@@ -258,12 +272,12 @@ class _ViewPanelBackRefs(QTreeWidget):
class _ViewPanelKeyWords(QTreeWidget): class _ViewPanelKeyWords(QTreeWidget):
C_DATA = 0 C_DATA = 0
C_NAME = 0 C_NAME = 0
C_EDIT = 1 C_EDIT = 1
C_VIEW = 2 C_VIEW = 2
C_TITLE = 3 C_DOC = 3
C_DOCUMENT = 4 C_TITLE = 4
D_TAG = Qt.ItemDataRole.UserRole D_TAG = Qt.ItemDataRole.UserRole
D_HANDLE = Qt.ItemDataRole.UserRole + 1 D_HANDLE = Qt.ItemDataRole.UserRole + 1
@@ -276,7 +290,7 @@ class _ViewPanelKeyWords(QTreeWidget):
iPx = SHARED.theme.baseIconSize iPx = SHARED.theme.baseIconSize
cMg = CONFIG.pxInt(6) 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.setIndentation(0)
self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
self.setIconSize(QSize(iPx, iPx)) self.setIconSize(QSize(iPx, iPx))
@@ -325,10 +339,10 @@ class _ViewPanelKeyWords(QTreeWidget):
trItem.setIcon(self.C_NAME, self._classIcon) trItem.setIcon(self.C_NAME, self._classIcon)
trItem.setIcon(self.C_EDIT, self._editIcon) trItem.setIcon(self.C_EDIT, self._editIcon)
trItem.setIcon(self.C_VIEW, self._viewIcon) 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.setText(self.C_TITLE, hItem.title)
trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec) 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_TAG, tag)
trItem.setData(self.C_DATA, self.D_HANDLE, iItem.handle) trItem.setData(self.C_DATA, self.D_HANDLE, iItem.handle)
+1
View File
@@ -244,6 +244,7 @@ class GuiMain(QMainWindow):
SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage) SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage)
SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage) SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage)
SHARED.indexChangedTags.connect(self.docViewerPanel.updateChangedTags) SHARED.indexChangedTags.connect(self.docViewerPanel.updateChangedTags)
SHARED.indexScannedDocument.connect(self.docViewerPanel.projectItemChanged)
self.mainMenu.requestDocAction.connect(self._passDocumentAction) self.mainMenu.requestDocAction.connect(self._passDocumentAction)
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert) self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
+6
View File
@@ -52,6 +52,7 @@ class SharedData(QObject):
projectStatusChanged = pyqtSignal(bool) projectStatusChanged = pyqtSignal(bool)
projectStatusMessage = pyqtSignal(str) projectStatusMessage = pyqtSignal(str)
spellLanguageChanged = pyqtSignal(str, str) spellLanguageChanged = pyqtSignal(str, str)
indexScannedDocument = pyqtSignal(str)
indexChangedTags = pyqtSignal(list, list) indexChangedTags = pyqtSignal(list, list)
def __init__(self) -> None: def __init__(self) -> None:
@@ -220,6 +221,11 @@ class SharedData(QObject):
self.indexChangedTags.emit(updated, deleted) self.indexChangedTags.emit(updated, deleted)
return return
def indexDocumentScanned(self, tHandle: str) -> None:
"""Emit the index scanned document signal."""
self.indexScannedDocument.emit(tHandle)
return
## ##
# Alert Boxes # Alert Boxes
## ##