From 788f46bd7f8273fc6967992b5d096897494b2be9 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Nov 2023 18:25:32 +0100 Subject: [PATCH] Improve focus switching and combine with main menu entries --- novelwriter/gui/mainmenu.py | 54 +++++++++++++++++++++------------ novelwriter/gui/projtree.py | 2 +- novelwriter/gui/sidebar.py | 2 +- novelwriter/guimain.py | 60 +++++++++++++++++-------------------- 4 files changed, 65 insertions(+), 53 deletions(-) diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index e6453a82..06a137cd 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -54,6 +54,7 @@ class GuiMainMenu(QMenuBar): requestDocInsert = pyqtSignal(nwDocInsert) requestDocInsertText = pyqtSignal(str) requestDocKeyWordInsert = pyqtSignal(str) + requestFocusChange = pyqtSignal(nwWidget) def __init__(self, mainGui: GuiMain) -> None: super().__init__(parent=mainGui) @@ -246,12 +247,16 @@ class GuiMainMenu(QMenuBar): # Edit > Undo self.aEditUndo = self.editMenu.addAction(self.tr("Undo")) self.aEditUndo.setShortcut("Ctrl+Z") - self.aEditUndo.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.UNDO)) + self.aEditUndo.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.UNDO) + ) # Edit > Redo self.aEditRedo = self.editMenu.addAction(self.tr("Redo")) self.aEditRedo.setShortcut("Ctrl+Y") - self.aEditRedo.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.REDO)) + self.aEditRedo.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.REDO) + ) # Edit > Separator self.editMenu.addSeparator() @@ -259,17 +264,23 @@ class GuiMainMenu(QMenuBar): # Edit > Cut self.aEditCut = self.editMenu.addAction(self.tr("Cut")) self.aEditCut.setShortcut("Ctrl+X") - self.aEditCut.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.CUT)) + self.aEditCut.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.CUT) + ) # Edit > Copy self.aEditCopy = self.editMenu.addAction(self.tr("Copy")) self.aEditCopy.setShortcut("Ctrl+C") - self.aEditCopy.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.COPY)) + self.aEditCopy.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.COPY) + ) # Edit > Paste self.aEditPaste = self.editMenu.addAction(self.tr("Paste")) self.aEditPaste.setShortcut("Ctrl+V") - self.aEditPaste.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.PASTE)) + self.aEditPaste.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.PASTE) + ) # Edit > Separator self.editMenu.addSeparator() @@ -277,12 +288,16 @@ class GuiMainMenu(QMenuBar): # Edit > Select All self.aSelectAll = self.editMenu.addAction(self.tr("Select All")) self.aSelectAll.setShortcut("Ctrl+A") - self.aSelectAll.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.SEL_ALL)) + self.aSelectAll.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.SEL_ALL) + ) # Edit > Select Paragraph self.aSelectPar = self.editMenu.addAction(self.tr("Select Paragraph")) self.aSelectPar.setShortcut("Ctrl+Shift+A") - self.aSelectPar.triggered.connect(lambda: self.requestDocAction.emit(nwDocAction.SEL_PARA)) + self.aSelectPar.triggered.connect( + lambda: self.requestDocAction.emit(nwDocAction.SEL_PARA) + ) return @@ -293,23 +308,24 @@ class GuiMainMenu(QMenuBar): # View > TreeView self.aFocusTree = self.viewMenu.addAction(self.tr("Go to Project Tree")) - self.aFocusTree.setShortcut("Ctrl+Alt+1" if CONFIG.osWindows else "Alt+1") - self.aFocusTree.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.TREE)) + self.aFocusTree.setShortcut("Ctrl+T") + self.aFocusTree.triggered.connect( + lambda: self.requestFocusChange.emit(nwWidget.TREE) + ) - # View > Document Pane 1 + # View > Document Editor self.aFocusEditor = self.viewMenu.addAction(self.tr("Go to Document Editor")) - self.aFocusEditor.setShortcut("Ctrl+Alt+2" if CONFIG.osWindows else "Alt+2") - self.aFocusEditor.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.EDITOR)) - - # View > Document Pane 2 - self.aFocusView = self.viewMenu.addAction(self.tr("Go to Document Viewer")) - self.aFocusView.setShortcut("Ctrl+Alt+3" if CONFIG.osWindows else "Alt+3") - self.aFocusView.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.VIEWER)) + self.aFocusEditor.setShortcut("Ctrl+E") + self.aFocusEditor.triggered.connect( + lambda: self.requestFocusChange.emit(nwWidget.EDITOR) + ) # View > Outline self.aFocusOutline = self.viewMenu.addAction(self.tr("Go to Outline")) - self.aFocusOutline.setShortcut("Ctrl+Alt+4" if CONFIG.osWindows else "Alt+4") - self.aFocusOutline.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.OUTLINE)) + self.aFocusOutline.setShortcut("Ctrl+Shift+T") + self.aFocusOutline.triggered.connect( + lambda: self.requestFocusChange.emit(nwWidget.OUTLINE) + ) # View > Separator self.viewMenu.addSeparator() diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index d1c2f903..b52680d7 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -189,7 +189,7 @@ class GuiProjectView(QWidget): self.projTree.buildTree() return - def setFocus(self) -> None: + def setTreeFocus(self) -> None: """Forward the set focus call to the tree widget.""" self.projTree.setFocus() return diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py index f980aa7f..6bee63a6 100644 --- a/novelwriter/gui/sidebar.py +++ b/novelwriter/gui/sidebar.py @@ -67,7 +67,7 @@ class GuiSideBar(QWidget): self.tbNovel.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.NOVEL)) self.tbOutline = QToolButton(self) - self.tbOutline.setToolTip(self.tr("Novel Outline View")) + self.tbOutline.setToolTip(f"{0} [Ctrl+Shift+T]".format(self.tr("Novel Outline View"))) self.tbOutline.setIconSize(iconSize) self.tbOutline.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.OUTLINE)) diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 2e8682aa..c672a1f2 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -247,6 +247,7 @@ class GuiMain(QMainWindow): self.mainMenu.requestDocInsert.connect(self._passDocumentInsert) self.mainMenu.requestDocInsertText.connect(self._passDocumentInsert) self.mainMenu.requestDocKeyWordInsert.connect(self.docEditor.insertKeyWord) + self.mainMenu.requestFocusChange.connect(self.switchFocus) self.sideBar.viewChangeRequested.connect(self._changeView) @@ -312,10 +313,6 @@ class GuiMain(QMainWindow): self.keyEscape.setKey(Qt.Key.Key_Escape) self.keyEscape.activated.connect(self._keyPressEscape) - self.keyTreeView = QShortcut(self) - self.keyTreeView.setKey("Ctrl+T") - self.keyTreeView.activated.connect(self._rotateTreeView) - # Check that config loaded fine self.reportConfErr() @@ -1097,25 +1094,6 @@ class GuiMain(QMainWindow): return True - def switchFocus(self, paneNo: nwWidget) -> None: - """Switch focus between main GUI views.""" - if paneNo == nwWidget.TREE: - tabIdx = self.projStack.currentIndex() - if tabIdx == self.idxProjView: - self.projView.setFocus() - elif tabIdx == self.idxNovelView: - self.novelView.setTreeFocus() - elif paneNo == nwWidget.EDITOR: - self._changeView(nwView.EDITOR) - self.docEditor.setFocus() - elif paneNo == nwWidget.VIEWER: - self._changeView(nwView.EDITOR) - self.docViewer.setFocus() - elif paneNo == nwWidget.OUTLINE: - self._changeView(nwView.OUTLINE) - self.outlineView.setTreeFocus() - return - def closeDocViewer(self, byUser: bool = True) -> bool: """Close the document view panel.""" self.docViewer.clearViewer() @@ -1193,6 +1171,33 @@ class GuiMain(QMainWindow): return + @pyqtSlot(nwWidget) + def switchFocus(self, paneNo: nwWidget) -> None: + """Switch focus between main GUI views.""" + if paneNo == nwWidget.TREE: + if self.projStack.currentWidget() is self.projView: + if self.projView.treeHasFocus(): + self._changeView(nwView.NOVEL) + self.novelView.setTreeFocus() + else: + self.projView.setTreeFocus() + else: + if self.novelView.treeHasFocus(): + self._changeView(nwView.PROJECT) + self.projView.setTreeFocus() + else: + self.novelView.setTreeFocus() + elif paneNo == nwWidget.EDITOR: + self._changeView(nwView.EDITOR) + self.docEditor.setFocus() + elif paneNo == nwWidget.VIEWER: + self._changeView(nwView.EDITOR) + self.docViewer.setFocus() + elif paneNo == nwWidget.OUTLINE: + self._changeView(nwView.OUTLINE) + self.outlineView.setTreeFocus() + return + ## # Private Slots ## @@ -1238,15 +1243,6 @@ class GuiMain(QMainWindow): self.mainStack.setCurrentWidget(self.outlineView) return - @pyqtSlot() - def _rotateTreeView(self) -> None: - """Change view to the next tree view.""" - if self.projStack.currentWidget() is self.projView: - self._changeView(nwView.NOVEL) - else: - self._changeView(nwView.PROJECT) - return - @pyqtSlot(nwDocAction) def _passDocumentAction(self, action: nwDocAction) -> None: """Pass on a document action to the document viewer if it has