summaryrefslogtreecommitdiffstats
path: root/core/object
diff options
context:
space:
mode:
authorA Thousand Ships <96648715+AThousandShips@users.noreply.github.com>2024-01-18 17:20:56 +0100
committerA Thousand Ships <96648715+AThousandShips@users.noreply.github.com>2024-09-20 16:39:09 +0200
commit203d3be200c9b607e5eaba82d9a267813a6700cd (patch)
treeced60a02eabb92aca3759a2f7165fb78352e852c /core/object
parent2be730a05b7ff221b89c967981f7caee6e164ef0 (diff)
downloadredot-engine-203d3be200c9b607e5eaba82d9a267813a6700cd.tar.gz
[Core] Add way to check if a signal has any connections
Added to `Object` and `Signal`
Diffstat (limited to 'core/object')
-rw-r--r--core/object/object.cpp19
-rw-r--r--core/object/object.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/core/object/object.cpp b/core/object/object.cpp
index 2d9d468d38..b3a4ec6e2e 100644
--- a/core/object/object.cpp
+++ b/core/object/object.cpp
@@ -1457,6 +1457,24 @@ bool Object::is_connected(const StringName &p_signal, const Callable &p_callable
return s->slot_map.has(*p_callable.get_base_comparator());
}
+bool Object::has_connections(const StringName &p_signal) const {
+ const SignalData *s = signal_map.getptr(p_signal);
+ if (!s) {
+ bool signal_is_valid = ClassDB::has_signal(get_class_name(), p_signal);
+ if (signal_is_valid) {
+ return false;
+ }
+
+ if (!script.is_null() && Ref<Script>(script)->has_script_signal(p_signal)) {
+ return false;
+ }
+
+ ERR_FAIL_V_MSG(false, "Nonexistent signal: " + p_signal + ".");
+ }
+
+ return !s->slot_map.is_empty();
+}
+
void Object::disconnect(const StringName &p_signal, const Callable &p_callable) {
_disconnect(p_signal, p_callable);
}
@@ -1697,6 +1715,7 @@ void Object::_bind_methods() {
ClassDB::bind_method(D_METHOD("connect", "signal", "callable", "flags"), &Object::connect, DEFVAL(0));
ClassDB::bind_method(D_METHOD("disconnect", "signal", "callable"), &Object::disconnect);
ClassDB::bind_method(D_METHOD("is_connected", "signal", "callable"), &Object::is_connected);
+ ClassDB::bind_method(D_METHOD("has_connections", "signal"), &Object::has_connections);
ClassDB::bind_method(D_METHOD("set_block_signals", "enable"), &Object::set_block_signals);
ClassDB::bind_method(D_METHOD("is_blocking_signals"), &Object::is_blocking_signals);
diff --git a/core/object/object.h b/core/object/object.h
index 1274247d71..763e2974b9 100644
--- a/core/object/object.h
+++ b/core/object/object.h
@@ -932,6 +932,7 @@ public:
MTVIRTUAL Error connect(const StringName &p_signal, const Callable &p_callable, uint32_t p_flags = 0);
MTVIRTUAL void disconnect(const StringName &p_signal, const Callable &p_callable);
MTVIRTUAL bool is_connected(const StringName &p_signal, const Callable &p_callable) const;
+ MTVIRTUAL bool has_connections(const StringName &p_signal) const;
template <typename... VarArgs>
void call_deferred(const StringName &p_name, VarArgs... p_args) {