More UX features
- load previous search state on open - show cached on empty search bar - allow ctrl-u/d to navigate provider "sections"symbol_search
parent
8129fcc648
commit
67498c60af
|
@ -235,7 +235,7 @@ class CompleterView(QTreeView):
|
||||||
else:
|
else:
|
||||||
return cidx
|
return cidx
|
||||||
|
|
||||||
return one_below # just next up
|
return one_below # just next down
|
||||||
|
|
||||||
def select_from_idx(
|
def select_from_idx(
|
||||||
|
|
||||||
|
@ -278,6 +278,26 @@ class CompleterView(QTreeView):
|
||||||
assert idx.isValid()
|
assert idx.isValid()
|
||||||
return self.select_from_idx(idx)
|
return self.select_from_idx(idx)
|
||||||
|
|
||||||
|
def next_section(self, direction: str = 'down') -> QModelIndex:
|
||||||
|
cidx = start_idx = self.selectionModel().currentIndex()
|
||||||
|
|
||||||
|
# step up levels to depth == 1
|
||||||
|
while cidx.parent() != QModelIndex():
|
||||||
|
cidx = cidx.parent()
|
||||||
|
|
||||||
|
# move to next section in `direction`
|
||||||
|
op = {'up': -1, 'down': +1}[direction]
|
||||||
|
next_row = cidx.row() + op
|
||||||
|
nidx = self.model().index(next_row, cidx.column(), QModelIndex())
|
||||||
|
|
||||||
|
# do nothing, if there is no valid "next" section
|
||||||
|
if not nidx.isValid():
|
||||||
|
return self.select_from_idx(start_idx)
|
||||||
|
|
||||||
|
# go to next selectable child item
|
||||||
|
self.select_from_idx(nidx)
|
||||||
|
return self.select_next()
|
||||||
|
|
||||||
def set_results(
|
def set_results(
|
||||||
self,
|
self,
|
||||||
results: Dict[str, Sequence[str]],
|
results: Dict[str, Sequence[str]],
|
||||||
|
@ -370,7 +390,7 @@ class SearchBar(QtWidgets.QLineEdit):
|
||||||
# self.setStyleSheet(f"font: 18px")
|
# self.setStyleSheet(f"font: 18px")
|
||||||
|
|
||||||
def focus(self) -> None:
|
def focus(self) -> None:
|
||||||
self.clear()
|
self.selectAll()
|
||||||
self.show()
|
self.show()
|
||||||
self.setFocus()
|
self.setFocus()
|
||||||
|
|
||||||
|
@ -433,8 +453,11 @@ class SearchWidget(QtGui.QWidget):
|
||||||
self.vbox.setAlignment(self.view, Qt.AlignTop | Qt.AlignLeft)
|
self.vbox.setAlignment(self.view, Qt.AlignTop | Qt.AlignLeft)
|
||||||
|
|
||||||
def focus(self) -> None:
|
def focus(self) -> None:
|
||||||
# fill cache list
|
|
||||||
self.view.set_results({'cache': list(self.chart_app._chart_cache)})
|
if self.view.model().rowCount(QModelIndex()) == 0:
|
||||||
|
# fill cache list if nothing existing
|
||||||
|
self.view.set_results({'cache': list(self.chart_app._chart_cache)})
|
||||||
|
|
||||||
self.bar.focus()
|
self.bar.focus()
|
||||||
|
|
||||||
def get_current_item(self) -> Optional[Tuple[str, str]]:
|
def get_current_item(self) -> Optional[Tuple[str, str]]:
|
||||||
|
@ -580,15 +603,15 @@ async def handle_keyboard_input(
|
||||||
|
|
||||||
log.debug(f'key: {key}, mods: {mods}, txt: {txt}')
|
log.debug(f'key: {key}, mods: {mods}, txt: {txt}')
|
||||||
|
|
||||||
ctrl = False
|
ctl = False
|
||||||
if mods == Qt.ControlModifier:
|
if mods == Qt.ControlModifier:
|
||||||
ctrl = True
|
ctl = True
|
||||||
|
|
||||||
# alt = False
|
# alt = False
|
||||||
# if mods == Qt.AltModifier:
|
# if mods == Qt.AltModifier:
|
||||||
# alt = True
|
# alt = True
|
||||||
|
|
||||||
# # ctrl + alt as combo
|
# # ctl + alt as combo
|
||||||
# ctlalt = False
|
# ctlalt = False
|
||||||
# if (QtCore.Qt.AltModifier | QtCore.Qt.ControlModifier) == mods:
|
# if (QtCore.Qt.AltModifier | QtCore.Qt.ControlModifier) == mods:
|
||||||
# ctlalt = True
|
# ctlalt = True
|
||||||
|
@ -609,10 +632,21 @@ async def handle_keyboard_input(
|
||||||
symbol,
|
symbol,
|
||||||
'info',
|
'info',
|
||||||
)
|
)
|
||||||
|
search.bar.clear()
|
||||||
|
view.set_results({
|
||||||
|
'cache': list(search.chart_app._chart_cache)
|
||||||
|
})
|
||||||
|
|
||||||
_search_enabled = False
|
_search_enabled = False
|
||||||
# release kb control of search bar
|
# release kb control of search bar
|
||||||
search.bar.unfocus()
|
# search.bar.unfocus()
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif not ctl and not bar.text():
|
||||||
|
# if nothing in search text show the cache
|
||||||
|
view.set_results({
|
||||||
|
'cache': list(search.chart_app._chart_cache)
|
||||||
|
})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# selection tips:
|
# selection tips:
|
||||||
|
@ -621,7 +655,7 @@ async def handle_keyboard_input(
|
||||||
# - root node index: index = search.index(0, 0, QModelIndex())
|
# - root node index: index = search.index(0, 0, QModelIndex())
|
||||||
|
|
||||||
# cancel and close
|
# cancel and close
|
||||||
if ctrl and key in {
|
if ctl and key in {
|
||||||
Qt.Key_C,
|
Qt.Key_C,
|
||||||
Qt.Key_Space, # i feel like this is the "native" one
|
Qt.Key_Space, # i feel like this is the "native" one
|
||||||
Qt.Key_Alt,
|
Qt.Key_Alt,
|
||||||
|
@ -635,7 +669,18 @@ async def handle_keyboard_input(
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# selection navigation controls
|
# selection navigation controls
|
||||||
elif ctrl and key in {
|
elif ctl and key in {
|
||||||
|
Qt.Key_D,
|
||||||
|
}:
|
||||||
|
view.next_section(direction='down')
|
||||||
|
|
||||||
|
elif ctl and key in {
|
||||||
|
Qt.Key_U,
|
||||||
|
}:
|
||||||
|
view.next_section(direction='up')
|
||||||
|
|
||||||
|
# selection navigation controls
|
||||||
|
elif ctl and key in {
|
||||||
|
|
||||||
Qt.Key_K,
|
Qt.Key_K,
|
||||||
Qt.Key_J,
|
Qt.Key_J,
|
||||||
|
@ -654,6 +699,7 @@ async def handle_keyboard_input(
|
||||||
|
|
||||||
if item:
|
if item:
|
||||||
parent_item = item.parent()
|
parent_item = item.parent()
|
||||||
|
|
||||||
if parent_item and parent_item.text() == 'cache':
|
if parent_item and parent_item.text() == 'cache':
|
||||||
|
|
||||||
value = search.get_current_item()
|
value = search.get_current_item()
|
||||||
|
@ -666,7 +712,7 @@ async def handle_keyboard_input(
|
||||||
'info',
|
'info',
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
elif not ctl:
|
||||||
# relay to completer task
|
# relay to completer task
|
||||||
_search_enabled = True
|
_search_enabled = True
|
||||||
send.send_nowait(search.bar.text())
|
send.send_nowait(search.bar.text())
|
||||||
|
|
Loading…
Reference in New Issue