Add better keyboard navigation support

This commit is contained in:
Veronica Berglyd Olsen
2024-03-24 16:24:48 +01:00
parent becb404203
commit a4d8c22cd0
2 changed files with 48 additions and 7 deletions
+43 -4
View File
@@ -26,7 +26,7 @@ from __future__ import annotations
import logging import logging
from PyQt5.QtCore import QSize, Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import QSize, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QPalette from PyQt5.QtGui import QKeyEvent, QPalette
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QHBoxLayout, QLabel, QLineEdit, QToolBar, QTreeWidget, QTreeWidgetItem, QHBoxLayout, QLabel, QLineEdit, QToolBar, QTreeWidget, QTreeWidgetItem,
QVBoxLayout, QWidget QVBoxLayout, QWidget
@@ -45,7 +45,7 @@ class GuiProjectSearch(QWidget):
D_HANDLE = Qt.ItemDataRole.UserRole D_HANDLE = Qt.ItemDataRole.UserRole
D_RESULT = Qt.ItemDataRole.UserRole + 1 D_RESULT = Qt.ItemDataRole.UserRole + 1
openDocumentSelectRequest = pyqtSignal(str, int, int) openDocumentSelectRequest = pyqtSignal(str, int, int, bool)
def __init__(self, parent: QWidget) -> None: def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
@@ -91,6 +91,7 @@ class GuiProjectSearch(QWidget):
self.searchResult.setIconSize(QSize(iPx, iPx)) self.searchResult.setIconSize(QSize(iPx, iPx))
self.searchResult.setIndentation(iPx) self.searchResult.setIndentation(iPx)
self.searchResult.itemPressed.connect(self._searchResultSelected) self.searchResult.itemPressed.connect(self._searchResultSelected)
self.searchResult.itemDoubleClicked.connect(self._searchResultDoubleClicked)
# Assemble # Assemble
self.headerBox = QHBoxLayout() self.headerBox = QHBoxLayout()
@@ -130,9 +131,38 @@ class GuiProjectSearch(QWidget):
return return
def processReturn(self) -> None: def processReturn(self) -> None:
"""Process a return key press forwarded from main GUI.""" """Process a return keypress forwarded from the main GUI."""
if self.searchText.hasFocus(): if self.searchText.hasFocus():
self._processSearch() self._processSearch()
elif items := self.searchResult.selectedItems():
self._searchResultSelected(items[0], 0)
return
##
# Events
##
def keyPressEvent(self, event: QKeyEvent) -> None:
"""Process key press events. This handles up and down arrow key
presses to jump between search text box and result tree.
"""
if (
event.key() == Qt.Key.Key_Down
and self.searchText.hasFocus()
and (first := self.searchResult.topLevelItem(0))
):
first.setSelected(True)
self.searchResult.setFocus()
elif (
event.key() == Qt.Key.Key_Up
and self.searchResult.hasFocus()
and (first := self.searchResult.topLevelItem(0))
and first.isSelected()
):
first.setSelected(False)
self.searchText.setFocus()
else:
super().keyPressEvent(event)
return return
## ##
@@ -157,7 +187,16 @@ class GuiProjectSearch(QWidget):
"""Process search result selection.""" """Process search result selection."""
if (data := item.data(0, self.D_RESULT)) and len(data) == 3: if (data := item.data(0, self.D_RESULT)) and len(data) == 3:
self.openDocumentSelectRequest.emit( self.openDocumentSelectRequest.emit(
str(data[0]), checkInt(data[1], -1), checkInt(data[2], -1) str(data[0]), checkInt(data[1], -1), checkInt(data[2], -1), False
)
return
@pyqtSlot("QTreeWidgetItem*", int)
def _searchResultDoubleClicked(self, item: QTreeWidgetItem, column: int) -> None:
"""Process search result double click."""
if (data := item.data(0, self.D_RESULT)) and len(data) == 3:
self.openDocumentSelectRequest.emit(
str(data[0]), checkInt(data[1], -1), checkInt(data[2], -1), True
) )
return return
+5 -3
View File
@@ -1152,10 +1152,12 @@ class GuiMain(QMainWindow):
self.viewDocument(tHandle=tHandle, sTitle=sTitle) self.viewDocument(tHandle=tHandle, sTitle=sTitle)
return return
@pyqtSlot(str, int, int) @pyqtSlot(str, int, int, bool)
def _openDocumentSelection(self, tHandle: str, selStart: int, selLength: int) -> None: def _openDocumentSelection(
self, tHandle: str, selStart: int, selLength: int, changeFocus: bool
) -> None:
"""Open a document and select a section of the text.""" """Open a document and select a section of the text."""
if self.openDocument(tHandle): if self.openDocument(tHandle, changeFocus=changeFocus):
self.docEditor.setCursorSelection(selStart, selLength) self.docEditor.setCursorSelection(selStart, selLength)
return return