From 2c24c9ef2de117de0fd6ef6140d5aa0c6d5d3756 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Fri, 14 May 2021 07:51:42 -0400 Subject: [PATCH] Compose search bar and view under parent widget --- piker/ui/_search.py | 118 +++++++++++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 46 deletions(-) diff --git a/piker/ui/_search.py b/piker/ui/_search.py index 0feeb4a8..3d271589 100644 --- a/piker/ui/_search.py +++ b/piker/ui/_search.py @@ -19,6 +19,7 @@ qompleterz: embeddable search and complete using trio, Qt and fuzzywuzzy. """ import sys +from functools import partial from typing import ( List, Optional, Callable, Awaitable, Sequence, Dict, @@ -40,6 +41,7 @@ from PyQt5.QtGui import ( QStandardItemModel, ) from PyQt5.QtWidgets import ( + QWidget, QTreeView, # QListWidgetItem, QAbstractScrollArea, @@ -220,23 +222,21 @@ class CompleterView(QTreeView): # ) -class FontSizedQLineEdit(QtWidgets.QLineEdit): +class SearchBar(QtWidgets.QLineEdit): def __init__( + self, - parent_chart: 'ChartSpace', # noqa + parent: QWidget, + parent_chart: QWidget, # noqa view: Optional[CompleterView] = None, font: DpiAwareFont = _font, + ) -> None: - super().__init__(parent_chart) - # vbox = self.vbox = QtGui.QVBoxLayout(self) - # vbox.addWidget(self) - # self.vbox.setContentsMargins(0, 0, 0, 0) - # self.vbox.setSpacing(2) - - self._view: CompleterView = view + super().__init__(parent) + self.view: CompleterView = view self.dpi_font = font self.chart_app = parent_chart @@ -262,22 +262,6 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit): def show(self) -> None: super().show() self.view.show_matches() - # self.view.show() - # self.view.resize() - - @property - def view(self) -> CompleterView: - - if self._view is None: - view = CompleterView(labels=['src', 'i', 'symbol']) - - # print('yo') - # self.chart_app.vbox.addWidget(view) - # self.vbox.addWidget(view) - - self._view = view - - return self._view def sizeHint(self) -> QtCore.QSize: """ @@ -286,7 +270,7 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit): """ psh = super().sizeHint() psh.setHeight(self.dpi_font.px_size + 2) - # psh.setHeight(12) + psh.setWidth(6*6*6) return psh def unfocus(self) -> None: @@ -303,10 +287,10 @@ _search_enabled: bool = False async def fill_results( - search: FontSizedQLineEdit, + search: SearchBar, symsearch: Callable[..., Awaitable], recv_chan: trio.abc.ReceiveChannel, - pause_time: float = 0.25, + pause_time: float = 0.0616, ) -> None: """Task to search through providers and fill in possible @@ -315,17 +299,18 @@ async def fill_results( """ global _search_active, _search_enabled - view = search.view - sel = search.view.selectionModel() - model = search.view.model() + bar = search.bar + view = bar.view + sel = bar.view.selectionModel() + model = bar.view.model() last_search_text = '' - last_text = search.text() + last_text = bar.text() repeats = 0 while True: - last_text = search.text() + last_text = bar.text() await _search_active.wait() with trio.move_on_after(pause_time) as cs: @@ -339,7 +324,7 @@ async def fill_results( log.debug(f'Ignoring fast input for {pattern}') continue - text = search.text() + text = bar.text() print(f'search: {text}') if not text: @@ -379,21 +364,59 @@ async def fill_results( QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows ) - search.show() + bar.show() + + +class SearchWidget(QtGui.QWidget): + def __init__( + self, + chart_space: 'ChartSpace', # type: ignore # noqa + columns: List[str] = ['src', 'i', 'symbol'], + parent=None, + ): + super().__init__(parent or chart_space) + + # size it as we specify + self.setSizePolicy( + QtWidgets.QSizePolicy.Fixed, + QtWidgets.QSizePolicy.Fixed, + ) + + self.chart_app = chart_space + self.vbox = QtGui.QVBoxLayout(self) + self.vbox.setContentsMargins(0, 0, 0, 0) + self.vbox.setSpacing(2) + + self.view = CompleterView( + parent=self, + labels=columns, + ) + self.bar = SearchBar( + parent=self, + parent_chart=chart_space, + view=self.view, + ) + self.vbox.addWidget(self.bar) + self.vbox.setAlignment(self.bar, Qt.AlignTop | Qt.AlignLeft) + self.vbox.addWidget(self.bar.view) + self.vbox.setAlignment(self.view, Qt.AlignTop | Qt.AlignLeft) + # self.vbox.addWidget(sel.bar.view) async def handle_keyboard_input( - search: FontSizedQLineEdit, + search: SearchWidget, recv_chan: trio.abc.ReceiveChannel, + keyboard_pause_period: float = 0.0616, ) -> None: global _search_active, _search_enabled # startup - view = search.view - view.set_font_size(search.dpi_font.px_size) + bar = search.bar + view = bar.view + view.set_font_size(bar.dpi_font.px_size) model = view.model() nidx = cidx = view.currentIndex() sel = view.selectionModel() @@ -404,10 +427,13 @@ async def handle_keyboard_input( async with trio.open_nursery() as n: # TODO: async debouncing? n.start_soon( - fill_results, - search, - symsearch, - recv, + partial( + fill_results, + search, + symsearch, + recv, + pause_time=keyboard_pause_period, + ) ) async for key, mods, txt in recv_chan: @@ -438,7 +464,7 @@ async def handle_keyboard_input( _search_enabled = False # release kb control of search bar - search.unfocus() + search.bar.unfocus() continue # selection tips: @@ -450,7 +476,7 @@ async def handle_keyboard_input( if ctrl: # cancel and close if key == Qt.Key_C: - search.unfocus() + search.bar.unfocus() # kill the search and focus back on main chart if search.chart_app: @@ -484,7 +510,7 @@ async def handle_keyboard_input( else: # relay to completer task _search_enabled = True - send.send_nowait(search.text()) + send.send_nowait(search.bar.text()) _search_active.set() @@ -504,7 +530,7 @@ if __name__ == '__main__': # results.setFocusPolicy(Qt.NoFocus) view = CompleterView(['src', 'i', 'symbol']) - search = FontSizedQLineEdit(None, view=view) + search = SearchBar(None, view=view) search.view.set_results(syms) # make a root widget to tie shit together