From 0783dfb5489902bc4247c9dfbdcdfaa584e3fd84 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Thu, 3 Oct 2019 09:34:22 -0500 Subject: [PATCH] Add global signal-catching for better handling of cases where focus is lost. --- Accessible.gd | 12 +++++------- ScreenReader.gd | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/Accessible.gd b/Accessible.gd index 2b1a163..305e6a8 100644 --- a/Accessible.gd +++ b/Accessible.gd @@ -171,9 +171,6 @@ func menu_button_focus(): tokens.append("menu") TTS.speak(tokens.join(": "), false) -func panel_focus(): - TTS.speak("panel", true) - func popup_menu_focus(): TTS.speak("menu", false) @@ -384,8 +381,6 @@ func focus(): label_focus() elif node is LineEdit: line_edit_focus() - elif node is Panel: - panel_focus() elif node is PopupMenu: popup_menu_focus() elif node is TabContainer: @@ -411,8 +406,9 @@ func unfocus(): func click_focus(): if node.has_focus(): return - print("Grabbing focus: %s" % node) - node.grab_focus() + if node.focus_mode == Control.FOCUS_ALL: + print("Grabbing focus: %s" % node) + node.grab_focus() func gui_input(event): if event is InputEventKey and Input.is_action_just_pressed("ui_accept") and event.control and event.alt: @@ -464,6 +460,8 @@ func is_focusable(node): return false if node.get_class() == "CollisionShape2DEditor": return false + if node is Panel: + return false if node is TabContainer: return true if node.get_class() == "EditorInspectorSection": diff --git a/ScreenReader.gd b/ScreenReader.gd index 80cd574..bd69c41 100644 --- a/ScreenReader.gd +++ b/ScreenReader.gd @@ -3,9 +3,34 @@ extends Node var Accessible = preload("Accessible.gd") +var focus_restore_timer = Timer.new() + +func focused(node): + focus_restore_timer.stop() + +func click_focused(node): + pass + +func restore_focus(): + var focus = find_focusable_control(get_tree().root) + if focus: + focus.grab_focus() + focus.grab_click_focus() + +func unfocused(node): + focus_restore_timer.start(0.2) + func augment_node(node): if node is Control: Accessible.new(node) + if not node.is_connected("focus_entered", self, "focused"): + node.connect("focus_entered", self, "focused", [node]) + if not node.is_connected("mouse_entered", self, "click_focused"): + node.connect("mouse_entered", self, "click_focused", [node]) + if not node.is_connected("focus_exited", self, "unfocused"): + node.connect("focus_exited", self, "unfocused", [node]) + if not node.is_connected("mouse_exited", self, "unfocused"): + node.connect("mouse_exited", self, "unfocused", [node]) func augment_tree(node): augment_node(node) @@ -34,7 +59,6 @@ func find_focusable_control(node): return null func set_initial_scene_focus(scene): - print("Set focus in scene") self.augment_tree(get_tree().root) var focus = find_focusable_control(get_tree().root) if not focus: @@ -43,5 +67,8 @@ func set_initial_scene_focus(scene): focus.grab_focus() func _enter_tree(): + focus_restore_timer.one_shot = true + focus_restore_timer.connect("timeout", self, "restore_focus") + add_child(focus_restore_timer) TTS.rate = 255 get_tree().connect("node_added", self, "augment_tree")