Make search kb handling async
							parent
							
								
									2861f321ce
								
							
						
					
					
						commit
						60d44f30ee
					
				| 
						 | 
					@ -18,12 +18,13 @@
 | 
				
			||||||
qompleterz: embeddable search and complete using trio, Qt and fuzzywuzzy.
 | 
					qompleterz: embeddable search and complete using trio, Qt and fuzzywuzzy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
from typing import Dict, List, Optional
 | 
					from typing import List, Optional
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PyQt5 import QtCore, QtGui
 | 
					from PyQt5 import QtCore, QtGui
 | 
				
			||||||
from PyQt5.QtCore import Qt
 | 
					from PyQt5.QtCore import Qt, QEvent
 | 
				
			||||||
from PyQt5 import QtWidgets
 | 
					from PyQt5 import QtWidgets
 | 
				
			||||||
 | 
					import trio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PyQt5.QtCore import (
 | 
					from PyQt5.QtCore import (
 | 
				
			||||||
    Qt,
 | 
					    Qt,
 | 
				
			||||||
| 
						 | 
					@ -45,8 +46,6 @@ from PyQt5.QtWidgets import (
 | 
				
			||||||
from fuzzywuzzy import process
 | 
					from fuzzywuzzy import process
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# from PyQt5.QtWidgets import QCompleter, QComboBox
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from ..log import get_logger
 | 
					from ..log import get_logger
 | 
				
			||||||
from ._style import (
 | 
					from ._style import (
 | 
				
			||||||
    _font,
 | 
					    _font,
 | 
				
			||||||
| 
						 | 
					@ -96,7 +95,7 @@ class CompleterView(QTreeView):
 | 
				
			||||||
        super().__init__(parent)
 | 
					        super().__init__(parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._font_size: int = 0  # pixels
 | 
					        self._font_size: int = 0  # pixels
 | 
				
			||||||
        self._cache: Dict[str, List[str]] = {}
 | 
					        # self._cache: Dict[str, List[str]] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # def viewportSizeHint(self) -> QtCore.QSize:
 | 
					    # def viewportSizeHint(self) -> QtCore.QSize:
 | 
				
			||||||
    #     vps = super().viewportSizeHint()
 | 
					    #     vps = super().viewportSizeHint()
 | 
				
			||||||
| 
						 | 
					@ -129,6 +128,7 @@ class CompleterView(QTreeView):
 | 
				
			||||||
        row_px = self.rowHeight(self.currentIndex())
 | 
					        row_px = self.rowHeight(self.currentIndex())
 | 
				
			||||||
        # print(f'font_h: {font_h}\n px_height: {px_height}')
 | 
					        # print(f'font_h: {font_h}\n px_height: {px_height}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # TODO: probably make this more general / less hacky
 | 
				
			||||||
        self.setMinimumSize(self.width(), rows * row_px)
 | 
					        self.setMinimumSize(self.width(), rows * row_px)
 | 
				
			||||||
        self.setMaximumSize(self.width(), rows * row_px)
 | 
					        self.setMaximumSize(self.width(), rows * row_px)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -288,16 +288,36 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit):
 | 
				
			||||||
        if self.view:
 | 
					        if self.view:
 | 
				
			||||||
            self.view.hide()
 | 
					            self.view.hide()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def keyPressEvent(self, ev: QtCore.QEvent) -> None:
 | 
					    # def keyPressEvent(self, ev: QEvent) -> None:
 | 
				
			||||||
        # by default we don't markt it as consumed?
 | 
					 | 
				
			||||||
        # ev.ignore()
 | 
					 | 
				
			||||||
        super().keyPressEvent(ev)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ev.accept()
 | 
					    #     # XXX: we unpack here because apparently doing it
 | 
				
			||||||
        # text = ev.text()
 | 
					    #     # after pop from the mem chan isn't showing the same
 | 
				
			||||||
        key = ev.key()
 | 
					    #     # event object? no clue wtf is going on there, likely
 | 
				
			||||||
        mods = ev.modifiers()
 | 
					    #     # something to do with Qt internals and calling the
 | 
				
			||||||
        txt = self.text()
 | 
					    #     # parent handler?
 | 
				
			||||||
 | 
					    #     key = ev.key()
 | 
				
			||||||
 | 
					    #     mods = ev.modifiers()
 | 
				
			||||||
 | 
					    #     txt = self.text()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #     # run async processing
 | 
				
			||||||
 | 
					    #     self._send_chan.send_nowait((key, mods, txt))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #     super().keyPressEvent(ev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #     # ev.accept()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def handle_keyboard_input(
 | 
				
			||||||
 | 
					    self,
 | 
				
			||||||
 | 
					    recv_chan: trio.abc.ReceiveChannel,
 | 
				
			||||||
 | 
					) -> None:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async for key, mods, txt in recv_chan:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # by default we don't mart it as consumed?
 | 
				
			||||||
 | 
					        # ev.ignore()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        print(f'key: {key}, mods: {mods}, txt: {txt}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if key in (Qt.Key_Enter, Qt.Key_Return):
 | 
					        if key in (Qt.Key_Enter, Qt.Key_Return):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,7 +325,7 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # TODO: ensure there is a matching completion or error and
 | 
					            # TODO: ensure there is a matching completion or error and
 | 
				
			||||||
            # do nothing
 | 
					            # do nothing
 | 
				
			||||||
            symbol = txt
 | 
					            symbol = self.text()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            app = self.chart_app
 | 
					            app = self.chart_app
 | 
				
			||||||
            self.chart_app.load_symbol(
 | 
					            self.chart_app.load_symbol(
 | 
				
			||||||
| 
						 | 
					@ -313,8 +333,11 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit):
 | 
				
			||||||
                symbol,
 | 
					                symbol,
 | 
				
			||||||
                'info',
 | 
					                'info',
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # release kb control of search bar
 | 
				
			||||||
            self.unfocus()
 | 
					            self.unfocus()
 | 
				
			||||||
            return
 | 
					            continue
 | 
				
			||||||
 | 
					            # return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ctrl = False
 | 
					        ctrl = False
 | 
				
			||||||
        if mods == Qt.ControlModifier:
 | 
					        if mods == Qt.ControlModifier:
 | 
				
			||||||
| 
						 | 
					@ -340,7 +363,8 @@ class FontSizedQLineEdit(QtWidgets.QLineEdit):
 | 
				
			||||||
                if self.chart_app:
 | 
					                if self.chart_app:
 | 
				
			||||||
                    self.chart_app.linkedcharts.focus()
 | 
					                    self.chart_app.linkedcharts.focus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return
 | 
					                # return
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # result selection nav
 | 
					            # result selection nav
 | 
				
			||||||
            if key in (Qt.Key_K, Qt.Key_J):
 | 
					            if key in (Qt.Key_K, Qt.Key_J):
 | 
				
			||||||
| 
						 | 
					@ -395,6 +419,7 @@ if __name__ == '__main__':
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # results.setFocusPolicy(Qt.NoFocus)
 | 
					    # results.setFocusPolicy(Qt.NoFocus)
 | 
				
			||||||
 | 
					    view = mk_completer_view(['src', 'i', 'symbol'])
 | 
				
			||||||
    search = FontSizedQLineEdit(None, view=view)
 | 
					    search = FontSizedQLineEdit(None, view=view)
 | 
				
			||||||
    search.view.set_results(syms)
 | 
					    search.view.set_results(syms)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -402,7 +427,7 @@ if __name__ == '__main__':
 | 
				
			||||||
    class W(QtGui.QWidget):
 | 
					    class W(QtGui.QWidget):
 | 
				
			||||||
        def __init__(self, parent=None):
 | 
					        def __init__(self, parent=None):
 | 
				
			||||||
            super().__init__(parent)
 | 
					            super().__init__(parent)
 | 
				
			||||||
            vbox = self.vbox = QtGui.QVBoxLayout(self)
 | 
					            self.vbox = QtGui.QVBoxLayout(self)
 | 
				
			||||||
            self.vbox.setContentsMargins(0, 0, 0, 0)
 | 
					            self.vbox.setContentsMargins(0, 0, 0, 0)
 | 
				
			||||||
            self.vbox.setSpacing(2)
 | 
					            self.vbox.setSpacing(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue