From d9c740abd61d6d74977eba5e44d24cc7d69889e6 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Thu, 26 Dec 2019 18:25:26 -0600 Subject: [PATCH] Return to having `Accessible` be a `Node` under `ScreenReader`, and having `_exit_tree` free resources. This eliminates the need to track and iterate through a separate array of `Accessible`s in `ScreenReader`. The previous performance issues are resolved by ensuring that any nodes processed aren't children of the `ScreenReader` node. I don't know of another way to avoid triggering signals on a child node than checking ancestry and failing fast. --- Accessible.gd | 7 +++++-- ScreenReader.gd | 13 +++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Accessible.gd b/Accessible.gd index ec2efbb..0b54203 100644 --- a/Accessible.gd +++ b/Accessible.gd @@ -499,7 +499,6 @@ func unfocused(): if not node.get_focus_owner(): node.get_tree().root.warp_mouse(node.rect_global_position) timer.unreference() - timer = null func click_focused(): if node.has_focus(): @@ -626,4 +625,8 @@ func _init(node): node.connect("cell_selected", self, "tree_item_selected") else: node.connect("item_selected", self, "tree_item_selected") - node.connect("tree_exiting", self, "free", [], Object.CONNECT_DEFERRED) + node.connect("tree_exiting", self, "queue_free", [], Object.CONNECT_DEFERRED) + +func _exit_tree(): + if timer != null: + timer.unreference() diff --git a/ScreenReader.gd b/ScreenReader.gd index 96bf01f..2050d25 100644 --- a/ScreenReader.gd +++ b/ScreenReader.gd @@ -3,8 +3,6 @@ extends Node var Accessible = preload("Accessible.gd") -var accessibles = [] - var focus_restore_timer = Timer.new() func focused(node): @@ -26,7 +24,7 @@ func unfocused(node): func augment_node(node): if node is Control: var accessible = Accessible.new(node) - accessibles.append(accessible) + add_child(accessible) 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"): @@ -37,6 +35,8 @@ func augment_node(node): node.connect("mouse_exited", self, "unfocused", [node]) func augment_tree(node): + if node is Accessible: + return augment_node(node) for child in node.get_children(): augment_tree(child) @@ -75,10 +75,3 @@ func _enter_tree(): focus_restore_timer.connect("timeout", self, "restore_focus") add_child(focus_restore_timer) get_tree().connect("node_added", self, "augment_tree") - -func _exit_tree(): - for accessible in accessibles: - if accessible.timer != null: - accessible.timer.unreference() - accessible.timer = null - accessible.free()