瀏覽代碼

Merge pull request #64837 from YuriSizov/control-disconnect-from-everything-and-free-yourself

Disconnect Control from theme resources to avoid issues on destruction
Rémi Verschelde 3 年之前
父節點
當前提交
efedef8eb1
共有 2 個文件被更改,包括 22 次插入0 次删除
  1. 21 0
      scene/gui/control.cpp
  2. 1 0
      scene/gui/control.h

+ 21 - 0
scene/gui/control.cpp

@@ -3622,3 +3622,24 @@ void Control::_bind_methods() {
 
 	GDVIRTUAL_BIND(_gui_input, "event");
 }
+
+Control::~Control() {
+	// Resources need to be disconnected.
+	for (KeyValue<StringName, Ref<Texture2D>> &E : data.icon_override) {
+		E.value->disconnect("changed", callable_mp(this, &Control::_theme_property_override_changed));
+	}
+	for (KeyValue<StringName, Ref<StyleBox>> &E : data.style_override) {
+		E.value->disconnect("changed", callable_mp(this, &Control::_theme_property_override_changed));
+	}
+	for (KeyValue<StringName, Ref<Font>> &E : data.font_override) {
+		E.value->disconnect("changed", callable_mp(this, &Control::_theme_property_override_changed));
+	}
+
+	// Then override maps can be simply cleared.
+	data.icon_override.clear();
+	data.style_override.clear();
+	data.font_override.clear();
+	data.font_size_override.clear();
+	data.color_override.clear();
+	data.constant_override.clear();
+}

+ 1 - 0
scene/gui/control.h

@@ -610,6 +610,7 @@ public:
 	virtual Control *make_custom_tooltip(const String &p_text) const;
 
 	Control() {}
+	~Control();
 };
 
 VARIANT_ENUM_CAST(Control::FocusMode);