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