From 2fc8e43e718ecf90157e263960573285b7d8b5dc Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:38:45 +0100 Subject: [PATCH] Connect the edit and view buttons --- novelwriter/gui/docviewerpanel.py | 59 +++++++++++++++++++++++++++---- novelwriter/guimain.py | 3 ++ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/novelwriter/gui/docviewerpanel.py b/novelwriter/gui/docviewerpanel.py index ea5382de..e428ae53 100644 --- a/novelwriter/gui/docviewerpanel.py +++ b/novelwriter/gui/docviewerpanel.py @@ -25,7 +25,9 @@ from __future__ import annotations import logging -from PyQt5.QtCore import QSize, Qt, pyqtSlot +from enum import Enum + +from PyQt5.QtCore import QModelIndex, QSize, Qt, pyqtSignal, pyqtSlot from PyQt5.QtWidgets import ( QAbstractItemView, QFrame, QHeaderView, QTabWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget @@ -34,13 +36,16 @@ from PyQt5.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.constants import nwHeaders, nwLabels, nwLists, trConst from novelwriter.core.index import IndexHeading, IndexItem -from novelwriter.enum import nwItemClass +from novelwriter.enum import nwDocMode, nwItemClass logger = logging.getLogger(__name__) class GuiDocViewerPanel(QWidget): + loadDocumentTagRequest = pyqtSignal(str, Enum) + openDocumentRequest = pyqtSignal(str, Enum, str, bool) + def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) @@ -180,21 +185,23 @@ class _ViewPanelBackRefs(QTreeWidget): D_HANDLE = Qt.ItemDataRole.UserRole D_TITLE = Qt.ItemDataRole.UserRole + 1 - def __init__(self, parent: QWidget) -> None: - super().__init__(parent=parent) + def __init__(self, docViewerPanel: GuiDocViewerPanel) -> None: + super().__init__(parent=docViewerPanel) + + self.docViewerPanel = docViewerPanel self._treeMap: dict[str, QTreeWidgetItem] = {} iPx = SHARED.theme.baseIconSize cMg = CONFIG.pxInt(6) - # Content self.setHeaderLabels([self.tr("Document"), "", "", self.tr("First Heading")]) self.setIndentation(0) self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection) self.setIconSize(QSize(iPx, iPx)) self.setFrameStyle(QFrame.Shape.NoFrame) + # Set Header Sizes treeHeader = self.header() treeHeader.setStretchLastSection(True) treeHeader.setSectionResizeMode(self.C_DOC, QHeaderView.ResizeMode.ResizeToContents) @@ -204,9 +211,13 @@ class _ViewPanelBackRefs(QTreeWidget): treeHeader.resizeSection(self.C_EDIT, iPx + cMg) treeHeader.resizeSection(self.C_VIEW, iPx + cMg) + # Cache Icons Locally self._editIcon = SHARED.theme.getIcon("edit") self._viewIcon = SHARED.theme.getIcon("view") + # Signals + self.clicked.connect(self._treeItemClicked) + return def refreshContent(self, dHandle: str | None) -> None: @@ -228,6 +239,20 @@ class _ViewPanelBackRefs(QTreeWidget): self._setTreeItemValues(tHandle, sTitle, hItem) return + ## + # Private Slots + ## + + @pyqtSlot("QModelIndex") + def _treeItemClicked(self, index: QModelIndex) -> None: + """The user clicked on an item in the tree.""" + tHandle = index.siblingAtColumn(self.C_DATA).data(self.D_HANDLE) + if index.column() == self.C_EDIT: + self.docViewerPanel.openDocumentRequest.emit(tHandle, nwDocMode.EDIT, "", True) + elif index.column() == self.C_VIEW: + self.docViewerPanel.openDocumentRequest.emit(tHandle, nwDocMode.VIEW, "", True) + return + ## # Internal Functions ## @@ -282,8 +307,10 @@ class _ViewPanelKeyWords(QTreeWidget): D_TAG = Qt.ItemDataRole.UserRole D_HANDLE = Qt.ItemDataRole.UserRole + 1 - def __init__(self, parent: QWidget, itemClass: nwItemClass) -> None: - super().__init__(parent=parent) + def __init__(self, docViewerPanel: GuiDocViewerPanel, itemClass: nwItemClass) -> None: + super().__init__(parent=docViewerPanel) + + self.docViewerPanel = docViewerPanel self._tagMap: dict[str, QTreeWidgetItem] = {} @@ -304,6 +331,7 @@ class _ViewPanelKeyWords(QTreeWidget): 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.setSectionResizeMode(self.C_DOC, QHeaderView.ResizeMode.ResizeToContents) treeHeader.resizeSection(self.C_EDIT, iPx + cMg) treeHeader.resizeSection(self.C_VIEW, iPx + cMg) @@ -312,6 +340,9 @@ class _ViewPanelKeyWords(QTreeWidget): self._editIcon = SHARED.theme.getIcon("edit") self._viewIcon = SHARED.theme.getIcon("view") + # Signals + self.clicked.connect(self._treeItemClicked) + return def count(self) -> int: @@ -360,4 +391,18 @@ class _ViewPanelKeyWords(QTreeWidget): return True return False + ## + # Private Slots + ## + + @pyqtSlot("QModelIndex") + def _treeItemClicked(self, index: QModelIndex) -> None: + """The user clicked on an item in the tree.""" + tag = index.siblingAtColumn(self.C_DATA).data(self.D_TAG) + if index.column() == self.C_EDIT: + self.docViewerPanel.loadDocumentTagRequest.emit(tag, nwDocMode.EDIT) + elif index.column() == self.C_VIEW: + self.docViewerPanel.loadDocumentTagRequest.emit(tag, nwDocMode.VIEW) + return + # END Class _ViewPanelRefs diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 9e794027..68815c76 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -286,6 +286,9 @@ class GuiMain(QMainWindow): self.docViewer.loadDocumentTagRequest.connect(self._followTag) self.docViewer.togglePanelVisibility.connect(self._toggleViewerPanelVisibility) + self.docViewerPanel.loadDocumentTagRequest.connect(self._followTag) + self.docViewerPanel.openDocumentRequest.connect(self._openDocument) + self.outlineView.loadDocumentTagRequest.connect(self._followTag) self.outlineView.openDocumentRequest.connect(self._openDocument)