From 33e0895cdfcbb930750adf22d706a538c64bf85c Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:44:56 +0100 Subject: [PATCH] Improve handling of focus switch with search widget --- novelwriter/core/coretools.py | 5 ++- novelwriter/gui/search.py | 6 ++++ novelwriter/guimain.py | 47 ++++++++++------------------ tests/test_gui/test_gui_noveltree.py | 2 +- 4 files changed, 26 insertions(+), 34 deletions(-) diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 7ecd04d7..d007a771 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -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 diff --git a/novelwriter/gui/search.py b/novelwriter/gui/search.py index aaf60c12..a91c5a4e 100644 --- a/novelwriter/gui/search.py +++ b/novelwriter/gui/search.py @@ -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 ## diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index e51aa7f2..77293e0d 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -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 diff --git a/tests/test_gui/test_gui_noveltree.py b/tests/test_gui/test_gui_noveltree.py index 25dfbf61..120b66be 100644 --- a/tests/test_gui/test_gui_noveltree.py +++ b/tests/test_gui/test_gui_noveltree.py @@ -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