Add signal for processing tag changes
This commit is contained in:
@@ -646,6 +646,17 @@ class NWIndex:
|
|||||||
yield tag, data.get("name", ""), data.get("class", ""), iItem, hItem
|
yield tag, data.get("name", ""), data.get("class", ""), iItem, hItem
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def getSingleTag(self, tagKey: str) -> tuple[str, str, IndexItem | None, IndexHeading | None]:
|
||||||
|
"""Return tag data for a specific tag."""
|
||||||
|
tName = self._tagsIndex.tagName(tagKey)
|
||||||
|
tClass = self._tagsIndex.tagClass(tagKey)
|
||||||
|
tHandle = self._tagsIndex.tagHandle(tagKey)
|
||||||
|
tHeading = self._tagsIndex.tagHeading(tagKey)
|
||||||
|
if tName and tClass and tHandle and tHeading:
|
||||||
|
iItem = self._itemIndex[tHandle]
|
||||||
|
return tName, tClass, iItem, None if iItem is None else iItem[tHeading]
|
||||||
|
return "", "", None, None
|
||||||
|
|
||||||
# END Class NWIndex
|
# END Class NWIndex
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ import logging
|
|||||||
|
|
||||||
from PyQt5.QtCore import QSize, Qt, pyqtSlot
|
from PyQt5.QtCore import QSize, Qt, pyqtSlot
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QAbstractItemView, QFrame, QHBoxLayout, QHeaderView, QTabWidget, QTreeWidget, QTreeWidgetItem,
|
QAbstractItemView, QFrame, QHeaderView, QTabWidget, QTreeWidget,
|
||||||
QVBoxLayout, QWidget
|
QTreeWidgetItem, QVBoxLayout, QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
@@ -100,13 +100,25 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
|
|
||||||
def openProjectTasks(self) -> None:
|
def openProjectTasks(self) -> None:
|
||||||
"""Run open project tasks."""
|
"""Run open project tasks."""
|
||||||
|
self.clearClassTabs()
|
||||||
for key, name, tClass, iItem, hItem in SHARED.project.index.getTagsData():
|
for key, name, tClass, iItem, hItem in SHARED.project.index.getTagsData():
|
||||||
if tClass in self.kwTabs:
|
if tClass in self.kwTabs:
|
||||||
print(key, name, iItem, hItem)
|
|
||||||
self.kwTabs[tClass].addEntry(key, name, iItem, hItem)
|
self.kwTabs[tClass].addEntry(key, name, iItem, hItem)
|
||||||
self._updateTabVisibility()
|
self._updateTabVisibility()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def closeProjectTasks(self) -> None:
|
||||||
|
"""Run closing project tasks."""
|
||||||
|
self.tabBackRefs.refreshContent(None)
|
||||||
|
self.clearClassTabs()
|
||||||
|
return
|
||||||
|
|
||||||
|
def clearClassTabs(self) -> None:
|
||||||
|
"""Clear all the class tabs"""
|
||||||
|
for cTab in self.kwTabs.values():
|
||||||
|
cTab.clear()
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Public Slots
|
# Public Slots
|
||||||
##
|
##
|
||||||
@@ -118,6 +130,25 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
self.tabBackRefs.refreshContent(tHandle or None)
|
self.tabBackRefs.refreshContent(tHandle or None)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(list, list)
|
||||||
|
def updateChangedTags(self, added: list[str], deleted: list[str]) -> None:
|
||||||
|
"""Forward tags changes to the lists."""
|
||||||
|
for key in added:
|
||||||
|
name, tClass, iItem, hItem = SHARED.project.index.getSingleTag(key)
|
||||||
|
if tClass in self.kwTabs:
|
||||||
|
self.kwTabs[tClass].addEntry(key, name, iItem, hItem)
|
||||||
|
|
||||||
|
for key in deleted:
|
||||||
|
for cTab in self.kwTabs.values():
|
||||||
|
if cTab.removeEntry(key):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
logger.warning("Could not remove tag '%s' from view panel", key)
|
||||||
|
|
||||||
|
self._updateTabVisibility()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Internal Functions
|
# Internal Functions
|
||||||
##
|
##
|
||||||
@@ -131,7 +162,7 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
# END Class GuiDocViewerPanel
|
# END Class GuiDocViewerPanel
|
||||||
|
|
||||||
|
|
||||||
class _ViewPanelBackRefs(QWidget):
|
class _ViewPanelBackRefs(QTreeWidget):
|
||||||
|
|
||||||
C_DATA = 0
|
C_DATA = 0
|
||||||
C_TITLE = 0
|
C_TITLE = 0
|
||||||
@@ -149,18 +180,15 @@ class _ViewPanelBackRefs(QWidget):
|
|||||||
cMg = CONFIG.pxInt(6)
|
cMg = CONFIG.pxInt(6)
|
||||||
|
|
||||||
# Content
|
# Content
|
||||||
self.listBox = QTreeWidget(self)
|
self.setHeaderLabels([
|
||||||
# self.listBox.setHeaderHidden(True)
|
|
||||||
# self.listBox.setColumnCount(4)
|
|
||||||
self.listBox.setHeaderLabels([
|
|
||||||
self.tr("Heading"), "", "", self.tr("Document")
|
self.tr("Heading"), "", "", self.tr("Document")
|
||||||
])
|
])
|
||||||
self.listBox.setIndentation(0)
|
self.setIndentation(0)
|
||||||
self.listBox.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
|
self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
|
||||||
self.listBox.setIconSize(QSize(iPx, iPx))
|
self.setIconSize(QSize(iPx, iPx))
|
||||||
self.listBox.setFrameStyle(QFrame.Shape.NoFrame)
|
self.setFrameStyle(QFrame.Shape.NoFrame)
|
||||||
|
|
||||||
treeHeader = self.listBox.header()
|
treeHeader = self.header()
|
||||||
treeHeader.setStretchLastSection(True)
|
treeHeader.setStretchLastSection(True)
|
||||||
treeHeader.setSectionResizeMode(self.C_DOCUMENT, QHeaderView.ResizeMode.ResizeToContents)
|
treeHeader.setSectionResizeMode(self.C_DOCUMENT, QHeaderView.ResizeMode.ResizeToContents)
|
||||||
treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed)
|
treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed)
|
||||||
@@ -169,30 +197,14 @@ class _ViewPanelBackRefs(QWidget):
|
|||||||
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
||||||
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
|
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
|
||||||
|
|
||||||
fH1 = self.font()
|
|
||||||
fH1.setBold(True)
|
|
||||||
fH1.setUnderline(True)
|
|
||||||
|
|
||||||
fH2 = self.font()
|
|
||||||
fH2.setBold(True)
|
|
||||||
|
|
||||||
self._hFonts = [self.font(), fH1, fH2, self.font(), self.font(), self.font()]
|
|
||||||
self._editIcon = SHARED.theme.getIcon("edit")
|
self._editIcon = SHARED.theme.getIcon("edit")
|
||||||
self._viewIcon = SHARED.theme.getIcon("view")
|
self._viewIcon = SHARED.theme.getIcon("view")
|
||||||
|
|
||||||
# Assemble
|
|
||||||
self.outerBox = QHBoxLayout()
|
|
||||||
self.outerBox.addWidget(self.listBox)
|
|
||||||
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def refreshContent(self, dHandle: str | None) -> None:
|
def refreshContent(self, dHandle: str | None) -> None:
|
||||||
"""Update the content."""
|
"""Update the content."""
|
||||||
self.listBox.clear()
|
self.clear()
|
||||||
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():
|
||||||
@@ -210,7 +222,6 @@ class _ViewPanelBackRefs(QWidget):
|
|||||||
trItem = QTreeWidgetItem()
|
trItem = QTreeWidgetItem()
|
||||||
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.setFont(self.C_TITLE, self._hFonts[iLevel])
|
|
||||||
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_DOCUMENT, docIcon)
|
trItem.setIcon(self.C_DOCUMENT, docIcon)
|
||||||
@@ -219,7 +230,7 @@ class _ViewPanelBackRefs(QWidget):
|
|||||||
trItem.setData(self.C_DATA, self.D_HANDLE, tHandle)
|
trItem.setData(self.C_DATA, self.D_HANDLE, tHandle)
|
||||||
trItem.setData(self.C_DATA, self.D_TITLE, sTitle)
|
trItem.setData(self.C_DATA, self.D_TITLE, sTitle)
|
||||||
|
|
||||||
self.listBox.addTopLevelItem(trItem)
|
self.addTopLevelItem(trItem)
|
||||||
return
|
return
|
||||||
|
|
||||||
# END Class _ViewPanelBackRefs
|
# END Class _ViewPanelBackRefs
|
||||||
@@ -240,6 +251,7 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|||||||
def __init__(self, parent: QWidget, itemClass: nwItemClass) -> None:
|
def __init__(self, parent: QWidget, itemClass: nwItemClass) -> None:
|
||||||
super().__init__(parent=parent)
|
super().__init__(parent=parent)
|
||||||
self._itemClass = nwItemClass
|
self._itemClass = nwItemClass
|
||||||
|
self._tagMap: dict[str, QTreeWidgetItem] = {}
|
||||||
|
|
||||||
iPx = SHARED.theme.baseIconSize
|
iPx = SHARED.theme.baseIconSize
|
||||||
cMg = CONFIG.pxInt(6)
|
cMg = CONFIG.pxInt(6)
|
||||||
@@ -297,7 +309,16 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|||||||
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)
|
||||||
self.addTopLevelItem(trItem)
|
self.addTopLevelItem(trItem)
|
||||||
|
self._tagMap[tag] = trItem
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def removeEntry(self, tag: str) -> bool:
|
||||||
|
"""Remove a tag from the list."""
|
||||||
|
if tag in self._tagMap:
|
||||||
|
self.takeTopLevelItem(self.indexOfTopLevelItem(self._tagMap[tag]))
|
||||||
|
self._tagMap.pop(tag, None)
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
# END Class _ViewPanelRefs
|
# END Class _ViewPanelRefs
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
self.setDragDropMode(QAbstractItemView.InternalMove)
|
self.setDragDropMode(QAbstractItemView.InternalMove)
|
||||||
self.setDropIndicatorShown(True)
|
self.setDropIndicatorShown(True)
|
||||||
|
|
||||||
# Disable built-in autoscroll as it isn't working in some Qt
|
# Disable built-in auto scroll as it isn't working in some Qt
|
||||||
# releases (see #1561) and instead use our own implementation
|
# releases (see #1561) and instead use our own implementation
|
||||||
self.setAutoScroll(False)
|
self.setAutoScroll(False)
|
||||||
|
|
||||||
@@ -533,7 +533,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
self.itemDoubleClicked.connect(self._treeDoubleClick)
|
self.itemDoubleClicked.connect(self._treeDoubleClick)
|
||||||
self.itemSelectionChanged.connect(self._treeSelectionChange)
|
self.itemSelectionChanged.connect(self._treeSelectionChange)
|
||||||
|
|
||||||
# Autoscroll
|
# Auto Scroll
|
||||||
self._scrollMargin = SHARED.theme.baseIconSize
|
self._scrollMargin = SHARED.theme.baseIconSize
|
||||||
self._scrollDirection = 0
|
self._scrollDirection = 0
|
||||||
self._scrollTimer = QTimer()
|
self._scrollTimer = QTimer()
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ class GuiMain(QMainWindow):
|
|||||||
SHARED.projectStatusChanged.connect(self.mainStatus.updateProjectStatus)
|
SHARED.projectStatusChanged.connect(self.mainStatus.updateProjectStatus)
|
||||||
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)
|
||||||
|
|
||||||
self.mainMenu.requestDocAction.connect(self._passDocumentAction)
|
self.mainMenu.requestDocAction.connect(self._passDocumentAction)
|
||||||
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
||||||
@@ -440,6 +441,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.docViewer.clearNavHistory()
|
self.docViewer.clearNavHistory()
|
||||||
self.closeDocViewer(byUser=False)
|
self.closeDocViewer(byUser=False)
|
||||||
|
|
||||||
|
self.docViewerPanel.closeProjectTasks()
|
||||||
self.outlineView.closeProjectTasks()
|
self.outlineView.closeProjectTasks()
|
||||||
self.novelView.closeProjectTasks()
|
self.novelView.closeProjectTasks()
|
||||||
self.projView.clearProjectView()
|
self.projView.clearProjectView()
|
||||||
@@ -809,6 +811,7 @@ class GuiMain(QMainWindow):
|
|||||||
tStart = time()
|
tStart = time()
|
||||||
|
|
||||||
self.projView.saveProjectTasks()
|
self.projView.saveProjectTasks()
|
||||||
|
self.docViewerPanel.clearClassTabs()
|
||||||
SHARED.project.index.rebuildIndex()
|
SHARED.project.index.rebuildIndex()
|
||||||
self.projView.populateTree()
|
self.projView.populateTree()
|
||||||
self.novelView.refreshTree()
|
self.novelView.refreshTree()
|
||||||
|
|||||||
@@ -52,7 +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)
|
||||||
indexChangedTags = pyqtSignal(list[str], list[str])
|
indexChangedTags = pyqtSignal(list, list)
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|||||||
Reference in New Issue
Block a user