Populate the back reference panel
This commit is contained in:
@@ -596,7 +596,7 @@ class NWIndex:
|
|||||||
|
|
||||||
return tRefs
|
return tRefs
|
||||||
|
|
||||||
def getBackReferenceList(self, tHandle: str) -> dict[str, str]:
|
def getBackReferenceList(self, tHandle: str) -> dict[str, tuple[str, IndexHeading]]:
|
||||||
"""Build a list of files referring back to our file, specified
|
"""Build a list of files referring back to our file, specified
|
||||||
by tHandle.
|
by tHandle.
|
||||||
"""
|
"""
|
||||||
@@ -611,7 +611,7 @@ class NWIndex:
|
|||||||
for aHandle, sTitle, hItem in self._itemIndex.iterAllHeaders():
|
for aHandle, sTitle, hItem in self._itemIndex.iterAllHeaders():
|
||||||
for aTag in hItem.references:
|
for aTag in hItem.references:
|
||||||
if aTag in tTags and aHandle not in tRefs:
|
if aTag in tTags and aHandle not in tRefs:
|
||||||
tRefs[aHandle] = sTitle
|
tRefs[aHandle] = (sTitle, hItem)
|
||||||
|
|
||||||
return tRefs
|
return tRefs
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class GuiDocViewer(QTextBrowser):
|
class GuiDocViewer(QTextBrowser):
|
||||||
|
|
||||||
|
documentLoaded = pyqtSignal(str)
|
||||||
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
||||||
togglePanelVisibility = pyqtSignal()
|
togglePanelVisibility = pyqtSignal()
|
||||||
|
|
||||||
@@ -191,6 +192,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
"""Load text into the viewer from an item handle."""
|
"""Load text into the viewer from an item handle."""
|
||||||
if not SHARED.project.tree.checkType(tHandle, nwItemType.FILE):
|
if not SHARED.project.tree.checkType(tHandle, nwItemType.FILE):
|
||||||
logger.warning("Item not found")
|
logger.warning("Item not found")
|
||||||
|
self.documentLoaded.emit("")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.debug("Generating preview for item '%s'", tHandle)
|
logger.debug("Generating preview for item '%s'", tHandle)
|
||||||
@@ -248,6 +250,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
# the document dirty again to make sure it's re-rendered properly.
|
# the document dirty again to make sure it's re-rendered properly.
|
||||||
self.redrawText()
|
self.redrawText()
|
||||||
qApp.restoreOverrideCursor()
|
qApp.restoreOverrideCursor()
|
||||||
|
self.documentLoaded.emit(tHandle)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,14 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QTabWidget, QVBoxLayout, QWidget
|
from PyQt5.QtCore import QSize, Qt, pyqtSlot
|
||||||
|
from PyQt5.QtWidgets import (
|
||||||
|
QFrame, QHBoxLayout, QHeaderView, QTabWidget, QTreeWidget, QTreeWidgetItem,
|
||||||
|
QVBoxLayout, QWidget
|
||||||
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.constants import nwLabels, nwLists, trConst
|
from novelwriter.constants import nwHeaders, nwLabels, nwLists, trConst
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -70,6 +74,7 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
hCol = self.palette().highlight().color()
|
hCol = self.palette().highlight().color()
|
||||||
|
|
||||||
styleSheet = (
|
styleSheet = (
|
||||||
|
"QTabWidget::pane {border: 0;} "
|
||||||
"QTabWidget QTabBar::tab {"
|
"QTabWidget QTabBar::tab {"
|
||||||
f"border: 0; padding: {vPx}px {rPx}px {vPx}px {lPx}px;"
|
f"border: 0; padding: {vPx}px {rPx}px {vPx}px {lPx}px;"
|
||||||
"} "
|
"} "
|
||||||
@@ -81,25 +86,98 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
##
|
||||||
|
# Public Slots
|
||||||
|
##
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def updateHandle(self, tHandle: str | None) -> None:
|
||||||
|
"""Update the document handle."""
|
||||||
|
self.tabBackRefs.refreshContent(tHandle or None)
|
||||||
|
return
|
||||||
|
|
||||||
# END Class GuiDocViewerPanel
|
# END Class GuiDocViewerPanel
|
||||||
|
|
||||||
|
|
||||||
class _ViewPanelBackRefs(QWidget):
|
class _ViewPanelBackRefs(QWidget):
|
||||||
|
|
||||||
|
C_DATA = 0
|
||||||
|
C_TITLE = 0
|
||||||
|
C_NAME = 1
|
||||||
|
C_SYNOPSIS = 2
|
||||||
|
|
||||||
|
D_HANDLE = Qt.ItemDataRole.UserRole
|
||||||
|
D_TITLE = Qt.ItemDataRole.UserRole + 1
|
||||||
|
|
||||||
def __init__(self, parent: QWidget) -> None:
|
def __init__(self, parent: QWidget) -> None:
|
||||||
super().__init__(parent=parent)
|
super().__init__(parent=parent)
|
||||||
|
|
||||||
|
iPx = SHARED.theme.baseIconSize
|
||||||
|
|
||||||
|
# Content
|
||||||
|
self.listBox = QTreeWidget(self)
|
||||||
|
# self.listBox.setHeaderHidden(True)
|
||||||
|
# self.listBox.setColumnCount(3)
|
||||||
|
self.listBox.setHeaderLabels([
|
||||||
|
self.tr("Title"), self.tr("Document"), self.tr("Synopsis")
|
||||||
|
])
|
||||||
|
self.listBox.setIndentation(0)
|
||||||
|
self.listBox.setIconSize(QSize(iPx, iPx))
|
||||||
|
self.listBox.setFrameStyle(QFrame.Shape.NoFrame)
|
||||||
|
|
||||||
|
treeHeader = self.listBox.header()
|
||||||
|
treeHeader.setStretchLastSection(True)
|
||||||
|
treeHeader.setSectionResizeMode(self.C_NAME, QHeaderView.ResizeMode.ResizeToContents)
|
||||||
|
treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents)
|
||||||
|
|
||||||
|
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()]
|
||||||
|
|
||||||
|
# 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):
|
def refreshContent(self, dHandle: str | None) -> None:
|
||||||
""""""
|
"""Update the content."""
|
||||||
# theRefs = SHARED.project.index.getBackReferenceList(tHandle)
|
self.listBox.clear()
|
||||||
# theList = []
|
if dHandle:
|
||||||
# for tHandle in theRefs:
|
refs = SHARED.project.index.getBackReferenceList(dHandle)
|
||||||
# tItem = SHARED.project.tree[tHandle]
|
for tHandle, (sTitle, hItem) in refs.items():
|
||||||
# if tItem is not None:
|
nwItem = SHARED.project.tree[tHandle]
|
||||||
# theList.append("<a href='%s#%s' %s>%s</a>" % (
|
if nwItem is None:
|
||||||
# tHandle, theRefs[tHandle], self.linkStyle, tItem.itemName
|
continue
|
||||||
# ))
|
|
||||||
|
icon = SHARED.theme.getItemIcon(
|
||||||
|
nwItem.itemType, nwItem.itemClass,
|
||||||
|
nwItem.itemLayout, nwItem.mainHeading
|
||||||
|
)
|
||||||
|
iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0)
|
||||||
|
hDec = SHARED.theme.getHeaderDecoration(iLevel)
|
||||||
|
|
||||||
|
trItem = QTreeWidgetItem()
|
||||||
|
trItem.setText(self.C_TITLE, hItem.title)
|
||||||
|
trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec)
|
||||||
|
trItem.setFont(self.C_TITLE, self._hFonts[iLevel])
|
||||||
|
trItem.setIcon(self.C_NAME, icon)
|
||||||
|
trItem.setText(self.C_NAME, nwItem.itemName)
|
||||||
|
trItem.setText(self.C_SYNOPSIS, hItem.synopsis)
|
||||||
|
|
||||||
|
trItem.setData(self.C_DATA, self.D_HANDLE, tHandle)
|
||||||
|
trItem.setData(self.C_DATA, self.D_TITLE, sTitle)
|
||||||
|
|
||||||
|
self.listBox.addTopLevelItem(trItem)
|
||||||
return
|
return
|
||||||
|
|
||||||
# END Class _ViewPanelBackRefs
|
# END Class _ViewPanelBackRefs
|
||||||
|
|||||||
@@ -277,6 +277,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.docEditor.closeDocumentRequest.connect(self.closeDocEditor)
|
self.docEditor.closeDocumentRequest.connect(self.closeDocEditor)
|
||||||
self.docEditor.toggleFocusModeRequest.connect(self.toggleFocusMode)
|
self.docEditor.toggleFocusModeRequest.connect(self.toggleFocusMode)
|
||||||
|
|
||||||
|
self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle)
|
||||||
self.docViewer.loadDocumentTagRequest.connect(self._followTag)
|
self.docViewer.loadDocumentTagRequest.connect(self._followTag)
|
||||||
self.docViewer.togglePanelVisibility.connect(self._toggleViewerPanelVisibility)
|
self.docViewer.togglePanelVisibility.connect(self._toggleViewerPanelVisibility)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user