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]]]]:
|
def iterSearch(self, search: str) -> Iterable[tuple[NWItem, list[tuple[int, int, str]]]]:
|
||||||
"""Iteratively search through documents in the project."""
|
"""Iteratively search through documents in the project."""
|
||||||
num = len(search)
|
num = len(search)
|
||||||
cap = min(num+100, 100)
|
|
||||||
storage = self._project.storage
|
storage = self._project.storage
|
||||||
regEx = QRegularExpression(self._buildPattern(search), self._rxOpts)
|
regEx = QRegularExpression(self._buildPattern(search), self._rxOpts)
|
||||||
print(regEx.pattern())
|
logger.debug("Searching with pattern '%s'", regEx.pattern())
|
||||||
for item in self._project.tree:
|
for item in self._project.tree:
|
||||||
if item.isFileType():
|
if item.isFileType():
|
||||||
text = storage.getDocument(item.itemHandle).readDocument() or ""
|
text = storage.getDocument(item.itemHandle).readDocument() or ""
|
||||||
@@ -331,7 +330,7 @@ class DocSearch:
|
|||||||
rxMatch = rxItt.next()
|
rxMatch = rxItt.next()
|
||||||
pos = rxMatch.capturedStart()
|
pos = rxMatch.capturedStart()
|
||||||
num = rxMatch.capturedLength()
|
num = rxMatch.capturedLength()
|
||||||
context = text[pos:pos+cap].partition("\n")[0]
|
context = text[pos:pos+100].partition("\n")[0]
|
||||||
results.append((pos, num, context))
|
results.append((pos, num, context))
|
||||||
yield item, results
|
yield item, results
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -138,6 +138,12 @@ class GuiProjectSearch(QWidget):
|
|||||||
self._searchResultSelected(items[0], 0)
|
self._searchResultSelected(items[0], 0)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def beginSearch(self) -> None:
|
||||||
|
"""Focus the search box and select its text, if any."""
|
||||||
|
self.searchText.setFocus()
|
||||||
|
self.searchText.selectAll()
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Events
|
# Events
|
||||||
##
|
##
|
||||||
|
|||||||
+17
-30
@@ -154,6 +154,8 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitView.setHandleWidth(hWd)
|
self.splitView.setHandleWidth(hWd)
|
||||||
self.splitView.setOpaqueResize(False)
|
self.splitView.setOpaqueResize(False)
|
||||||
self.splitView.setSizes(CONFIG.viewPanePos)
|
self.splitView.setSizes(CONFIG.viewPanePos)
|
||||||
|
self.splitView.setCollapsible(0, False)
|
||||||
|
self.splitView.setCollapsible(1, False)
|
||||||
|
|
||||||
# Splitter : Document Editor / Document Viewer
|
# Splitter : Document Editor / Document Viewer
|
||||||
self.splitDocs = QSplitter(Qt.Horizontal, self)
|
self.splitDocs = QSplitter(Qt.Horizontal, self)
|
||||||
@@ -161,6 +163,8 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitDocs.addWidget(self.splitView)
|
self.splitDocs.addWidget(self.splitView)
|
||||||
self.splitDocs.setOpaqueResize(False)
|
self.splitDocs.setOpaqueResize(False)
|
||||||
self.splitDocs.setHandleWidth(hWd)
|
self.splitDocs.setHandleWidth(hWd)
|
||||||
|
self.splitDocs.setCollapsible(0, False)
|
||||||
|
self.splitDocs.setCollapsible(1, False)
|
||||||
|
|
||||||
# Splitter : Project Tree / Document Area
|
# Splitter : Project Tree / Document Area
|
||||||
self.splitMain = QSplitter(Qt.Horizontal)
|
self.splitMain = QSplitter(Qt.Horizontal)
|
||||||
@@ -170,6 +174,10 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitMain.setOpaqueResize(False)
|
self.splitMain.setOpaqueResize(False)
|
||||||
self.splitMain.setHandleWidth(hWd)
|
self.splitMain.setHandleWidth(hWd)
|
||||||
self.splitMain.setSizes(CONFIG.mainPanePos)
|
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
|
# Main Stack : Editor / Outline
|
||||||
self.mainStack = QStackedWidget(self)
|
self.mainStack = QStackedWidget(self)
|
||||||
@@ -177,32 +185,6 @@ class GuiMain(QMainWindow):
|
|||||||
self.mainStack.addWidget(self.outlineView)
|
self.mainStack.addWidget(self.outlineView)
|
||||||
self.mainStack.currentChanged.connect(self._mainStackChanged)
|
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
|
# Editor / Viewer Default State
|
||||||
self.splitView.setVisible(False)
|
self.splitView.setVisible(False)
|
||||||
self.docEditor.closeSearch()
|
self.docEditor.closeSearch()
|
||||||
@@ -1035,12 +1017,15 @@ class GuiMain(QMainWindow):
|
|||||||
self.novelView.setTreeFocus()
|
self.novelView.setTreeFocus()
|
||||||
else:
|
else:
|
||||||
self.projView.setTreeFocus()
|
self.projView.setTreeFocus()
|
||||||
else:
|
elif self.projStack.currentWidget() is self.novelView:
|
||||||
if self.novelView.treeHasFocus():
|
if self.novelView.treeHasFocus():
|
||||||
self._changeView(nwView.PROJECT)
|
self._changeView(nwView.PROJECT)
|
||||||
self.projView.setTreeFocus()
|
self.projView.setTreeFocus()
|
||||||
else:
|
else:
|
||||||
self.novelView.setTreeFocus()
|
self.novelView.setTreeFocus()
|
||||||
|
else:
|
||||||
|
self._changeView(nwView.PROJECT)
|
||||||
|
self.projView.setTreeFocus()
|
||||||
elif paneNo == nwWidget.EDITOR:
|
elif paneNo == nwWidget.EDITOR:
|
||||||
self._changeView(nwView.EDITOR)
|
self._changeView(nwView.EDITOR)
|
||||||
self.docEditor.setFocus()
|
self.docEditor.setFocus()
|
||||||
@@ -1185,6 +1170,7 @@ class GuiMain(QMainWindow):
|
|||||||
elif view == nwView.SEARCH:
|
elif view == nwView.SEARCH:
|
||||||
self.mainStack.setCurrentWidget(self.splitMain)
|
self.mainStack.setCurrentWidget(self.splitMain)
|
||||||
self.projStack.setCurrentWidget(self.projSearch)
|
self.projStack.setCurrentWidget(self.projSearch)
|
||||||
|
self.projSearch.beginSearch()
|
||||||
elif view == nwView.OUTLINE:
|
elif view == nwView.OUTLINE:
|
||||||
self.mainStack.setCurrentWidget(self.outlineView)
|
self.mainStack.setCurrentWidget(self.outlineView)
|
||||||
return
|
return
|
||||||
@@ -1293,7 +1279,7 @@ class GuiMain(QMainWindow):
|
|||||||
@pyqtSlot(int)
|
@pyqtSlot(int)
|
||||||
def _mainStackChanged(self, index: int) -> None:
|
def _mainStackChanged(self, index: int) -> None:
|
||||||
"""Process main window tab change."""
|
"""Process main window tab change."""
|
||||||
if index == self.idxOutlineView:
|
if self.mainStack.widget(index) == self.outlineView:
|
||||||
if SHARED.hasProject:
|
if SHARED.hasProject:
|
||||||
self.outlineView.refreshTree()
|
self.outlineView.refreshTree()
|
||||||
return
|
return
|
||||||
@@ -1302,9 +1288,10 @@ class GuiMain(QMainWindow):
|
|||||||
def _projStackChanged(self, index: int) -> None:
|
def _projStackChanged(self, index: int) -> None:
|
||||||
"""Process project view tab change."""
|
"""Process project view tab change."""
|
||||||
sHandle = None
|
sHandle = None
|
||||||
if index == self.idxProjView:
|
widget = self.projStack.widget(index)
|
||||||
|
if widget == self.projView:
|
||||||
sHandle = self.projView.getSelectedHandle()
|
sHandle = self.projView.getSelectedHandle()
|
||||||
elif index == self.idxNovelView:
|
elif widget == self.novelView:
|
||||||
sHandle, _ = self.novelView.getSelectedHandle()
|
sHandle, _ = self.novelView.getSelectedHandle()
|
||||||
self.itemDetails.updateViewBox(sHandle)
|
self.itemDetails.updateViewBox(sHandle)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
|
|||||||
|
|
||||||
novelView.setTreeFocus()
|
novelView.setTreeFocus()
|
||||||
|
|
||||||
nwGUI.projStack.setCurrentIndex(nwGUI.idxNovelView)
|
nwGUI.projStack.setCurrentWidget(nwGUI.novelView)
|
||||||
nwGUI.rebuildIndex()
|
nwGUI.rebuildIndex()
|
||||||
novelTree._populateTree(rootHandle=None)
|
novelTree._populateTree(rootHandle=None)
|
||||||
assert novelTree.topLevelItemCount() == 3
|
assert novelTree.topLevelItemCount() == 3
|
||||||
|
|||||||
Reference in New Issue
Block a user