Improve handling of focus switch with search widget
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user