diff --git a/libs/pyTermTk/TermTk/TTkWidgets/container.py b/libs/pyTermTk/TermTk/TTkWidgets/container.py index 7003423d..6228f9c0 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/container.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/container.py @@ -211,7 +211,7 @@ class TTkContainer(TTkWidget): def keyEvent(self, evt:TTkKeyEvent) -> bool: if (_cfw := self._focusChildWidget()) is not None: - if _cfw.keyEvent(evt): + if _cfw._enabled and _cfw.keyEvent(evt): return True if TTkShortcut.processKey(evt, _cfw): diff --git a/tests/pytest/widgets/test_focus_02_tab.py b/tests/pytest/widgets/test_focus_02_tab.py index 29d03c14..43f33561 100644 --- a/tests/pytest/widgets/test_focus_02_tab.py +++ b/tests/pytest/widgets/test_focus_02_tab.py @@ -21,6 +21,7 @@ # SOFTWARE. import sys, os +from typing import List sys.path.append(os.path.join(sys.path[0],'../../../libs/pyTermTk')) import TermTk as ttk @@ -725,4 +726,129 @@ def test_focus_container_tab_focus_reversed(): assert False is container.hasFocus() assert False is widget1.hasFocus() assert True is widget2.hasFocus() - assert False is widget3.hasFocus() \ No newline at end of file + assert False is widget3.hasFocus() + +def _check_focus_order(root:ttk.TTk, widgets:List[ttk.TTkWidget], all_widgets:List[ttk.TTkWidget], evt:ttk.TTkKeyEvent): + for wid in widgets: + root.keyEvent(evt=evt) + print(f"Send {evt}") + for test_wid in all_widgets: + assert_condition = wid is test_wid + print(f"{assert_condition} == {test_wid.hasFocus()} - {test_wid.name()}") + for test_wid in all_widgets: + assert_condition = wid is test_wid + assert assert_condition is test_wid.hasFocus(), f"{assert_condition} != {test_wid.hasFocus()} - {test_wid.name()}" + + +def test_focus_mixed_containers_tab_focus_disabled_3(): + ''' + Root ─▶ Container1 (No TabFocus) ─┬─▶ Widget1 + ├─▶ Container2 (TabFocus) ─┬─▶ Widget2 + │ └─▶ Widget3 + └─▶ Widget4 + ''' + root = ttk.TTk() + container1 = ttk.TTkContainer(parent=root) + widget1 = ttk.TTkWidget(parent=container1) + container2 = ttk.TTkContainer(parent=container1) + container2.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget2 = ttk.TTkWidget(parent=container2) + widget3 = ttk.TTkWidget(parent=container2) + widget4 = ttk.TTkWidget(parent=container1) + widget1.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget2.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget3.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget4.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + + widget3.setDisabled() + + widget1.setFocus() + + tab_key = ttk.TTkKeyEvent( + type=ttk.TTkK.KeyType.SpecialKey, + key=ttk.TTkK.Key_Tab, + mod=ttk.TTkK.NoModifier, + code='',) + + _check_focus_order( + root=root, evt=tab_key, + widgets=[ + container2, + widget2, + widget4, + widget1, + ], + all_widgets=[ + container1, + container2, + widget1, + widget2, + widget3, + widget4, + ] + ) + +def test_focus_mixed_containers_tab_focus_disabled_4(): + ''' + Root ─▶ Container1 (No TabFocus) ─┬─▶ Widget1 + ├─▶ Container2 (TabFocus) ─┬─▶ Widget2 + │ └─▶ Widget3 + └─▶ Widget4 + ''' + root = ttk.TTk() + container1 = ttk.TTkContainer(parent=root, name='Container1') + widget1 = ttk.TTkWidget(parent=container1, name='Widget1') + container2 = ttk.TTkContainer(parent=container1, name='Container2') + container2.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget2 = ttk.TTkWidget(parent=container2, name='Widget2') + widget3 = ttk.TTkWidget(parent=container2, name='Widget3') + widget4 = ttk.TTkWidget(parent=container1, name='Widget4') + widget1.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget2.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget3.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + widget4.setFocusPolicy(ttk.TTkK.FocusPolicy.TabFocus) + + all_widgets=[ + container1, + container2, + widget1, + widget2, + widget3, + widget4, + ] + + container2.setDisabled() + widget2.setFocus() + + tab_key = ttk.TTkKeyEvent( + type=ttk.TTkK.KeyType.SpecialKey, + key=ttk.TTkK.Key_Tab, + mod=ttk.TTkK.NoModifier, + code='',) + + _check_focus_order( + root=root, evt=tab_key, all_widgets=all_widgets, + widgets=[ + widget4, + widget1, + widget4, + ], + ) + + container2.setDisabled() + widget3.setFocus() + + tab_key = ttk.TTkKeyEvent( + type=ttk.TTkK.KeyType.SpecialKey, + key=ttk.TTkK.Key_Tab, + mod=ttk.TTkK.ShiftModifier, + code='',) + + _check_focus_order( + root=root, evt=tab_key, all_widgets=all_widgets, + widgets=[ + widget1, + widget4, + widget1, + ], + )