diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-08 01:01:53 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-08 01:01:53 +0200 |
| commit | fe711a11cfcfeca06c085a56f2e1d5f68a049337 (patch) | |
| tree | 42d6bd6ef076b95ab86e64dda36552e45fd34a11 | |
| parent | 4e655f4e648b64b6f416da7183a8d555745fa163 (diff) | |
| download | hurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar hurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar.bz2 hurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar.zst | |
Unhook setting callbacks when hooking node is freed
| -rw-r--r-- | client/gui/components/blur_setup.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/game.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/dropdown_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/game_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/input/input_manager.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/input/input_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/number_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/range_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/text_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/menus/settings/toggle_setting.gd | 2 | ||||
| -rw-r--r-- | client/gui/overlays/debug/debug.gd | 2 | ||||
| -rw-r--r-- | client/gui/overlays/overlays.gd | 2 | ||||
| -rw-r--r-- | client/map/auto_setup/environment_setup.gd | 6 | ||||
| -rw-r--r-- | client/map/auto_setup/light_setup.gd | 2 | ||||
| -rw-r--r-- | client/map/map.gd | 2 | ||||
| -rw-r--r-- | client/player/controllable_player.gd | 2 | ||||
| -rw-r--r-- | client/player/onscreen_controls/controls.gd | 2 | ||||
| -rw-r--r-- | client/player/player.gd | 2 | ||||
| -rw-r--r-- | client/system/settings.gd | 50 |
19 files changed, 52 insertions, 38 deletions
diff --git a/client/gui/components/blur_setup.gd b/client/gui/components/blur_setup.gd index 6034aa7f..b24a94d8 100644 --- a/client/gui/components/blur_setup.gd +++ b/client/gui/components/blur_setup.gd @@ -18,7 +18,7 @@ class_name BlurSetup func _ready(): update(Settings.read("graphics.ui_blur")) - Settings.hook_changed("graphics.ui_blur", "main", update) + Settings.hook_changed("graphics.ui_blur", self, update) func update(state): material.set_shader_parameter("enable_blur", state) diff --git a/client/gui/menus/game.gd b/client/gui/menus/game.gd index e0ab5de7..82eff30c 100644 --- a/client/gui/menus/game.gd +++ b/client/gui/menus/game.gd @@ -25,7 +25,7 @@ func _ready(): get_tree().get_root().go_back_requested.connect(open_ingame_menu) super() transition.set_loading_text(tr("c.menu.game.connecting")) - Settings.hook_changed_init("gameplay.first_person", "mouse_lock", func (_a): update_mouse_capture()) + Settings.hook_changed_init("gameplay.first_person", self, func (_a): update_mouse_capture()) func _input(_event): if Input.is_action_just_pressed("ui_menu"): diff --git a/client/gui/menus/settings/dropdown_setting.gd b/client/gui/menus/settings/dropdown_setting.gd index bf4c3d48..0d6f5ddc 100644 --- a/client/gui/menus/settings/dropdown_setting.gd +++ b/client/gui/menus/settings/dropdown_setting.gd @@ -27,7 +27,7 @@ func create_row(): row.value_node = OptionButton.new() row.value_node.clip_text = true for i in options: row.value_node.add_item(tr(nskey + "." + i)) - Settings.hook_changed_init(key, "preview", + Settings.hook_changed_init(key, row.value_node, func(value): if is_instance_valid(row): row.value_node.select(options.find(value)) diff --git a/client/gui/menus/settings/game_setting.gd b/client/gui/menus/settings/game_setting.gd index d0b38b34..07d39d98 100644 --- a/client/gui/menus/settings/game_setting.gd +++ b/client/gui/menus/settings/game_setting.gd @@ -35,7 +35,7 @@ func create_row(): if hide_reset(): row.hide_reset = true else: row.reset.connect(func(): Settings.write(key, default)) - Settings.hook_changed_init(key, "preview_reset", func (_value): + Settings.hook_changed_init(key, row, func (_value): if is_instance_valid(row): row.set_reset_disabled(is_default()) ) return row diff --git a/client/gui/menus/settings/input/input_manager.gd b/client/gui/menus/settings/input/input_manager.gd index b0b80a39..4647659f 100644 --- a/client/gui/menus/settings/input/input_manager.gd +++ b/client/gui/menus/settings/input/input_manager.gd @@ -25,7 +25,7 @@ enum EventType { func action_list() -> Array: # Array[String] return InputMap.get_actions().filter(func isBuiltIn(k: String): return !k.begins_with("ui_")).map(func (x): return str(x)) -func update_input_map(action: String): +func update_input_map(_value, action: String): if not action in action_list(): return InputMap.action_erase_events(action) for event in Settings.read("input.%s" % action): diff --git a/client/gui/menus/settings/input/input_setting.gd b/client/gui/menus/settings/input/input_setting.gd index 2fb4af3d..8a494865 100644 --- a/client/gui/menus/settings/input/input_setting.gd +++ b/client/gui/menus/settings/input/input_setting.gd @@ -27,7 +27,7 @@ func create_row(): row.value_node = INPUT_VALUE_NODE_SCENE.instantiate() # Manual initial update without update() since that needs to wait for _ready row.value_node.value = Settings.read(key) - Settings.hook_changed(key, "preview", + Settings.hook_changed(key, row.value_node, func(value): if is_instance_valid(row): row.value_node.value = value diff --git a/client/gui/menus/settings/number_setting.gd b/client/gui/menus/settings/number_setting.gd index 48dd0a82..0301895c 100644 --- a/client/gui/menus/settings/number_setting.gd +++ b/client/gui/menus/settings/number_setting.gd @@ -32,7 +32,7 @@ func create_row(): input.max_value = max_value input.value_changed.connect(func(value): Settings.write(key, value as int)) - Settings.hook_changed_init(key, "preview", + Settings.hook_changed_init(key, input, func(v): if is_instance_valid(input): input.value = v diff --git a/client/gui/menus/settings/range_setting.gd b/client/gui/menus/settings/range_setting.gd index 2d7e88b4..89a213e0 100644 --- a/client/gui/menus/settings/range_setting.gd +++ b/client/gui/menus/settings/range_setting.gd @@ -35,7 +35,7 @@ func create_row(): row.value_node.max_value = max_value row.value_node.tick_count = abs(max_value - min_value) if tick_count == null else tick_count row.value_node.step = 0 if smooth else (1 if tick_count == null else abs(max_value - min_value) / (tick_count - 1)) - Settings.hook_changed_init(key, "preview", + Settings.hook_changed_init(key, row.value_node, func(value): if is_instance_valid(row): row.value_node.value = value diff --git a/client/gui/menus/settings/text_setting.gd b/client/gui/menus/settings/text_setting.gd index de0ef218..9a873629 100644 --- a/client/gui/menus/settings/text_setting.gd +++ b/client/gui/menus/settings/text_setting.gd @@ -27,7 +27,7 @@ func create_row(): var input := LineEdit.new() input.placeholder_text = placeholder input.text_changed.connect(func(text): Settings.write(key, text)) - Settings.hook_changed_init(key, "preview", + Settings.hook_changed_init(key, input, func(text): if is_instance_valid(input): var pos = input.caret_column diff --git a/client/gui/menus/settings/toggle_setting.gd b/client/gui/menus/settings/toggle_setting.gd index fa60ca74..0a9a62c1 100644 --- a/client/gui/menus/settings/toggle_setting.gd +++ b/client/gui/menus/settings/toggle_setting.gd @@ -23,7 +23,7 @@ func create_row(): var row = super() row.value_node = CheckButton.new() row.value_node.pressed.connect(func(): Settings.write(key, row.value_node.button_pressed)) - Settings.hook_changed_init(key, "preview", + Settings.hook_changed_init(key, row.value_node, func(value): if is_instance_valid(row): row.value_node.button_pressed = value diff --git a/client/gui/overlays/debug/debug.gd b/client/gui/overlays/debug/debug.gd index 3a37a1b7..74175f2c 100644 --- a/client/gui/overlays/debug/debug.gd +++ b/client/gui/overlays/debug/debug.gd @@ -16,7 +16,7 @@ extends RichTextLabel func _ready(): - Settings.hook_changed_init("graphics.debug_info", "main", func (v): + Settings.hook_changed_init("graphics.debug_info", self, func (v): visible = v RenderingServer.viewport_set_measure_render_time(get_viewport().get_viewport_rid(), visible) ) diff --git a/client/gui/overlays/overlays.gd b/client/gui/overlays/overlays.gd index 9971ea53..b7d1bb21 100644 --- a/client/gui/overlays/overlays.gd +++ b/client/gui/overlays/overlays.gd @@ -17,7 +17,7 @@ extends Control class_name Overlays func _ready(): - Settings.hook_changed_init("ui.hide_overlays", "main", func (v): visible = not v) + Settings.hook_changed_init("ui.hide_overlays", self, func (v): visible = not v) func _input(_event): if Input.is_action_just_pressed("toggle_overlay"): diff --git a/client/map/auto_setup/environment_setup.gd b/client/map/auto_setup/environment_setup.gd index 7b6c5c8a..2dc5ea36 100644 --- a/client/map/auto_setup/environment_setup.gd +++ b/client/map/auto_setup/environment_setup.gd @@ -22,9 +22,9 @@ func set_sky(sky_name: String): environment.sky.sky_material = load("res://map/environment/presets/%s_sky.tres" % sky_name) func _ready(): - Settings.hook_changed_init("graphics.ssao", "main", func (x): environment.ssao_enabled = x) - Settings.hook_changed_init("graphics.gi", "main", func (x): environment.sdfgi_enabled = x == "sdfgi" and allow_sdfgi) - Settings.hook_changed_init("graphics.glow", "main", func (x): environment.glow_enabled = x) + Settings.hook_changed_init("graphics.ssao", self, func (x): environment.ssao_enabled = x) + Settings.hook_changed_init("graphics.gi", self, func (x): environment.sdfgi_enabled = x == "sdfgi" and allow_sdfgi) + Settings.hook_changed_init("graphics.glow", self, func (x): environment.glow_enabled = x) if !Global.on_vulkan(): environment.environment.tonemap_exposure = 0.5 diff --git a/client/map/auto_setup/light_setup.gd b/client/map/auto_setup/light_setup.gd index 0d71f54b..e63a6ab9 100644 --- a/client/map/auto_setup/light_setup.gd +++ b/client/map/auto_setup/light_setup.gd @@ -20,7 +20,7 @@ class_name LightSetup var shadows_enabled: bool func _ready(): - Settings.hook_changed_init("graphics.shadows", "main", apply_settings) + Settings.hook_changed_init("graphics.shadows", self, apply_settings) func set_visible_(val: bool): if completely_disable_light_if_shadows_disabled and not shadows_enabled: diff --git a/client/map/map.gd b/client/map/map.gd index f6cb2f82..150520d7 100644 --- a/client/map/map.gd +++ b/client/map/map.gd @@ -62,7 +62,7 @@ func clear_tile(pos: Vector2i): @onready var voxelgi: VoxelGI = $VoxelGI func _ready(): - Settings.hook_changed("graphics.gi", "main", apply_gi_setting) + Settings.hook_changed("graphics.gi", self, apply_gi_setting) floor_node.material_override = preload("res://map/tiles/floor_material.tres") for fm in tile_factory.floor_meshers.values(): add_child(fm.mesh_instance) diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index 3a64743b..90c32ede 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -60,7 +60,7 @@ func _ready(): add_child(onscreen_controls) add_child(marker) super() - Settings.hook_changed_init("gameplay.first_person", "hide_head", func(fps): + Settings.hook_changed_init("gameplay.first_person", self, func(fps): character.head_default.visible = not fps character.username_tag.visible = not fps ) diff --git a/client/player/onscreen_controls/controls.gd b/client/player/onscreen_controls/controls.gd index 3f38e7c2..a1dc3e32 100644 --- a/client/player/onscreen_controls/controls.gd +++ b/client/player/onscreen_controls/controls.gd @@ -24,7 +24,7 @@ extends CanvasLayer var touch_enabled := false func _ready(): - Settings.hook_changed_init("ui.touch_controls", "main", apply_touch) + Settings.hook_changed_init("ui.touch_controls", self, apply_touch) Global.using_touch_change.connect(func f(_x): apply_touch(Settings.read("ui.touch_controls"))) # throw away useless argument Global.hand_count_change.connect(apply_hand_count) apply_hand_count(Global.hand_count) diff --git a/client/player/player.gd b/client/player/player.gd index 828a4495..18ebcc7f 100644 --- a/client/player/player.gd +++ b/client/player/player.gd @@ -113,7 +113,7 @@ func _ready(): clear_item_timer.timeout.connect(clear_item_message) clear_effect_timer.timeout.connect(clear_effect) - Settings.hook_changed_init("gameplay.usernames", "main", update_username_tag) + Settings.hook_changed_init("gameplay.usernames", self, update_username_tag) func update_position(new_position: Vector2, new_rotation: float, new_boosting: bool): position_ = new_position diff --git a/client/system/settings.gd b/client/system/settings.gd index e7f3e2f7..e7f718fb 100644 --- a/client/system/settings.gd +++ b/client/system/settings.gd @@ -115,6 +115,7 @@ static func load(path: String): var f = FileAccess.open(path, FileAccess.READ) changed = JSON.parse_string(f.get_as_text()) tree.load(changed) + setup_static_hooks() static func save(): var changed = {} @@ -128,11 +129,25 @@ static func trigger_hook(key: String, value): change_hooks[key][slot].callv([value] if value != null else []) if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], key.rsplit(".", false, 1)[1]) -static func hook_changed(key: String, slot: String, callable: Callable): +# slot: String | Node +static func hook_changed(key: String, slot, callable: Callable): + var slot_id = 0 + if slot is Node: + slot_id = slot.get_instance_id() + slot.tree_exiting.connect(_unhook_changed.bind(key, slot_id)) + elif slot is String: + slot_id = slot.hash() + else: + push_error("hook_changed called with invalid slot") + return if not change_hooks.has(key): change_hooks[key] = {} - change_hooks[key][slot] = callable + change_hooks[key][slot_id] = callable + +static func _unhook_changed(key: String, slot_id: int): + change_hooks[key].erase(slot_id) -static func hook_changed_init(key: String, slot: String, callable: Callable): +# slot: String | Node +static func hook_changed_init(key: String, slot, callable: Callable): hook_changed(key, slot, callable) callable.call(read(key)) @@ -147,18 +162,20 @@ static func get_category_dict(prefix: String): static func launch_setup(): Global.focused_menu.submenu("res://gui/menus/setup/setup.tscn") -static var change_hooks = { - "input": { "static": h_input }, - "graphics.aa": { "static": h_aa }, - "graphics.taa": { "static": h_taa }, - "graphics.fullscreen": { "static": h_fullscreen }, - "ui.scale_mode": { "static": h_scale_mode }, - "ui.scale_factor": { "static": h_scale_factor }, - "ui.language": { "static": h_language }, - "audio.master_volume": { "static": h_volume_master }, - "audio.music_volume": { "static": h_volume_music }, - "audio.sfx_volume": { "static": h_volume_sfx }, -} +static var change_hooks = {} + +static func setup_static_hooks(): + for action in InputManager.action_list(): + hook_changed_init("input.%s" % action, "static", InputManager.update_input_map.bind(action)) + hook_changed_init("graphics.aa", "static", h_aa) + hook_changed_init("graphics.taa", "static", h_taa) + hook_changed_init("graphics.fullscreen", "static", h_fullscreen) + hook_changed_init("ui.scale_mode", "static", h_scale_mode) + hook_changed_init("ui.scale_factor", "static", h_scale_factor) + hook_changed_init("ui.language", "static", h_language) + hook_changed_init("audio.master_volume", "static", h_volume_master) + hook_changed_init("audio.music_volume", "static", h_volume_music) + hook_changed_init("audio.sfx_volume", "static", h_volume_sfx) static func h_aa(_mode): Global.configure_viewport_aa(Global.get_viewport()) @@ -186,9 +203,6 @@ static func h_language(language: String): if language == "system": language = OS.get_locale_language() TranslationServer.set_locale(language) -static func h_input(key: String): - InputManager.update_input_map(key) - static func h_fullscreen(mode: String): match mode: "keep": pass |