Add signal for re-indexed document
This commit is contained in:
@@ -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 {}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
##
|
||||
|
||||
Reference in New Issue
Block a user