|
@@ -2120,6 +2120,100 @@ void Control::accessibility_drop() {
|
|
queue_accessibility_update();
|
|
queue_accessibility_update();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+String Control::get_accessibility_container_name(const Node *p_node) const {
|
|
|
|
+ String ret;
|
|
|
|
+ if (GDVIRTUAL_CALL(_get_accessibility_container_name, p_node, ret)) {
|
|
|
|
+ } else if (data.parent_control) {
|
|
|
|
+ ret = data.parent_control->get_accessibility_container_name(this);
|
|
|
|
+ }
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_name(const String &p_name) {
|
|
|
|
+ ERR_THREAD_GUARD
|
|
|
|
+ if (data.accessibility_name != p_name) {
|
|
|
|
+ data.accessibility_name = p_name;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ update_configuration_warnings();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+String Control::get_accessibility_name() const {
|
|
|
|
+ return tr(data.accessibility_name);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_description(const String &p_description) {
|
|
|
|
+ ERR_THREAD_GUARD
|
|
|
|
+ if (data.accessibility_description != p_description) {
|
|
|
|
+ data.accessibility_description = p_description;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+String Control::get_accessibility_description() const {
|
|
|
|
+ return tr(data.accessibility_description);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_live(DisplayServer::AccessibilityLiveMode p_mode) {
|
|
|
|
+ ERR_THREAD_GUARD
|
|
|
|
+ if (data.accessibility_live != p_mode) {
|
|
|
|
+ data.accessibility_live = p_mode;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DisplayServer::AccessibilityLiveMode Control::get_accessibility_live() const {
|
|
|
|
+ return data.accessibility_live;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_controls_nodes(const TypedArray<NodePath> &p_node_path) {
|
|
|
|
+ ERR_MAIN_THREAD_GUARD;
|
|
|
|
+ if (data.accessibility_controls_nodes != p_node_path) {
|
|
|
|
+ data.accessibility_controls_nodes = p_node_path;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+TypedArray<NodePath> Control::get_accessibility_controls_nodes() const {
|
|
|
|
+ return data.accessibility_controls_nodes;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_described_by_nodes(const TypedArray<NodePath> &p_node_path) {
|
|
|
|
+ ERR_MAIN_THREAD_GUARD;
|
|
|
|
+ if (data.accessibility_described_by_nodes != p_node_path) {
|
|
|
|
+ data.accessibility_described_by_nodes = p_node_path;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+TypedArray<NodePath> Control::get_accessibility_described_by_nodes() const {
|
|
|
|
+ return data.accessibility_described_by_nodes;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_labeled_by_nodes(const TypedArray<NodePath> &p_node_path) {
|
|
|
|
+ ERR_MAIN_THREAD_GUARD;
|
|
|
|
+ if (data.accessibility_labeled_by_nodes != p_node_path) {
|
|
|
|
+ data.accessibility_labeled_by_nodes = p_node_path;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+TypedArray<NodePath> Control::get_accessibility_labeled_by_nodes() const {
|
|
|
|
+ return data.accessibility_labeled_by_nodes;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Control::set_accessibility_flow_to_nodes(const TypedArray<NodePath> &p_node_path) {
|
|
|
|
+ ERR_MAIN_THREAD_GUARD;
|
|
|
|
+ if (data.accessibility_flow_to_nodes != p_node_path) {
|
|
|
|
+ data.accessibility_flow_to_nodes = p_node_path;
|
|
|
|
+ queue_accessibility_update();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+TypedArray<NodePath> Control::get_accessibility_flow_to_nodes() const {
|
|
|
|
+ return data.accessibility_flow_to_nodes;
|
|
|
|
+}
|
|
|
|
+
|
|
void Control::set_drag_preview(Control *p_control) {
|
|
void Control::set_drag_preview(Control *p_control) {
|
|
ERR_MAIN_THREAD_GUARD;
|
|
ERR_MAIN_THREAD_GUARD;
|
|
ERR_FAIL_COND(!is_inside_tree());
|
|
ERR_FAIL_COND(!is_inside_tree());
|
|
@@ -3605,6 +3699,16 @@ void Control::_notification(int p_notification) {
|
|
RID ae = get_accessibility_element();
|
|
RID ae = get_accessibility_element();
|
|
ERR_FAIL_COND(ae.is_null());
|
|
ERR_FAIL_COND(ae.is_null());
|
|
|
|
|
|
|
|
+ // Base info.
|
|
|
|
+ if (get_parent_control()) {
|
|
|
|
+ String container_info = get_parent_control()->get_accessibility_container_name(this);
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_set_name(ae, container_info.is_empty() ? get_accessibility_name() : get_accessibility_name() + " " + container_info);
|
|
|
|
+ } else {
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_set_name(ae, get_accessibility_name());
|
|
|
|
+ }
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_set_description(ae, get_accessibility_description());
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_set_live(ae, get_accessibility_live());
|
|
|
|
+
|
|
DisplayServer::get_singleton()->accessibility_update_set_transform(ae, get_transform());
|
|
DisplayServer::get_singleton()->accessibility_update_set_transform(ae, get_transform());
|
|
DisplayServer::get_singleton()->accessibility_update_set_bounds(ae, Rect2(Vector2(), data.size_cache));
|
|
DisplayServer::get_singleton()->accessibility_update_set_bounds(ae, Rect2(Vector2(), data.size_cache));
|
|
DisplayServer::get_singleton()->accessibility_update_set_tooltip(ae, data.tooltip);
|
|
DisplayServer::get_singleton()->accessibility_update_set_tooltip(ae, data.tooltip);
|
|
@@ -3623,6 +3727,44 @@ void Control::_notification(int p_notification) {
|
|
DisplayServer::get_singleton()->accessibility_update_set_extra_info(ae, vformat(RTR("%s can not be dropped here. Use %s to cancel."), get_viewport()->gui_get_drag_description(), InputMap::get_singleton()->get_action_description("ui_cancel")));
|
|
DisplayServer::get_singleton()->accessibility_update_set_extra_info(ae, vformat(RTR("%s can not be dropped here. Use %s to cancel."), get_viewport()->gui_get_drag_description(), InputMap::get_singleton()->get_action_description("ui_cancel")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // Related nodes.
|
|
|
|
+ for (int i = 0; i < data.accessibility_controls_nodes.size(); i++) {
|
|
|
|
+ const NodePath &np = data.accessibility_controls_nodes[i];
|
|
|
|
+ if (!np.is_empty()) {
|
|
|
|
+ Node *n = get_node(np);
|
|
|
|
+ if (n && !n->is_part_of_edited_scene()) {
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_add_related_controls(ae, n->get_accessibility_element());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < data.accessibility_described_by_nodes.size(); i++) {
|
|
|
|
+ const NodePath &np = data.accessibility_described_by_nodes[i];
|
|
|
|
+ if (!np.is_empty()) {
|
|
|
|
+ Node *n = get_node(np);
|
|
|
|
+ if (n && !n->is_part_of_edited_scene()) {
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_add_related_described_by(ae, n->get_accessibility_element());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < data.accessibility_labeled_by_nodes.size(); i++) {
|
|
|
|
+ const NodePath &np = data.accessibility_labeled_by_nodes[i];
|
|
|
|
+ if (!np.is_empty()) {
|
|
|
|
+ Node *n = get_node(np);
|
|
|
|
+ if (n && !n->is_part_of_edited_scene()) {
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_add_related_labeled_by(ae, n->get_accessibility_element());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < data.accessibility_flow_to_nodes.size(); i++) {
|
|
|
|
+ const NodePath &np = data.accessibility_flow_to_nodes[i];
|
|
|
|
+ if (!np.is_empty()) {
|
|
|
|
+ Node *n = get_node(np);
|
|
|
|
+ if (n && !n->is_part_of_edited_scene()) {
|
|
|
|
+ DisplayServer::get_singleton()->accessibility_update_add_related_flow_to(ae, n->get_accessibility_element());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
|
|
|
|
case NOTIFICATION_POSTINITIALIZE: {
|
|
case NOTIFICATION_POSTINITIALIZE: {
|
|
@@ -3962,6 +4104,22 @@ void Control::_bind_methods() {
|
|
ClassDB::bind_method(D_METHOD("accessibility_drag"), &Control::accessibility_drag);
|
|
ClassDB::bind_method(D_METHOD("accessibility_drag"), &Control::accessibility_drag);
|
|
ClassDB::bind_method(D_METHOD("accessibility_drop"), &Control::accessibility_drop);
|
|
ClassDB::bind_method(D_METHOD("accessibility_drop"), &Control::accessibility_drop);
|
|
|
|
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_name", "name"), &Control::set_accessibility_name);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_name"), &Control::get_accessibility_name);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_description", "description"), &Control::set_accessibility_description);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_description"), &Control::get_accessibility_description);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_live", "mode"), &Control::set_accessibility_live);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_live"), &Control::get_accessibility_live);
|
|
|
|
+
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_controls_nodes", "node_path"), &Control::set_accessibility_controls_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_controls_nodes"), &Control::get_accessibility_controls_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_described_by_nodes", "node_path"), &Control::set_accessibility_described_by_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_described_by_nodes"), &Control::get_accessibility_described_by_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_labeled_by_nodes", "node_path"), &Control::set_accessibility_labeled_by_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_labeled_by_nodes"), &Control::get_accessibility_labeled_by_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_accessibility_flow_to_nodes", "node_path"), &Control::set_accessibility_flow_to_nodes);
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_accessibility_flow_to_nodes"), &Control::get_accessibility_flow_to_nodes);
|
|
|
|
+
|
|
ClassDB::bind_method(D_METHOD("set_mouse_filter", "filter"), &Control::set_mouse_filter);
|
|
ClassDB::bind_method(D_METHOD("set_mouse_filter", "filter"), &Control::set_mouse_filter);
|
|
ClassDB::bind_method(D_METHOD("get_mouse_filter"), &Control::get_mouse_filter);
|
|
ClassDB::bind_method(D_METHOD("get_mouse_filter"), &Control::get_mouse_filter);
|
|
ClassDB::bind_method(D_METHOD("get_mouse_filter_with_override"), &Control::get_mouse_filter_with_override);
|
|
ClassDB::bind_method(D_METHOD("get_mouse_filter_with_override"), &Control::get_mouse_filter_with_override);
|
|
@@ -4102,6 +4260,15 @@ void Control::_bind_methods() {
|
|
ADD_GROUP("Input", "");
|
|
ADD_GROUP("Input", "");
|
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context");
|
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context");
|
|
|
|
|
|
|
|
+ ADD_GROUP("Accessibility", "accessibility_");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "accessibility_name"), "set_accessibility_name", "get_accessibility_name");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "accessibility_description"), "set_accessibility_description", "get_accessibility_description");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "accessibility_live", PROPERTY_HINT_ENUM, "Off,Polite,Assertive"), "set_accessibility_live", "get_accessibility_live");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_controls_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_controls_nodes", "get_accessibility_controls_nodes");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_described_by_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_described_by_nodes", "get_accessibility_described_by_nodes");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_labeled_by_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_labeled_by_nodes", "get_accessibility_labeled_by_nodes");
|
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_flow_to_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_flow_to_nodes", "get_accessibility_flow_to_nodes");
|
|
|
|
+
|
|
ADD_GROUP("Theme", "theme_");
|
|
ADD_GROUP("Theme", "theme_");
|
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme");
|
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme");
|
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "theme_type_variation", PROPERTY_HINT_ENUM_SUGGESTION), "set_theme_type_variation", "get_theme_type_variation");
|
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "theme_type_variation", PROPERTY_HINT_ENUM_SUGGESTION), "set_theme_type_variation", "get_theme_type_variation");
|
|
@@ -4225,6 +4392,7 @@ void Control::_bind_methods() {
|
|
GDVIRTUAL_BIND(_make_custom_tooltip, "for_text");
|
|
GDVIRTUAL_BIND(_make_custom_tooltip, "for_text");
|
|
|
|
|
|
GDVIRTUAL_BIND(_accessibility_get_contextual_info);
|
|
GDVIRTUAL_BIND(_accessibility_get_contextual_info);
|
|
|
|
+ GDVIRTUAL_BIND(_get_accessibility_container_name, "node");
|
|
|
|
|
|
GDVIRTUAL_BIND(_gui_input, "event");
|
|
GDVIRTUAL_BIND(_gui_input, "event");
|
|
}
|
|
}
|