From 50723f2186ba5a3e33511d174cb0c6f1bfa74505 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 13 Nov 2020 18:00:26 +0800 Subject: [PATCH] bugfix --- kivyblocks/boxViewer.py | 27 +++++++++++++++++++- kivyblocks/ready.py | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/kivyblocks/boxViewer.py b/kivyblocks/boxViewer.py index 62fc6a8..916694d 100644 --- a/kivyblocks/boxViewer.py +++ b/kivyblocks/boxViewer.py @@ -25,8 +25,9 @@ from .responsivelayout import VResponsiveLayout from .toolbar import Toolbar from .paging import Paging, RelatedLoader from .utils import CSize +from .ready import WidgetReady -class BoxViewer(BoxLayout): +class BoxViewer(WidgetReady, BoxLayout): def __init__(self, **options): self.toolbar = None self.parenturl = None @@ -41,6 +42,22 @@ class BoxViewer(BoxLayout): 'boxheight'] kwargs = {k:v for k,v in options.items() if k not in remind } BoxLayout.__init__(self, orientation='vertical', **kwargs) + WidgetReady.__init__(self) + self.used_keys = [ + { + "keyname":"enter", + "modifiers":[] + }, + { + "keyname":"up", + "modifiers":[] + }, + { + "keyname":"down", + "modifiers":[] + }, + ] + self.use_keyboard(self.used_keys) self.selected_data = None self.options = options self.box_width = CSize(options['boxwidth']) @@ -113,6 +130,14 @@ class BoxViewer(BoxLayout): self.dataloader.loadPage(1) self.initflag = True + def on_key_down(self,keyinfo): + if keyinfo['keyname'] == 'enter': + self.selected_box.on_press() + if keyinfo['keyname'] == 'down': + print('down key entried') + if keyinfo['keyname'] == 'up': + print('up key entried') + def showObject(self, holders, rec,index=0): def doit(self,holders,idx,o,w): w.bind(on_press=self.select_record) diff --git a/kivyblocks/ready.py b/kivyblocks/ready.py index d2d8b57..9c8c9e9 100644 --- a/kivyblocks/ready.py +++ b/kivyblocks/ready.py @@ -15,10 +15,19 @@ class WidgetReady(EventDispatcher): def __init__(self): self.register_event_type('on_ready') + self.register_event_type('on_key_down') self._ready = False def on_ready(self): pass + def on_key_down(self,keyinfo): + """ + keyinfo is a dict with: + keyname + modifiers + keys + """ + print(kinfo) def ready(self): if self._ready: @@ -30,6 +39,53 @@ class WidgetReady(EventDispatcher): self._ready = False self.ready() + def use_keyboard(self, keyinfos=[]): + """ + keyinfos is a list of aceepted keys keyinfo + if the on_key_down's key is one of the keyinfos, + fire a event, and return True, + else just return False + """ + self.my_kb = Window.request_keyboard(self.unuse_keyboard, self, "text") + self.my_kb.bind(on_key_down=self._on_keyboard_down) + if self.my_kb.widget: + self.my_kb.set_mode_free() + self.keyinfos = keyinfos + + def unuse_keyboard(self): + print('My keyboard have been closed!') + self.my_kb.unbind(on_key_down=self._on_keyboard_down) + self.my_kb = None + + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + print('The key', keycode, 'have been pressed') + print(' - text is %r' % text) + print(' - modifiers are %r' % modifiers) + + def listqual(l1,l2): + a = [i for i in l1 if i not in l2] + b = [i for i in l2 if i not in l1] + if len(a) == 0 and len(b) == 0: + return True + return False + # Keycode is composed of an integer + a string + # If we hit escape, release the keyboard + if keycode[1] == 'escape': + keyboard.release() + + for ki in self.keyinfos: + if ki['keyname'] == keycode[1] and listequal(ki['modifiers'],modifiers): + keyinfo = { + "keyname":keycode[1], + "modifiers":modifiers + } + self.dispatch('on_key_down',keyinfo) + return True + + # Return True to accept the key. Otherwise, it will be used by + # the system. + return False + def on_fullscreen(self, instance, value): window = self.get_parent_window() if not window: