@@ -473,6 +473,7 @@ class Widget(Tag, EventSource):
473473 EVENT_ONKEYPRESS = 'onkeypress'
474474 EVENT_ONKEYUP = 'onkeyup'
475475 EVENT_ONCHANGE = 'onchange'
476+ EVENT_ONINPUT = 'oninput'
476477 EVENT_ONFOCUS = 'onfocus'
477478 EVENT_ONBLUR = 'onblur'
478479 EVENT_ONCONTEXTMENU = "oncontextmenu"
@@ -819,39 +820,43 @@ def ontouchcancel(self):
819820 """
820821 return ()
821822
822- @decorate_set_on_listener ("(self, emitter, key, ctrl, shift, alt)" )
823+ @decorate_set_on_listener ("(self, emitter, key, keycode, ctrl, shift, alt)" )
823824 @decorate_event_js ("""var params={};params['key']=event.key;
825+ params['keycode']=(event.which||event.keyCode);
824826 params['ctrl']=event.ctrlKey;
825827 params['shift']=event.shiftKey;
826828 params['alt']=event.altKey;
827829 sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
828830 event.stopPropagation();event.preventDefault();return false;""" )
829- def onkeyup (self , key , ctrl , shift , alt ):
831+ def onkeyup (self , key , keycode , ctrl , shift , alt ):
830832 """Called when user types and releases a key.
831833 The widget should be able to receive the focus in order to emit the event.
832834 Assign a 'tabindex' attribute to make it focusable.
833835
834836 Args:
835837 key (str): the character value
838+ keycode (str): the numeric char code
836839 """
837- return (key , ctrl , shift , alt )
840+ return (key , keycode , ctrl , shift , alt )
838841
839- @decorate_set_on_listener ("(self, emitter, key, ctrl, shift, alt)" )
842+ @decorate_set_on_listener ("(self, emitter, key, keycode, ctrl, shift, alt)" )
840843 @decorate_event_js ("""var params={};params['key']=event.key;
844+ params['keycode']=(event.which||event.keyCode);
841845 params['ctrl']=event.ctrlKey;
842846 params['shift']=event.shiftKey;
843847 params['alt']=event.altKey;
844848 sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
845849 event.stopPropagation();event.preventDefault();return false;""" )
846- def onkeydown (self , key , ctrl , shift , alt ):
850+ def onkeydown (self , key , keycode , ctrl , shift , alt ):
847851 """Called when user types and releases a key.
848852 The widget should be able to receive the focus in order to emit the event.
849853 Assign a 'tabindex' attribute to make it focusable.
850854
851855 Args:
852856 key (str): the character value
857+ keycode (str): the numeric char code
853858 """
854- return (key , ctrl , shift , alt )
859+ return (key , keycode , ctrl , shift , alt )
855860
856861 @decorate_explicit_alias_for_listener_registration
857862 def set_on_focus_listener (self , callback , * userdata ):
@@ -1267,9 +1272,20 @@ def __init__(self, single_line=True, hint='', *args, **kwargs):
12671272 if single_line :
12681273 self .style ['resize' ] = 'none'
12691274 self .attributes ['rows' ] = '1'
1270- self .attributes [self .EVENT_ONKEYDOWN ] = "if((event.charCode||event.keyCode)==13){" \
1271- "event.keyCode = 0;event.charCode = 0; document.getElementById('%(id)s').blur();" \
1272- "return false;}" % {'id' : self .identifier }
1275+ self .attributes [self .EVENT_ONINPUT ] = """
1276+ var elem = document.getElementById('%(emitter_identifier)s');
1277+ var enter_pressed = (elem.value.indexOf('\\ n') > -1);
1278+ if(enter_pressed){
1279+ elem.value = elem.value.split('\\ n').join('');
1280+ var params={};params['new_value']=elem.value;
1281+ sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
1282+ }""" % {'emitter_identifier' : str (self .identifier ), 'event_name' : Widget .EVENT_ONCHANGE }
1283+ #else:
1284+ # self.attributes[self.EVENT_ONINPUT] = """
1285+ # var elem = document.getElementById('%(emitter_identifier)s');
1286+ # var params={};params['new_value']=elem.value;
1287+ # sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
1288+ # """ % {'emitter_identifier': str(self.identifier), 'event_name': Widget.EVENT_ONCHANGE}
12731289
12741290 self .set_value ('' )
12751291
@@ -1303,70 +1319,47 @@ def get_value(self):
13031319 @decorate_set_on_listener ("(self, emitter, new_value)" )
13041320 @decorate_event
13051321 def onchange (self , new_value ):
1306- """Called when the user finishes to edit the TextInput content.
1322+ """Called when the user changes the TextInput content.
1323+ With single_line=True it fires in case of focus lost and Enter key pressed.
1324+ With single_line=False it fires at each key released.
13071325
13081326 Args:
13091327 new_value (str): the new string content of the TextInput.
13101328 """
1329+ self .disable_refresh ()
13111330 self .set_value (new_value )
1331+ self .enable_refresh ()
13121332 return (new_value , )
13131333
1314- @decorate_set_on_listener ("(self, emitter, new_value)" )
1315- @decorate_event_js ("""var elem=document.getElementById('%(emitter_identifier)s');elem.value = elem.value.split(' \\ n').join('');
1316- var params={};params['new_value']=elem.value;
1334+ @decorate_set_on_listener ("(self, emitter, new_value, keycode )" )
1335+ @decorate_event_js ("""var elem=document.getElementById('%(emitter_identifier)s');
1336+ var params={};params['new_value']=elem.value;params['keycode']=(event.which||event.keyCode);
13171337 sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);""" )
1318- def onkeyup (self , new_value ):
1338+ def onkeyup (self , new_value , keycode ):
13191339 """Called when user types and releases a key into the TextInput
13201340
1341+ Note: This event can't be registered together with Widget.onchange.
1342+
13211343 Args:
13221344 new_value (str): the new string content of the TextInput
1345+ keycode (str): the numeric char code
13231346 """
1324- self .disable_refresh ()
1325- self .set_value (new_value )
1326- self .enable_refresh ()
1327- self ._set_updated ()
1328- return (new_value , )
1347+ return (new_value , keycode )
13291348
1330- @decorate_set_on_listener ("(self, emitter, new_value)" )
1331- @decorate_event_js ("var params={};params['new_value']= document.getElementById('%(emitter_identifier)s').value;" \
1332- "sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);if(( event.charCode ||event.keyCode)==13){" \
1333- "event.keyCode = 0;event.charCode = 0; document.getElementById ('%(emitter_identifier)s').blur(); return false;} " )
1334- def onkeydown (self , new_value ):
1349+ @decorate_set_on_listener ("(self, emitter, new_value, keycode )" )
1350+ @decorate_event_js (""" var elem= document.getElementById('%(emitter_identifier)s');
1351+ var params={};params['new_value']=elem.value;params['keycode']=( event.which ||event.keyCode);
1352+ sendCallbackParam ('%(emitter_identifier)s','%(event_name)s',params);"" " )
1353+ def onkeydown (self , new_value , keycode ):
13351354 """Called when the user types a key into the TextInput.
13361355
1337- Note: This event can't be registered together with Widget.onenter.
1338-
1339- Args:
1340- new_value (str): the new string content of the TextInput.
1341- """
1342- self .disable_refresh ()
1343- self .set_value (new_value )
1344- self .enable_refresh ()
1345- self ._set_updated ()
1346- return (new_value , )
1347-
1348- @decorate_set_on_listener ("(self, emitter, new_value)" )
1349- @decorate_event_js ("""
1350- if (event.keyCode == 13) {
1351- var params={};
1352- params['new_value']=document.getElementById('%(emitter_identifier)s').value;
1353- document.getElementById('%(emitter_identifier)s').value = '';
1354- document.getElementById('%(emitter_identifier)s').onchange = '';
1355- sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
1356- return false;
1357- }""" )
1358- def onenter (self , new_value ):
1359- """Called when the user types an ENTER into the TextInput.
1360- Note: This event can't be registered together with Widget.onkeydown.
1356+ Note: This event can't be registered together with Widget.onchange.
13611357
13621358 Args:
13631359 new_value (str): the new string content of the TextInput.
1360+ keycode (str): the numeric char code
13641361 """
1365- self .disable_refresh ()
1366- self .set_value (new_value )
1367- self .enable_refresh ()
1368- self ._set_updated ()
1369- return (new_value , )
1362+ return (new_value , keycode )
13701363
13711364 @decorate_explicit_alias_for_listener_registration
13721365 def set_on_change_listener (self , callback , * userdata ):
@@ -1380,10 +1373,6 @@ def set_on_key_up_listener(self, callback, *userdata):
13801373 def set_on_key_down_listener (self , callback , * userdata ):
13811374 self .onkeydown .connect (callback , * userdata )
13821375
1383- @decorate_explicit_alias_for_listener_registration
1384- def set_on_enter_listener (self , callback , * userdata ):
1385- self .onenter .connect (callback , * userdata )
1386-
13871376
13881377class Label (Widget , _MixinTextualWidget ):
13891378 """ Non editable text label widget. Set its content by means of set_text function, and retrieve its content with the
@@ -1594,21 +1583,21 @@ def __init__(self, title='Title', message='Message', initial_value='', *args, **
15941583 super (InputDialog , self ).__init__ (title , message , * args , ** kwargs )
15951584
15961585 self .inputText = TextInput ()
1597- self .inputText .onenter .connect (self .on_text_enter_listener )
1586+ self .inputText .onkeydown .connect (self .on_keydown_listener )
15981587 self .add_field ('textinput' , self .inputText )
15991588 self .inputText .set_text (initial_value )
16001589
16011590 self .confirm_dialog .connect (self .confirm_value )
16021591
1603- @decorate_set_on_listener ("(self, emitter, value)" )
1604- @decorate_event
1605- def on_text_enter_listener (self , widget , value ):
1592+ def on_keydown_listener (self , widget , value , keycode ):
16061593 """event called pressing on ENTER key.
16071594
16081595 propagates the string content of the input field
16091596 """
1610- self .hide ()
1611- return (value , )
1597+ if keycode == "13" :
1598+ self .hide ()
1599+ self .inputText .set_text (value )
1600+ self .confirm_value (self )
16121601
16131602 @decorate_set_on_listener ("(self, emitter, value)" )
16141603 @decorate_event
0 commit comments