Improve focus switching and combine with main menu entries
This commit is contained in:
+35
-19
@@ -54,6 +54,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
requestDocInsert = pyqtSignal(nwDocInsert)
|
requestDocInsert = pyqtSignal(nwDocInsert)
|
||||||
requestDocInsertText = pyqtSignal(str)
|
requestDocInsertText = pyqtSignal(str)
|
||||||
requestDocKeyWordInsert = pyqtSignal(str)
|
requestDocKeyWordInsert = pyqtSignal(str)
|
||||||
|
requestFocusChange = pyqtSignal(nwWidget)
|
||||||
|
|
||||||
def __init__(self, mainGui: GuiMain) -> None:
|
def __init__(self, mainGui: GuiMain) -> None:
|
||||||
super().__init__(parent=mainGui)
|
super().__init__(parent=mainGui)
|
||||||
@@ -246,12 +247,16 @@ class GuiMainMenu(QMenuBar):
|
|||||||
# Edit > Undo
|
# Edit > Undo
|
||||||
self.aEditUndo = self.editMenu.addAction(self.tr("Undo"))
|
self.aEditUndo = self.editMenu.addAction(self.tr("Undo"))
|
||||||
self.aEditUndo.setShortcut("Ctrl+Z")
|
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
|
# Edit > Redo
|
||||||
self.aEditRedo = self.editMenu.addAction(self.tr("Redo"))
|
self.aEditRedo = self.editMenu.addAction(self.tr("Redo"))
|
||||||
self.aEditRedo.setShortcut("Ctrl+Y")
|
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
|
# Edit > Separator
|
||||||
self.editMenu.addSeparator()
|
self.editMenu.addSeparator()
|
||||||
@@ -259,17 +264,23 @@ class GuiMainMenu(QMenuBar):
|
|||||||
# Edit > Cut
|
# Edit > Cut
|
||||||
self.aEditCut = self.editMenu.addAction(self.tr("Cut"))
|
self.aEditCut = self.editMenu.addAction(self.tr("Cut"))
|
||||||
self.aEditCut.setShortcut("Ctrl+X")
|
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
|
# Edit > Copy
|
||||||
self.aEditCopy = self.editMenu.addAction(self.tr("Copy"))
|
self.aEditCopy = self.editMenu.addAction(self.tr("Copy"))
|
||||||
self.aEditCopy.setShortcut("Ctrl+C")
|
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
|
# Edit > Paste
|
||||||
self.aEditPaste = self.editMenu.addAction(self.tr("Paste"))
|
self.aEditPaste = self.editMenu.addAction(self.tr("Paste"))
|
||||||
self.aEditPaste.setShortcut("Ctrl+V")
|
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
|
# Edit > Separator
|
||||||
self.editMenu.addSeparator()
|
self.editMenu.addSeparator()
|
||||||
@@ -277,12 +288,16 @@ class GuiMainMenu(QMenuBar):
|
|||||||
# Edit > Select All
|
# Edit > Select All
|
||||||
self.aSelectAll = self.editMenu.addAction(self.tr("Select All"))
|
self.aSelectAll = self.editMenu.addAction(self.tr("Select All"))
|
||||||
self.aSelectAll.setShortcut("Ctrl+A")
|
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
|
# Edit > Select Paragraph
|
||||||
self.aSelectPar = self.editMenu.addAction(self.tr("Select Paragraph"))
|
self.aSelectPar = self.editMenu.addAction(self.tr("Select Paragraph"))
|
||||||
self.aSelectPar.setShortcut("Ctrl+Shift+A")
|
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
|
return
|
||||||
|
|
||||||
@@ -293,23 +308,24 @@ class GuiMainMenu(QMenuBar):
|
|||||||
|
|
||||||
# View > TreeView
|
# View > TreeView
|
||||||
self.aFocusTree = self.viewMenu.addAction(self.tr("Go to Project Tree"))
|
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.setShortcut("Ctrl+T")
|
||||||
self.aFocusTree.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.TREE))
|
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 = self.viewMenu.addAction(self.tr("Go to Document Editor"))
|
||||||
self.aFocusEditor.setShortcut("Ctrl+Alt+2" if CONFIG.osWindows else "Alt+2")
|
self.aFocusEditor.setShortcut("Ctrl+E")
|
||||||
self.aFocusEditor.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.EDITOR))
|
self.aFocusEditor.triggered.connect(
|
||||||
|
lambda: self.requestFocusChange.emit(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))
|
|
||||||
|
|
||||||
# View > Outline
|
# View > Outline
|
||||||
self.aFocusOutline = self.viewMenu.addAction(self.tr("Go to 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.setShortcut("Ctrl+Shift+T")
|
||||||
self.aFocusOutline.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.OUTLINE))
|
self.aFocusOutline.triggered.connect(
|
||||||
|
lambda: self.requestFocusChange.emit(nwWidget.OUTLINE)
|
||||||
|
)
|
||||||
|
|
||||||
# View > Separator
|
# View > Separator
|
||||||
self.viewMenu.addSeparator()
|
self.viewMenu.addSeparator()
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ class GuiProjectView(QWidget):
|
|||||||
self.projTree.buildTree()
|
self.projTree.buildTree()
|
||||||
return
|
return
|
||||||
|
|
||||||
def setFocus(self) -> None:
|
def setTreeFocus(self) -> None:
|
||||||
"""Forward the set focus call to the tree widget."""
|
"""Forward the set focus call to the tree widget."""
|
||||||
self.projTree.setFocus()
|
self.projTree.setFocus()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class GuiSideBar(QWidget):
|
|||||||
self.tbNovel.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.NOVEL))
|
self.tbNovel.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.NOVEL))
|
||||||
|
|
||||||
self.tbOutline = QToolButton(self)
|
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.setIconSize(iconSize)
|
||||||
self.tbOutline.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.OUTLINE))
|
self.tbOutline.clicked.connect(lambda: self.viewChangeRequested.emit(nwView.OUTLINE))
|
||||||
|
|
||||||
|
|||||||
+28
-32
@@ -247,6 +247,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
||||||
self.mainMenu.requestDocInsertText.connect(self._passDocumentInsert)
|
self.mainMenu.requestDocInsertText.connect(self._passDocumentInsert)
|
||||||
self.mainMenu.requestDocKeyWordInsert.connect(self.docEditor.insertKeyWord)
|
self.mainMenu.requestDocKeyWordInsert.connect(self.docEditor.insertKeyWord)
|
||||||
|
self.mainMenu.requestFocusChange.connect(self.switchFocus)
|
||||||
|
|
||||||
self.sideBar.viewChangeRequested.connect(self._changeView)
|
self.sideBar.viewChangeRequested.connect(self._changeView)
|
||||||
|
|
||||||
@@ -312,10 +313,6 @@ class GuiMain(QMainWindow):
|
|||||||
self.keyEscape.setKey(Qt.Key.Key_Escape)
|
self.keyEscape.setKey(Qt.Key.Key_Escape)
|
||||||
self.keyEscape.activated.connect(self._keyPressEscape)
|
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
|
# Check that config loaded fine
|
||||||
self.reportConfErr()
|
self.reportConfErr()
|
||||||
|
|
||||||
@@ -1097,25 +1094,6 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
return True
|
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:
|
def closeDocViewer(self, byUser: bool = True) -> bool:
|
||||||
"""Close the document view panel."""
|
"""Close the document view panel."""
|
||||||
self.docViewer.clearViewer()
|
self.docViewer.clearViewer()
|
||||||
@@ -1193,6 +1171,33 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
return
|
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
|
# Private Slots
|
||||||
##
|
##
|
||||||
@@ -1238,15 +1243,6 @@ class GuiMain(QMainWindow):
|
|||||||
self.mainStack.setCurrentWidget(self.outlineView)
|
self.mainStack.setCurrentWidget(self.outlineView)
|
||||||
return
|
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)
|
@pyqtSlot(nwDocAction)
|
||||||
def _passDocumentAction(self, action: nwDocAction) -> None:
|
def _passDocumentAction(self, action: nwDocAction) -> None:
|
||||||
"""Pass on a document action to the document viewer if it has
|
"""Pass on a document action to the document viewer if it has
|
||||||
|
|||||||
Reference in New Issue
Block a user