From 52555adb8c436aee548573b908646d5d75e9e5ba Mon Sep 17 00:00:00 2001 From: worron Date: Tue, 23 Apr 2024 11:29:45 +0300 Subject: [PATCH] More tricks for current scene detection (#172) * Add option to pick last root node as current scene Extra option in variable tracker module settings allows to pick last root node as current scene. Such behavior seems more fail-safe and enabled by default now. It's still optional just in case. * Add user defined exceptions for variable tracker Add option to variable tracker settings which allows to set some ignored top level nodes. --- .../modules/variable_tracker/module.gd | 52 ++++++++++++++++--- .../modules/variable_tracker/opt.gd | 24 ++++++++- 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/addons/panku_console/modules/variable_tracker/module.gd b/addons/panku_console/modules/variable_tracker/module.gd index fad95a8..d1ab74d 100644 --- a/addons/panku_console/modules/variable_tracker/module.gd +++ b/addons/panku_console/modules/variable_tracker/module.gd @@ -15,6 +15,10 @@ const CURRENT_REGISTERED_TIP := "[tip] Node '%s' registered as current scene, yo const CURRENT_REMOVED_TIP := "[tip] No current scene found, [b]%s[/b] keyword is no longer available." const USER_AUTOLOADS_TIP := "[tip] Accessible user singleton modules: [b]%s[/b]" +var _raw_exceptions_string: String = "" +var _nodes_exception_regexp: RegEx + +var _reverse_root_nodes_order: bool var _current_scene_root:Node var _user_singleton_files := [] var _tween_loop:Tween @@ -23,13 +27,29 @@ var _loop_call_back:CallbackTweener func init_module(): get_module_opt().tracking_delay = load_module_data("tracking_delay", DEFAULT_TRACKING_DELAY) + _reverse_root_nodes_order = load_module_data("use_last_as_current", true) + _raw_exceptions_string = load_module_data("root_node_exceptions", _raw_exceptions_string) + await core.get_tree().process_frame # not sure if it is necessary + update_exceptions_regexp() _update_project_singleton_files() _setup_scene_root_tracker() _check_autoloads() +# Build root node exceptions regular expression +func update_exceptions_regexp() -> void: + if _raw_exceptions_string.is_empty(): + _nodes_exception_regexp = RegEx.new() # not valid expression + return + + _nodes_exception_regexp = RegEx.create_from_string(_raw_exceptions_string) + + if not _nodes_exception_regexp.is_valid(): + push_error("Can't parse '%s' expression for variable tracker" % _raw_exceptions_string) + + # Parse project setting and collect and autoload files. func _update_project_singleton_files() -> void: _user_singleton_files.clear() @@ -88,25 +108,45 @@ func _check_current_scene() -> void: _current_scene_root = scene_root_found + ## Find the root node of current active scene. func get_scene_root() -> Node: # Assuming current scene is the first node in tree that is not autoload singleton. - for node in core.get_tree().root.get_children(): + for node in _get_valid_root_nodes(): if not _is_singleton(node): return node return null +# Get list of tree root nodes filtered and sorted according module settings +func _get_valid_root_nodes() -> Array: + var nodes: Array = core.get_tree().root.get_children().filter(_root_nodes_filter) + + if _reverse_root_nodes_order: + nodes.reverse() + + return nodes + + +# Filter function for tree root nodes +func _root_nodes_filter(node: Node) -> bool: + # skip panku plugin itself + if node.name == core.SingletonName: + return false + + # skip user defined exceptions + if _nodes_exception_regexp.is_valid() and _nodes_exception_regexp.search(node.name): + return false + + return true + + # Find all autoload singletons and bind its to environment vars. func _check_autoloads() -> void: var _user_singleton_names := [] - for node in core.get_tree().root.get_children(): - if node.name == core.SingletonName: - # skip panku plugin itself - continue - + for node in _get_valid_root_nodes(): if _is_singleton(node): # register user singleton _user_singleton_names.append(node.name) diff --git a/addons/panku_console/modules/variable_tracker/opt.gd b/addons/panku_console/modules/variable_tracker/opt.gd index a9ade2f..57114fa 100644 --- a/addons/panku_console/modules/variable_tracker/opt.gd +++ b/addons/panku_console/modules/variable_tracker/opt.gd @@ -2,9 +2,31 @@ extends ModuleOptions @export_group("variable_tracker") +@export var export_comment_use_last_as_current = ( + "Use last non singleton node as current scene. " + + "First node will be used if this option disabled." +) +@export var use_last_as_current: bool: + get: + return _module._reverse_root_nodes_order + set(value): + use_last_as_current = value + _module._reverse_root_nodes_order = value + +@export var export_comment_root_node_exceptions = ( + "Top level nodes which will be ignored by variable tracker. " + + "Regular expressions can be used e.g. '(SignalBus|Game*)'." +) +@export var root_node_exceptions: String: + get: + return _module._raw_exceptions_string + set(value): + root_node_exceptions = value + _module._raw_exceptions_string = value + _module.update_exceptions_regexp() @export var export_comment_tracking_delay = "Current scene checking interval." @export_range(0.1, 2.0, 0.1) var tracking_delay := 0.5: set(v): tracking_delay = v - _module.change_tracking_delay(tracking_delay) \ No newline at end of file + _module.change_tracking_delay(tracking_delay)