From aea0c1235db50a89b0a8f5680a787d4143ee8e25 Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Tue, 29 Aug 2023 09:15:34 +0800 Subject: [PATCH] Fix TouchScreenButton not redrawn when texture changes Co-authored-by: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com> --- scene/2d/touch_screen_button.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/scene/2d/touch_screen_button.cpp b/scene/2d/touch_screen_button.cpp index 504966354dc..0fd33ee9de0 100644 --- a/scene/2d/touch_screen_button.cpp +++ b/scene/2d/touch_screen_button.cpp @@ -33,9 +33,19 @@ #include "core/input_map.h" #include "core/os/input.h" #include "core/os/os.h" +#include "scene/scene_string_names.h" void TouchScreenButton::set_texture(const Ref &p_texture) { + if (texture == p_texture) { + return; + } + if (texture.is_valid()) { + texture->disconnect(SceneStringNames::get_singleton()->changed, this, "update"); + } texture = p_texture; + if (texture.is_valid()) { + texture->connect(SceneStringNames::get_singleton()->changed, this, "update", varray(), CONNECT_REFERENCE_COUNTED); + } update(); } @@ -44,7 +54,16 @@ Ref TouchScreenButton::get_texture() const { } void TouchScreenButton::set_texture_pressed(const Ref &p_texture_pressed) { + if (texture_pressed == p_texture_pressed) { + return; + } + if (texture_pressed.is_valid()) { + texture_pressed->disconnect(SceneStringNames::get_singleton()->changed, this, "update"); + } texture_pressed = p_texture_pressed; + if (texture_pressed.is_valid()) { + texture_pressed->connect(SceneStringNames::get_singleton()->changed, this, "update", varray(), CONNECT_REFERENCE_COUNTED); + } update(); } @@ -61,16 +80,16 @@ Ref TouchScreenButton::get_bitmask() const { } void TouchScreenButton::set_shape(const Ref &p_shape) { - if (shape.is_valid()) { - shape->disconnect("changed", this, "update"); + if (shape == p_shape) { + return; + } + if (shape.is_valid()) { + shape->disconnect(SceneStringNames::get_singleton()->changed, this, "update"); } - shape = p_shape; - if (shape.is_valid()) { - shape->connect("changed", this, "update"); + shape->connect(SceneStringNames::get_singleton()->changed, this, "update"); } - update(); }