Skip to content

Commit 0f0d28b

Browse files
authored
feat(gui): add activate/deactivate to UIInputText (#2196)
* feat(gui): add activate/deactivate to UIInputText * fix(gui): remove start_render calls
1 parent 38b5b4a commit 0f0d28b

3 files changed

Lines changed: 74 additions & 9 deletions

File tree

arcade/gui/widgets/text.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,7 @@ def on_event(self, event: UIEvent) -> Optional[bool]:
397397
# If not active, check to activate, return
398398
if not self._active and isinstance(event, UIMousePressEvent):
399399
if self.rect.point_in_rect(event.pos):
400-
self._active = True
401-
self.trigger_full_render()
402-
self.caret.on_activate()
403-
self.caret.position = len(self.doc.text)
400+
self.activate()
404401
return EVENT_UNHANDLED
405402

406403
# If active check to deactivate
@@ -410,9 +407,7 @@ def on_event(self, event: UIEvent) -> Optional[bool]:
410407
y = int(event.y - self.bottom)
411408
self.caret.on_mouse_press(x, y, event.button, event.modifiers)
412409
else:
413-
self._active = False
414-
self.trigger_full_render()
415-
self.caret.on_deactivate()
410+
self.deactivate()
416411
return EVENT_UNHANDLED
417412

418413
# If active pass all non press events to caret
@@ -445,6 +440,23 @@ def on_event(self, event: UIEvent) -> Optional[bool]:
445440

446441
return EVENT_UNHANDLED
447442

443+
@property
444+
def active(self) -> bool:
445+
return self._active
446+
447+
def activate(self):
448+
"""Programmatically activate the text input field."""
449+
self._active = True
450+
self.trigger_full_render()
451+
self.caret.on_activate()
452+
self.caret.position = len(self.doc.text)
453+
454+
def deactivate(self):
455+
"""Programmatically deactivate the text input field."""
456+
self._active = False
457+
self.trigger_full_render()
458+
self.caret.on_deactivate()
459+
448460
def _update_layout(self):
449461
# Update Pyglet layout size
450462
layout = self.layout

tests/unit/gui/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ def drag(self, x: int, y: int, dx=0.0, dy=0.0, buttons=arcade.MOUSE_BUTTON_LEFT,
2323
def release(self, x: int, y: int, button=arcade.MOUSE_BUTTON_LEFT):
2424
self.on_mouse_release(x=x, y=y, button=button, modifiers=0)
2525

26+
def type_text(self, text: str):
27+
self.on_text(text)
28+
2629
def click(self, x: int, y: int, button=arcade.MOUSE_BUTTON_LEFT):
2730
self.click_and_hold(x, y, button=button)
2831
self.release(x, y, button=button)
Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,59 @@
11
from arcade.gui import UIInputText
22

33

4-
def test_uilabel_support_multiline(uimanager):
4+
def test_deactivated_by_default(uimanager):
5+
# GIVEN
6+
widget = UIInputText()
7+
8+
# THEN
9+
assert widget.active is False
10+
11+
12+
def test_activated_after_click(uimanager):
13+
# GIVEN
14+
widget = UIInputText()
15+
uimanager.add(widget)
16+
517
# WHEN
18+
uimanager.click(*widget.rect.center)
19+
20+
# THEN
21+
assert widget.active is True
22+
23+
24+
def test_deactivated_after_off_click(uimanager):
25+
# GIVEN
626
widget = UIInputText()
27+
uimanager.add(widget)
28+
widget.activate()
29+
30+
# WHEN
31+
uimanager.click(200, 200)
32+
33+
# THEN
34+
assert widget.active is False
35+
36+
37+
def test_captures_text_when_active(uimanager):
38+
# GIVEN
39+
widget = UIInputText()
40+
uimanager.add(widget)
41+
widget.activate()
42+
43+
# WHEN
44+
uimanager.type_text("Hello")
45+
46+
# THEN
47+
assert widget.text == "Hello"
48+
49+
50+
def test_does_not_capture_text_when_inactive(uimanager):
51+
# GIVEN
52+
widget = UIInputText()
53+
uimanager.add(widget)
54+
55+
# WHEN
56+
uimanager.type_text("Hello")
757

858
# THEN
9-
assert widget is not None
59+
assert widget.text == ""

0 commit comments

Comments
 (0)