Improve handling of focus switch with search widget

This commit is contained in:
Veronica Berglyd Olsen
2024-03-25 11:44:56 +01:00
parent a4d8c22cd0
commit 33e0895cdf
4 changed files with 26 additions and 34 deletions
+2 -3
View File
@@ -318,10 +318,9 @@ class DocSearch:
def iterSearch(self, search: str) -> Iterable[tuple[NWItem, list[tuple[int, int, str]]]]:
"""Iteratively search through documents in the project."""
num = len(search)
cap = min(num+100, 100)
storage = self._project.storage
regEx = QRegularExpression(self._buildPattern(search), self._rxOpts)
print(regEx.pattern())
logger.debug("Searching with pattern '%s'", regEx.pattern())
for item in self._project.tree:
if item.isFileType():
text = storage.getDocument(item.itemHandle).readDocument() or ""
@@ -331,7 +330,7 @@ class DocSearch:
rxMatch = rxItt.next()
pos = rxMatch.capturedStart()
num = rxMatch.capturedLength()
context = text[pos:pos+cap].partition("\n")[0]
context = text[pos:pos+100].partition("\n")[0]
results.append((pos, num, context))
yield item, results
return
+6
View File
@@ -138,6 +138,12 @@ class GuiProjectSearch(QWidget):
self._searchResultSelected(items[0], 0)
return
def beginSearch(self) -> None:
"""Focus the search box and select its text, if any."""
self.searchText.setFocus()
self.searchText.selectAll()
return
##
# Events
##
+17 -30
View File
@@ -154,6 +154,8 @@ class GuiMain(QMainWindow):
self.splitView.setHandleWidth(hWd)
self.splitView.setOpaqueResize(False)
self.splitView.setSizes(CONFIG.viewPanePos)
self.splitView.setCollapsible(0, False)
self.splitView.setCollapsible(1, False)
# Splitter : Document Editor / Document Viewer
self.splitDocs = QSplitter(Qt.Horizontal, self)
@@ -161,6 +163,8 @@ class GuiMain(QMainWindow):
self.splitDocs.addWidget(self.splitView)
self.splitDocs.setOpaqueResize(False)
self.splitDocs.setHandleWidth(hWd)
self.splitDocs.setCollapsible(0, False)
self.splitDocs.setCollapsible(1, False)
# Splitter : Project Tree / Document Area
self.splitMain = QSplitter(Qt.Horizontal)
@@ -170,6 +174,10 @@ class GuiMain(QMainWindow):
self.splitMain.setOpaqueResize(False)
self.splitMain.setHandleWidth(hWd)
self.splitMain.setSizes(CONFIG.mainPanePos)
self.splitMain.setCollapsible(0, False)
self.splitMain.setCollapsible(0, False)
self.splitMain.setStretchFactor(1, 0)
self.splitMain.setStretchFactor(1, 1)
# Main Stack : Editor / Outline
self.mainStack = QStackedWidget(self)
@@ -177,32 +185,6 @@ class GuiMain(QMainWindow):
self.mainStack.addWidget(self.outlineView)
self.mainStack.currentChanged.connect(self._mainStackChanged)
# Indices of Splitter Widgets
self.idxTree = self.splitMain.indexOf(self.treePane)
self.idxMain = self.splitMain.indexOf(self.splitDocs)
self.idxEditor = self.splitDocs.indexOf(self.docEditor)
self.idxViewer = self.splitDocs.indexOf(self.splitView)
self.idxViewDoc = self.splitView.indexOf(self.docViewer)
self.idxViewDocPanel = self.splitView.indexOf(self.docViewerPanel)
# Indices of Stack Widgets
self.idxEditorView = self.mainStack.indexOf(self.splitMain)
self.idxOutlineView = self.mainStack.indexOf(self.outlineView)
self.idxProjView = self.projStack.indexOf(self.projView)
self.idxNovelView = self.projStack.indexOf(self.novelView)
self.idxProjSearch = self.projStack.indexOf(self.projSearch)
# Splitter Behaviour
self.splitMain.setCollapsible(self.idxTree, False)
self.splitMain.setCollapsible(self.idxMain, False)
self.splitDocs.setCollapsible(self.idxEditor, False)
self.splitDocs.setCollapsible(self.idxViewer, False)
self.splitView.setCollapsible(self.idxViewDoc, False)
self.splitView.setCollapsible(self.idxViewDocPanel, False)
self.splitMain.setStretchFactor(self.idxTree, 0)
self.splitMain.setStretchFactor(self.idxMain, 1)
# Editor / Viewer Default State
self.splitView.setVisible(False)
self.docEditor.closeSearch()
@@ -1035,12 +1017,15 @@ class GuiMain(QMainWindow):
self.novelView.setTreeFocus()
else:
self.projView.setTreeFocus()
else:
elif self.projStack.currentWidget() is self.novelView:
if self.novelView.treeHasFocus():
self._changeView(nwView.PROJECT)
self.projView.setTreeFocus()
else:
self.novelView.setTreeFocus()
else:
self._changeView(nwView.PROJECT)
self.projView.setTreeFocus()
elif paneNo == nwWidget.EDITOR:
self._changeView(nwView.EDITOR)
self.docEditor.setFocus()
@@ -1185,6 +1170,7 @@ class GuiMain(QMainWindow):
elif view == nwView.SEARCH:
self.mainStack.setCurrentWidget(self.splitMain)
self.projStack.setCurrentWidget(self.projSearch)
self.projSearch.beginSearch()
elif view == nwView.OUTLINE:
self.mainStack.setCurrentWidget(self.outlineView)
return
@@ -1293,7 +1279,7 @@ class GuiMain(QMainWindow):
@pyqtSlot(int)
def _mainStackChanged(self, index: int) -> None:
"""Process main window tab change."""
if index == self.idxOutlineView:
if self.mainStack.widget(index) == self.outlineView:
if SHARED.hasProject:
self.outlineView.refreshTree()
return
@@ -1302,9 +1288,10 @@ class GuiMain(QMainWindow):
def _projStackChanged(self, index: int) -> None:
"""Process project view tab change."""
sHandle = None
if index == self.idxProjView:
widget = self.projStack.widget(index)
if widget == self.projView:
sHandle = self.projView.getSelectedHandle()
elif index == self.idxNovelView:
elif widget == self.novelView:
sHandle, _ = self.novelView.getSelectedHandle()
self.itemDetails.updateViewBox(sHandle)
return
+1 -1
View File
@@ -85,7 +85,7 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
novelView.setTreeFocus()
nwGUI.projStack.setCurrentIndex(nwGUI.idxNovelView)
nwGUI.projStack.setCurrentWidget(nwGUI.novelView)
nwGUI.rebuildIndex()
novelTree._populateTree(rootHandle=None)
assert novelTree.topLevelItemCount() == 3