This commit is contained in:
yumoqing 2020-11-13 18:00:26 +08:00
parent ef455a1741
commit 50723f2186
2 changed files with 82 additions and 1 deletions

View File

@ -25,8 +25,9 @@ from .responsivelayout import VResponsiveLayout
from .toolbar import Toolbar from .toolbar import Toolbar
from .paging import Paging, RelatedLoader from .paging import Paging, RelatedLoader
from .utils import CSize from .utils import CSize
from .ready import WidgetReady
class BoxViewer(BoxLayout): class BoxViewer(WidgetReady, BoxLayout):
def __init__(self, **options): def __init__(self, **options):
self.toolbar = None self.toolbar = None
self.parenturl = None self.parenturl = None
@ -41,6 +42,22 @@ class BoxViewer(BoxLayout):
'boxheight'] 'boxheight']
kwargs = {k:v for k,v in options.items() if k not in remind } kwargs = {k:v for k,v in options.items() if k not in remind }
BoxLayout.__init__(self, orientation='vertical', **kwargs) 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.selected_data = None
self.options = options self.options = options
self.box_width = CSize(options['boxwidth']) self.box_width = CSize(options['boxwidth'])
@ -113,6 +130,14 @@ class BoxViewer(BoxLayout):
self.dataloader.loadPage(1) self.dataloader.loadPage(1)
self.initflag = True 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 showObject(self, holders, rec,index=0):
def doit(self,holders,idx,o,w): def doit(self,holders,idx,o,w):
w.bind(on_press=self.select_record) w.bind(on_press=self.select_record)

View File

@ -15,10 +15,19 @@ class WidgetReady(EventDispatcher):
def __init__(self): def __init__(self):
self.register_event_type('on_ready') self.register_event_type('on_ready')
self.register_event_type('on_key_down')
self._ready = False self._ready = False
def on_ready(self): def on_ready(self):
pass pass
def on_key_down(self,keyinfo):
"""
keyinfo is a dict with:
keyname
modifiers
keys
"""
print(kinfo)
def ready(self): def ready(self):
if self._ready: if self._ready:
@ -30,6 +39,53 @@ class WidgetReady(EventDispatcher):
self._ready = False self._ready = False
self.ready() 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): def on_fullscreen(self, instance, value):
window = self.get_parent_window() window = self.get_parent_window()
if not window: if not window: