From d35dfda92f464358fd3fc9738f2c382e8eeef6af Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 23 Nov 2023 19:04:35 +0100 Subject: [PATCH] Change set selection from doc header to use a signal/slot set --- novelwriter/gui/doceditor.py | 4 +++- novelwriter/gui/docviewer.py | 4 +++- novelwriter/gui/projtree.py | 7 ++++++- novelwriter/guimain.py | 2 ++ tests/test_gui/test_gui_docviewer.py | 11 +++++++---- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 39dcdc07..f1ae127b 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -97,6 +97,7 @@ class GuiDocEditor(QPlainTextEdit): spellCheckStateChanged = pyqtSignal(bool) closeDocumentRequest = pyqtSignal() toggleFocusModeRequest = pyqtSignal() + requestProjectItemSelected = pyqtSignal(str, bool) def __init__(self, mainGui: GuiMain) -> None: super().__init__(parent=mainGui) @@ -2943,7 +2944,8 @@ class GuiDocEditHeader(QWidget): """Capture a click on the title and ensure that the item is selected in the project tree. """ - self.mainGui.projView.setSelectedHandle(self._docHandle, doScroll=True) + if event.button() == Qt.MouseButton.LeftButton: + self.docEditor.requestProjectItemSelected.emit(self._docHandle, True) return # END Class GuiDocEditHeader diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index a3bdcae8..5df05810 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -59,6 +59,7 @@ class GuiDocViewer(QTextBrowser): documentLoaded = pyqtSignal(str) loadDocumentTagRequest = pyqtSignal(str, Enum) togglePanelVisibility = pyqtSignal() + requestProjectItemSelected = pyqtSignal(str, bool) def __init__(self, mainGui: GuiMain) -> None: super().__init__(parent=mainGui) @@ -834,7 +835,8 @@ class GuiDocViewHeader(QWidget): """Capture a click on the title and ensure that the item is selected in the project tree. """ - self.mainGui.projView.setSelectedHandle(self._docHandle, doScroll=True) + if event.button() == Qt.MouseButton.LeftButton: + self.docViewer.requestProjectItemSelected.emit(self._docHandle, True) return # END Class GuiDocViewHeader diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index 4b261afd..d55a0602 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -138,7 +138,6 @@ class GuiProjectView(QWidget): self.emptyTrash = self.projTree.emptyTrash self.requestDeleteItem = self.projTree.requestDeleteItem self.getSelectedHandle = self.projTree.getSelectedHandle - self.setSelectedHandle = self.projTree.setSelectedHandle self.changedSince = self.projTree.changedSince self.createNewNote = self.projTree.createNewNote @@ -203,6 +202,12 @@ class GuiProjectView(QWidget): # Public Slots ## + @pyqtSlot(str, bool) + def setSelectedHandle(self, tHandle: str, doScroll: bool = False) -> None: + """Select an item and optionally scroll it into view.""" + self.projTree.setSelectedHandle(tHandle, doScroll=doScroll) + return + @pyqtSlot(str) def updateItemValues(self, tHandle: str) -> None: """Update tree item""" diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 635e9b8f..4e885b24 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -284,10 +284,12 @@ class GuiMain(QMainWindow): self.docEditor.spellCheckStateChanged.connect(self.mainMenu.setSpellCheckState) self.docEditor.closeDocumentRequest.connect(self.closeDocEditor) self.docEditor.toggleFocusModeRequest.connect(self.toggleFocusMode) + self.docEditor.requestProjectItemSelected.connect(self.projView.setSelectedHandle) self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle) self.docViewer.loadDocumentTagRequest.connect(self._followTag) self.docViewer.togglePanelVisibility.connect(self._toggleViewerPanelVisibility) + self.docViewer.requestProjectItemSelected.connect(self.projView.setSelectedHandle) self.docViewerPanel.loadDocumentTagRequest.connect(self._followTag) self.docViewerPanel.openDocumentRequest.connect(self._openDocument) diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py index b05e35b1..a5fdc77b 100644 --- a/tests/test_gui/test_gui_docviewer.py +++ b/tests/test_gui/test_gui_docviewer.py @@ -23,8 +23,8 @@ import pytest from mocked import causeException -from PyQt5.QtGui import QTextCursor -from PyQt5.QtCore import Qt, QUrl +from PyQt5.QtGui import QMouseEvent, QTextCursor +from PyQt5.QtCore import QEvent, QPoint, Qt, QUrl from PyQt5.QtWidgets import QMenu, qApp, QAction from novelwriter import CONFIG, SHARED @@ -58,7 +58,10 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): assert nwGUI.projView.projTree.getSelectedHandle() is None # Re-select via header click - docViewer.docHeader.mousePressEvent(None) # type: ignore + button = Qt.MouseButton.LeftButton + modifier = Qt.KeyboardModifier.NoModifier + event = QMouseEvent(QEvent.MouseButtonPress, QPoint(), button, button, modifier) + docViewer.docHeader.mousePressEvent(event) assert nwGUI.projView.projTree.getSelectedHandle() == "88243afbe5ed8" # Reload the text @@ -127,7 +130,7 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, prjLipsum): assert docViewer.docAction(nwDocAction.COPY) is False # Open again via menu - assert nwGUI.projView.setSelectedHandle("88243afbe5ed8") + assert nwGUI.projView.projTree.setSelectedHandle("88243afbe5ed8") nwGUI.mainMenu.aViewDoc.activate(QAction.Trigger) # Open context menu