Factor selection details into completer view methods

symbol_search
Tyler Goodlet 2021-05-20 08:13:50 -04:00
parent 43d73b4a7c
commit 9d2c8a9526
1 changed files with 97 additions and 50 deletions

View File

@ -258,37 +258,69 @@ class CompleterView(QTreeView):
self.setMaximumSize(self.width() + 10, rows * row_px)
self.setFixedWidth(333)
def select_previous(self) -> QModelIndex:
cidx = self.currentIndex()
nidx = self.indexAbove(cidx)
if nidx.parent() is QModelIndex():
nidx = self.indexAbove(cidx)
breakpoint()
def previous_index(self) -> QModelIndex:
return nidx
cidx = self.selectionModel().currentIndex()
one_above = self.indexAbove(cidx)
def select_next(self) -> QModelIndex:
cidx = self.currentIndex()
nidx = self.indexBelow(cidx)
if nidx.parent() is QModelIndex():
nidx = self.indexBelow(cidx)
breakpoint()
if one_above.parent() == QModelIndex():
# if the next node up's parent is the root we don't want to select
# the next node up since it's a top level node and we only
# select entries depth >= 2.
return nidx
# see if one more up is not the root and we can select it.
two_above = self.indexAbove(one_above)
if two_above != QModelIndex():
return two_above
else:
return cidx
return one_above # just next up
def next_index(self) -> QModelIndex:
cidx = self.selectionModel().currentIndex()
one_below = self.indexBelow(cidx)
if one_below.parent() == QModelIndex():
# if the next node up's parent is the root we don't want to select
# the next node up since it's a top level node and we only
# select entries depth >= 2.
# see if one more up is not the root and we can select it.
two_below = self.indexBelow(one_below)
if two_below != QModelIndex():
return two_below
else:
return cidx
return one_below # just next up
# def first_selectable_index(self) -> QModelIndex:
def select_next(self) -> Tuple[QModelIndex, QStandardItem]:
idx = self.next_index()
assert idx.isValid()
return self.select_from_idx(idx)
def select_previous(self) -> Tuple[QModelIndex, QStandardItem]:
idx = self.previous_index()
assert idx.isValid()
return self.select_from_idx(idx)
def select_from_idx(
self,
idx: QModelIndex,
) -> Tuple[QModelIndex, QStandardItem]:
) -> QStandardItem:
# ) -> Tuple[QModelIndex, QStandardItem]:
sel = self.selectionModel()
model = self.model()
# select first indented entry
if idx == model.index(0, 0):
idx = self.select_next()
# # select first indented entry
# if idx == model.index(0, 0):
# idx = self.select_next()
sel.setCurrentIndex(
idx,
@ -296,7 +328,8 @@ class CompleterView(QTreeView):
QItemSelectionModel.Rows
)
return idx, model.itemFromIndex(idx)
return model.itemFromIndex(idx)
# return idx, model.itemFromIndex(idx)
# def find_matches(
# self,
@ -498,7 +531,6 @@ class SearchWidget(QtGui.QWidget):
'''Return the current completer tree selection as
a tuple ``(parent: str, child: str)`` if valid, else ``None``.
'''
model = self.view.model()
sel = self.view.selectionModel()
@ -537,7 +569,7 @@ async def handle_keyboard_input(
bar = search.bar
view = bar.view
view.set_font_size(bar.dpi_font.px_size)
nidx = view.currentIndex()
# nidx = view.currentIndex()
symsearch = get_multi_search()
send, recv = trio.open_memory_channel(16)
@ -560,6 +592,15 @@ async def handle_keyboard_input(
if mods == Qt.ControlModifier:
ctrl = True
alt = False
if mods == Qt.AltModifier:
alt = True
# ctrl + alt as combo
ctlalt = False
if (QtCore.Qt.AltModifier | QtCore.Qt.ControlModifier) == mods:
ctlalt = True
if key in (Qt.Key_Enter, Qt.Key_Return):
value = search.get_current()
@ -587,10 +628,12 @@ async def handle_keyboard_input(
# - first node index: index = search.index(0, 0, parent)
# - root node index: index = search.index(0, 0, QModelIndex())
# we're in select mode or cancelling
if ctrl:
# cancel and close
if (key == Qt.Key_C) or (key == Qt.Key_Space):
if ctrl and key in {
Qt.Key_C,
Qt.Key_Space, # i feel like this is the "native" one
Qt.Key_Alt,
}:
search.bar.unfocus()
# kill the search and focus back on main chart
@ -599,21 +642,25 @@ async def handle_keyboard_input(
continue
# result selection nav
if key in (Qt.Key_K, Qt.Key_J):
# selection navigation controls
elif ctrl and key in {
Qt.Key_K,
Qt.Key_J,
} or key in {
Qt.Key_Up,
Qt.Key_Down,
}:
_search_enabled = False
if key in {Qt.Key_K, Qt.Key_Up}:
item = view.select_previous()
if key == Qt.Key_K:
nidx = view.select_previous()
elif key == Qt.Key_J:
nidx = view.select_next()
if nidx.isValid():
i, item = view.select_from_idx(nidx)
elif key in {Qt.Key_J, Qt.Key_Down}:
item = view.select_next()
if item:
parent_item = item.parent()
if parent_item and parent_item.text() == 'cache':