Added tag data to viewer panels

This commit is contained in:
Veronica Berglyd Olsen
2023-11-15 18:11:15 +01:00
parent f5901a4c8c
commit 3f8220f350
3 changed files with 122 additions and 20 deletions
+111 -14
View File
@@ -33,6 +33,8 @@ from PyQt5.QtWidgets import (
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
from novelwriter.constants import nwHeaders, nwLabels, nwLists, trConst from novelwriter.constants import nwHeaders, nwLabels, nwLists, trConst
from novelwriter.core.index import IndexHeading, IndexItem
from novelwriter.enum import nwItemClass
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -51,10 +53,13 @@ class GuiDocViewerPanel(QWidget):
self.mainTabs = QTabWidget(self) self.mainTabs = QTabWidget(self)
self.mainTabs.addTab(self.tabBackRefs, self.tr("Backreferences")) self.mainTabs.addTab(self.tabBackRefs, self.tr("Backreferences"))
self.kwTabs = {} self.kwTabs: dict[str, _ViewPanelKeyWords] = {}
self.idTabs: dict[str, int] = {}
for itemClass in nwLists.USER_CLASSES: for itemClass in nwLists.USER_CLASSES:
self.kwTabs[itemClass] = _ViewPanelKeyWords(self) cTab = _ViewPanelKeyWords(self, itemClass)
self.mainTabs.addTab(self.kwTabs[itemClass], trConst(nwLabels.CLASS_NAME[itemClass])) tabId = self.mainTabs.addTab(cTab, trConst(nwLabels.CLASS_NAME[itemClass]))
self.kwTabs[itemClass.name] = cTab
self.idTabs[itemClass.name] = tabId
# Assemble # Assemble
self.outerBox = QVBoxLayout() self.outerBox = QVBoxLayout()
@@ -68,6 +73,10 @@ class GuiDocViewerPanel(QWidget):
return return
##
# Methods
##
def updateTheme(self) -> None: def updateTheme(self) -> None:
"""Update theme elements.""" """Update theme elements."""
vPx = CONFIG.pxInt(4) vPx = CONFIG.pxInt(4)
@@ -89,6 +98,15 @@ class GuiDocViewerPanel(QWidget):
return return
def openProjectTasks(self) -> None:
"""Run open project tasks."""
for key, name, tClass, iItem, hItem in SHARED.project.index.getTagsData():
if tClass in self.kwTabs:
print(key, name, iItem, hItem)
self.kwTabs[tClass].addEntry(key, name, iItem, hItem)
self._updateTabVisibility()
return
## ##
# Public Slots # Public Slots
## ##
@@ -100,16 +118,26 @@ class GuiDocViewerPanel(QWidget):
self.tabBackRefs.refreshContent(tHandle or None) self.tabBackRefs.refreshContent(tHandle or None)
return return
##
# Internal Functions
##
def _updateTabVisibility(self) -> None:
"""Hide class tabs with no content."""
for tClass, cTab in self.kwTabs.items():
self.mainTabs.setTabVisible(self.idTabs[tClass], cTab.count() > 0)
return
# END Class GuiDocViewerPanel # END Class GuiDocViewerPanel
class _ViewPanelBackRefs(QWidget): class _ViewPanelBackRefs(QWidget):
C_DATA = 0 C_DATA = 0
C_TITLE = 0 C_TITLE = 0
C_EDIT = 1 C_EDIT = 1
C_VIEW = 2 C_VIEW = 2
C_NAME = 3 C_DOCUMENT = 3
D_HANDLE = Qt.ItemDataRole.UserRole D_HANDLE = Qt.ItemDataRole.UserRole
D_TITLE = Qt.ItemDataRole.UserRole + 1 D_TITLE = Qt.ItemDataRole.UserRole + 1
@@ -125,7 +153,7 @@ class _ViewPanelBackRefs(QWidget):
# self.listBox.setHeaderHidden(True) # self.listBox.setHeaderHidden(True)
# self.listBox.setColumnCount(4) # self.listBox.setColumnCount(4)
self.listBox.setHeaderLabels([ self.listBox.setHeaderLabels([
self.tr("Title"), "", "", self.tr("Document") self.tr("Heading"), "", "", self.tr("Document")
]) ])
self.listBox.setIndentation(0) self.listBox.setIndentation(0)
self.listBox.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.listBox.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
@@ -134,9 +162,9 @@ class _ViewPanelBackRefs(QWidget):
treeHeader = self.listBox.header() treeHeader = self.listBox.header()
treeHeader.setStretchLastSection(True) treeHeader.setStretchLastSection(True)
treeHeader.setSectionResizeMode(self.C_DOCUMENT, 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_NAME, QHeaderView.ResizeMode.ResizeToContents)
treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents) treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents)
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)
@@ -185,8 +213,8 @@ class _ViewPanelBackRefs(QWidget):
trItem.setFont(self.C_TITLE, self._hFonts[iLevel]) 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_NAME, docIcon) trItem.setIcon(self.C_DOCUMENT, docIcon)
trItem.setText(self.C_NAME, nwItem.itemName) trItem.setText(self.C_DOCUMENT, nwItem.itemName)
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)
@@ -197,10 +225,79 @@ class _ViewPanelBackRefs(QWidget):
# END Class _ViewPanelBackRefs # END Class _ViewPanelBackRefs
class _ViewPanelKeyWords(QWidget): class _ViewPanelKeyWords(QTreeWidget):
def __init__(self, parent: QWidget) -> None: C_DATA = 0
C_NAME = 0
C_EDIT = 1
C_VIEW = 2
C_TITLE = 3
C_DOCUMENT = 4
D_TAG = Qt.ItemDataRole.UserRole
D_HANDLE = Qt.ItemDataRole.UserRole + 1
def __init__(self, parent: QWidget, itemClass: nwItemClass) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self._itemClass = nwItemClass
iPx = SHARED.theme.baseIconSize
cMg = CONFIG.pxInt(6)
self.setHeaderLabels([
self.tr("Tag"), "", "", self.tr("Heading"), self.tr("Document")
])
self.setIndentation(0)
self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
self.setIconSize(QSize(iPx, iPx))
self.setFrameStyle(QFrame.Shape.NoFrame)
self.setSortingEnabled(True)
self.sortByColumn(self.C_NAME, Qt.SortOrder.AscendingOrder)
treeHeader = self.header()
treeHeader.setStretchLastSection(True)
treeHeader.setSectionResizeMode(self.C_NAME, QHeaderView.ResizeMode.ResizeToContents)
treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed)
treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed)
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
self._classIcon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[itemClass])
self._editIcon = SHARED.theme.getIcon("edit")
self._viewIcon = SHARED.theme.getIcon("view")
return
def count(self) -> int:
return self.topLevelItemCount()
def addEntry(self, tag: str, name: str, iItem: IndexItem | None,
hItem: IndexHeading | None) -> None:
"""Add a tag entry to the list."""
if not iItem or not hItem:
return
nwItem = iItem.item
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_NAME, name)
trItem.setIcon(self.C_NAME, self._classIcon)
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.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)
self.addTopLevelItem(trItem)
return return
# END Class _ViewPanelRefs # END Class _ViewPanelRefs
+10 -6
View File
@@ -377,13 +377,17 @@ class GuiOutlineTree(QTreeWidget):
fH2 = self.font() fH2 = self.font()
fH2.setBold(True) fH2.setBold(True)
iType = nwItemType.FILE
iClass = nwItemClass.NO_CLASS
iLayout = nwItemLayout.DOCUMENT
self._hFonts = [self.font(), fH1, fH2, self.font(), self.font()] self._hFonts = [self.font(), fH1, fH2, self.font(), self.font()]
self._dIcon = { self._dIcon = {
"H0": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H0"), "H0": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H0"),
"H1": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H1"), "H1": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H1"),
"H2": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H2"), "H2": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H2"),
"H3": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H3"), "H3": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H3"),
"H4": SHARED.theme.getItemIcon(nwItemType.FILE, None, nwItemLayout.DOCUMENT, "H4"), "H4": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H4"),
} }
# Internals # Internals
@@ -549,7 +553,7 @@ class GuiOutlineTree(QTreeWidget):
"""Load the state of the main tree header, that is, column order """Load the state of the main tree header, that is, column order
and column width. and column width.
""" """
# Load whatever we saved last time, regardless of wether it # Load whatever we saved last time, regardless of whether it
# contains the correct names or number of columns. # contains the correct names or number of columns.
colState = SHARED.project.options.getValue("GuiOutline", "columnState", {}) colState = SHARED.project.options.getValue("GuiOutline", "columnState", {})
+1
View File
@@ -513,6 +513,7 @@ class GuiMain(QMainWindow):
self.projView.openProjectTasks() self.projView.openProjectTasks()
self.novelView.openProjectTasks() self.novelView.openProjectTasks()
self.outlineView.openProjectTasks() self.outlineView.openProjectTasks()
self.docViewerPanel.openProjectTasks()
self._updateStatusWordCount() self._updateStatusWordCount()
# Restore previously open documents, if any # Restore previously open documents, if any