diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index 9cf0e418..6745db9d 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -58,12 +58,13 @@ logger = logging.getLogger(__name__) class GuiDocViewer(QTextBrowser): + closeDocumentRequest = pyqtSignal() documentLoaded = pyqtSignal(str) loadDocumentTagRequest = pyqtSignal(str, Enum) - closeDocumentRequest = pyqtSignal() + openDocumentRequest = pyqtSignal(str, Enum, str, bool) reloadDocumentRequest = pyqtSignal() - togglePanelVisibility = pyqtSignal() requestProjectItemSelected = pyqtSignal(str, bool) + togglePanelVisibility = pyqtSignal() def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) @@ -640,6 +641,11 @@ class GuiDocViewHeader(QWidget): self.forwardButton.setToolTip(self.tr("Go Forward")) self.forwardButton.clicked.connect(self.docViewer.navForward) + self.editButton = NIconToolButton(self, iSz) + self.editButton.setVisible(False) + self.editButton.setToolTip(self.tr("Open in Editor")) + self.editButton.clicked.connect(self._editDocument) + self.refreshButton = NIconToolButton(self, iSz) self.refreshButton.setVisible(False) self.refreshButton.setToolTip(self.tr("Reload")) @@ -658,7 +664,7 @@ class GuiDocViewHeader(QWidget): self.outerBox.addSpacing(mPx) self.outerBox.addWidget(self.itemTitle, 1) self.outerBox.addSpacing(mPx) - self.outerBox.addSpacing(iPx) + self.outerBox.addWidget(self.editButton, 0) self.outerBox.addWidget(self.refreshButton, 0) self.outerBox.addWidget(self.closeButton, 0) self.outerBox.setSpacing(0) @@ -692,8 +698,9 @@ class GuiDocViewHeader(QWidget): self.outlineButton.setVisible(False) self.backButton.setVisible(False) self.forwardButton.setVisible(False) - self.closeButton.setVisible(False) + self.editButton.setVisible(False) self.refreshButton.setVisible(False) + self.closeButton.setVisible(False) return def setOutline(self, data: dict[str, tuple[str, int]]) -> None: @@ -727,6 +734,7 @@ class GuiDocViewHeader(QWidget): self.outlineButton.setThemeIcon("list") self.backButton.setThemeIcon("backward") self.forwardButton.setThemeIcon("forward") + self.editButton.setThemeIcon("edit") self.refreshButton.setThemeIcon("refresh") self.closeButton.setThemeIcon("close") @@ -734,6 +742,7 @@ class GuiDocViewHeader(QWidget): self.outlineButton.setStyleSheet(buttonStyle) self.backButton.setStyleSheet(buttonStyle) self.forwardButton.setStyleSheet(buttonStyle) + self.editButton.setStyleSheet(buttonStyle) self.refreshButton.setStyleSheet(buttonStyle) self.closeButton.setStyleSheet(buttonStyle) @@ -776,8 +785,9 @@ class GuiDocViewHeader(QWidget): self.backButton.setVisible(True) self.forwardButton.setVisible(True) self.outlineButton.setVisible(True) - self.closeButton.setVisible(True) + self.editButton.setVisible(True) self.refreshButton.setVisible(True) + self.closeButton.setVisible(True) return @@ -804,6 +814,13 @@ class GuiDocViewHeader(QWidget): self.docViewer.reloadDocumentRequest.emit() return + @pyqtSlot() + def _editDocument(self) -> None: + """Open the document in the editor.""" + if tHandle := self._docHandle: + self.docViewer.openDocumentRequest.emit(tHandle, nwDocMode.EDIT, "", True) + return + ## # Events ## diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 11dabf78..a0d28901 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -270,6 +270,7 @@ class GuiMain(QMainWindow): self.docViewer.closeDocumentRequest.connect(self.closeDocViewer) self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle) self.docViewer.loadDocumentTagRequest.connect(self._followTag) + self.docViewer.openDocumentRequest.connect(self._openDocument) self.docViewer.reloadDocumentRequest.connect(self._reloadViewer) self.docViewer.requestProjectItemSelected.connect(self.projView.setSelectedHandle) self.docViewer.togglePanelVisibility.connect(self._toggleViewerPanelVisibility) diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py index 30b0f89e..4f391cd8 100644 --- a/tests/test_gui/test_gui_docviewer.py +++ b/tests/test_gui/test_gui_docviewer.py @@ -31,7 +31,6 @@ from PyQt5.QtWidgets import QAction, QApplication, QMenu from novelwriter import CONFIG, SHARED from novelwriter.enum import nwDocAction from novelwriter.formats.toqdoc import ToQTextDocument -from novelwriter.gui.docviewer import GuiDocViewer from novelwriter.types import QtModNone, QtMouseLeft from tests.mocked import causeException @@ -42,7 +41,8 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): """Test the document viewer.""" # Open project assert nwGUI.openProject(prjLipsum) - docViewer: GuiDocViewer = nwGUI.docViewer + docEditor = nwGUI.docEditor + docViewer = nwGUI.docViewer # Select a document in the project tree nwGUI.projView.setSelectedHandle("88243afbe5ed8") @@ -74,6 +74,12 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): docViewer.docHeader._refreshDocument() assert docViewer.toPlainText() == origText + # Open in editor + nwGUI.closeDocument() + assert docEditor.docHandle is None + docViewer.docHeader._editDocument() + assert docEditor.docHandle == docViewer.docHandle + # Select word cursor = docViewer.textCursor() cursor.setPosition(100)