Merge pull request #5418 from kivy/validate_unfocus

Add text_validate_unfocus option to TextInput
This commit is contained in:
Peter Badida 2017-10-18 19:30:05 +02:00 committed by GitHub
commit d0216fa2fd
2 changed files with 61 additions and 3 deletions

View File

@ -5,6 +5,7 @@ uix.textinput tests
import unittest import unittest
from kivy.tests.common import GraphicUnitTest
from kivy.uix.textinput import TextInput from kivy.uix.textinput import TextInput
@ -34,3 +35,48 @@ class TextInputTest(unittest.TestCase):
# If so Secondvery... should start from the 7th line # If so Secondvery... should start from the 7th line
pos_S = self.test_txt.index('S') pos_S = self.test_txt.index('S')
self.assertEquals(instance.get_cursor_from_index(pos_S), (0, 6)) self.assertEquals(instance.get_cursor_from_index(pos_S), (0, 6))
class TextInputGraphicTest(GraphicUnitTest):
def test_text_validate(self):
ti = TextInput(multiline=False)
ti.focus = True
self.render(ti)
self.assertFalse(ti.multiline)
self.assertTrue(ti.focus)
self.assertTrue(ti.text_validate_unfocus)
ti.validate_test = None
ti.bind(on_text_validate=lambda *_: setattr(
ti, 'validate_test', True
))
ti._key_down(
(
None, # displayed_str
None, # internal_str
'enter', # internal_action
1 # scale
),
repeat=False
)
self.assertTrue(ti.validate_test)
self.assertFalse(ti.focus)
ti.validate_test = None
ti.text_validate_unfocus = False
ti.focus = True
self.assertTrue(ti.focus)
ti._key_down(
(None, None, 'enter', 1),
repeat=False
)
self.assertTrue(ti.validate_test)
self.assertTrue(ti.focus)
if __name__ == '__main__':
import unittest
unittest.main()

View File

@ -30,7 +30,7 @@ To create a multiline :class:`TextInput` (the 'enter' key adds a new line)::
To create a singleline :class:`TextInput`, set the :class:`TextInput.multiline` To create a singleline :class:`TextInput`, set the :class:`TextInput.multiline`
property to False (the 'enter' key will defocus the TextInput and emit an property to False (the 'enter' key will defocus the TextInput and emit an
'on_text_validate' event):: :meth:`TextInput.on_text_validate` event)::
def on_enter(instance, value): def on_enter(instance, value):
print('User pressed enter in', instance) print('User pressed enter in', instance)
@ -705,7 +705,6 @@ class TextInput(FocusBehavior, Widget):
elif mode == 'float': elif mode == 'float':
if not re.match(self._insert_float_pat, new_text): if not re.match(self._insert_float_pat, new_text):
return return
self._set_line_text(cr, new_text) self._set_line_text(cr, new_text)
wrap = (self._get_text_width( wrap = (self._get_text_width(
@ -2291,6 +2290,7 @@ class TextInput(FocusBehavior, Widget):
self.insert_text(u'\n') self.insert_text(u'\n')
else: else:
self.dispatch('on_text_validate') self.dispatch('on_text_validate')
if self.text_validate_unfocus:
self.focus = False self.focus = False
elif internal_action == 'escape': elif internal_action == 'escape':
self.focus = False self.focus = False
@ -2482,6 +2482,18 @@ class TextInput(FocusBehavior, Widget):
defaults to False. defaults to False.
''' '''
text_validate_unfocus = BooleanProperty(True)
'''If True, the :meth:`TextInput.on_text_validate` event will unfocus the
widget, therefore make it stop listening to the keyboard. When disabled,
the :meth:`TextInput.on_text_validate` event can be fired multiple times
as the result of TextInput keeping the focus enabled.
.. versionadded:: 1.10.1
:attr:`text_validate_unfocus` is
a :class:`~kivy.properties.BooleanProperty` and defaults to True.
'''
multiline = BooleanProperty(True) multiline = BooleanProperty(True)
'''If True, the widget will be able show multiple lines of text. If False, '''If True, the widget will be able show multiple lines of text. If False,
the "enter" keypress will defocus the textinput instead of adding a new the "enter" keypress will defocus the textinput instead of adding a new