Skip to content

Commit aff5b41

Browse files
committed
Move some accessibility properties from Node to Control
1 parent 42c7f14 commit aff5b41

File tree

9 files changed

+289
-226
lines changed

9 files changed

+289
-226
lines changed

doc/classes/Control.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@
8585
[/codeblocks]
8686
</description>
8787
</method>
88+
<method name="_get_accessibility_container_name" qualifiers="virtual const">
89+
<return type="String" />
90+
<param index="0" name="node" type="Node" />
91+
<description>
92+
Override this method to return a human-readable description of the position of the child [param node] in the custom container, added to the [member accessibility_name].
93+
</description>
94+
</method>
8895
<method name="_get_drag_data" qualifiers="virtual">
8996
<return type="Variant" />
9097
<param index="0" name="at_position" type="Vector2" />
@@ -962,6 +969,27 @@
962969
</method>
963970
</methods>
964971
<members>
972+
<member name="accessibility_controls_nodes" type="NodePath[]" setter="set_accessibility_controls_nodes" getter="get_accessibility_controls_nodes" default="[]">
973+
The paths to the nodes which are controlled by this node.
974+
</member>
975+
<member name="accessibility_described_by_nodes" type="NodePath[]" setter="set_accessibility_described_by_nodes" getter="get_accessibility_described_by_nodes" default="[]">
976+
The paths to the nodes which are describing this node.
977+
</member>
978+
<member name="accessibility_description" type="String" setter="set_accessibility_description" getter="get_accessibility_description" default="&quot;&quot;">
979+
The human-readable node description that is reported to assistive apps.
980+
</member>
981+
<member name="accessibility_flow_to_nodes" type="NodePath[]" setter="set_accessibility_flow_to_nodes" getter="get_accessibility_flow_to_nodes" default="[]">
982+
The paths to the nodes which this node flows into.
983+
</member>
984+
<member name="accessibility_labeled_by_nodes" type="NodePath[]" setter="set_accessibility_labeled_by_nodes" getter="get_accessibility_labeled_by_nodes" default="[]">
985+
The paths to the nodes which label this node.
986+
</member>
987+
<member name="accessibility_live" type="int" setter="set_accessibility_live" getter="get_accessibility_live" enum="DisplayServer.AccessibilityLiveMode" default="0">
988+
The mode with which a live region updates. A live region is a [Node] that is updated as a result of an external event when the user's focus may be elsewhere.
989+
</member>
990+
<member name="accessibility_name" type="String" setter="set_accessibility_name" getter="get_accessibility_name" default="&quot;&quot;">
991+
The human-readable node name that is reported to assistive apps.
992+
</member>
965993
<member name="anchor_bottom" type="float" setter="_set_anchor" getter="get_anchor" default="0.0">
966994
Anchors the bottom edge of the node to the origin, the center, or the end of its parent control. It changes how the bottom offset updates when the node moves or changes size. You can use one of the [enum Anchor] constants for convenience.
967995
</member>

doc/classes/Node.xml

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,6 @@
4343
Returning an empty array produces no warnings.
4444
</description>
4545
</method>
46-
<method name="_get_accessibility_container_name" qualifiers="virtual const">
47-
<return type="String" />
48-
<param index="0" name="node" type="Node" />
49-
<description>
50-
Return a human-readable description of the position of [param node] child in the custom container, added to the node name.
51-
</description>
52-
</method>
5346
<method name="_get_configuration_warnings" qualifiers="virtual const">
5447
<return type="PackedStringArray" />
5548
<description>
@@ -1035,27 +1028,6 @@
10351028
</method>
10361029
</methods>
10371030
<members>
1038-
<member name="accessibility_controls_nodes" type="NodePath[]" setter="set_accessibility_controls_nodes" getter="get_accessibility_controls_nodes" default="[]">
1039-
The list of nodes which are controlled by this node.
1040-
</member>
1041-
<member name="accessibility_described_by_nodes" type="NodePath[]" setter="set_accessibility_described_by_nodes" getter="get_accessibility_described_by_nodes" default="[]">
1042-
The list of nodes which are describing this node.
1043-
</member>
1044-
<member name="accessibility_description" type="String" setter="set_accessibility_description" getter="get_accessibility_description" default="&quot;&quot;">
1045-
The human-readable node description that is reported to assistive apps.
1046-
</member>
1047-
<member name="accessibility_flow_to_nodes" type="NodePath[]" setter="set_accessibility_flow_to_nodes" getter="get_accessibility_flow_to_nodes" default="[]">
1048-
The list of nodes which this node flows into.
1049-
</member>
1050-
<member name="accessibility_labeled_by_nodes" type="NodePath[]" setter="set_accessibility_labeled_by_nodes" getter="get_accessibility_labeled_by_nodes" default="[]">
1051-
The list of nodes which label this node.
1052-
</member>
1053-
<member name="accessibility_live" type="int" setter="set_accessibility_live" getter="get_accessibility_live" enum="DisplayServer.AccessibilityLiveMode" default="0">
1054-
Live region update mode, a live region is [Node] that is updated as a result of an external event when user focus may be elsewhere.
1055-
</member>
1056-
<member name="accessibility_name" type="String" setter="set_accessibility_name" getter="get_accessibility_name" default="&quot;&quot;">
1057-
The human-readable node name that is reported to assistive apps.
1058-
</member>
10591031
<member name="auto_translate_mode" type="int" setter="set_auto_translate_mode" getter="get_auto_translate_mode" enum="Node.AutoTranslateMode" default="0">
10601032
Defines if any text should automatically change to its translated version depending on the current locale (for nodes such as [Label], [RichTextLabel], [Window], etc.). Also decides if the node's strings should be parsed for POT generation.
10611033
[b]Note:[/b] For the root node, auto translate mode can also be set via [member ProjectSettings.internationalization/rendering/root_node_auto_translate].

doc/classes/Window.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,12 @@
578578
</method>
579579
</methods>
580580
<members>
581+
<member name="accessibility_description" type="String" setter="set_accessibility_description" getter="get_accessibility_description" default="&quot;&quot;">
582+
The human-readable node description that is reported to assistive apps.
583+
</member>
584+
<member name="accessibility_name" type="String" setter="set_accessibility_name" getter="get_accessibility_name" default="&quot;&quot;">
585+
The human-readable node name that is reported to assistive apps.
586+
</member>
581587
<member name="always_on_top" type="bool" setter="set_flag" getter="get_flag" default="false">
582588
If [code]true[/code], the window will be on top of all other windows. Does not work if [member transient] is enabled.
583589
</member>

scene/gui/control.cpp

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2120,6 +2120,100 @@ void Control::accessibility_drop() {
21202120
queue_accessibility_update();
21212121
}
21222122

2123+
String Control::get_accessibility_container_name(const Node *p_node) const {
2124+
String ret;
2125+
if (GDVIRTUAL_CALL(_get_accessibility_container_name, p_node, ret)) {
2126+
} else if (data.parent_control) {
2127+
ret = data.parent_control->get_accessibility_container_name(this);
2128+
}
2129+
return ret;
2130+
}
2131+
2132+
void Control::set_accessibility_name(const String &p_name) {
2133+
ERR_THREAD_GUARD
2134+
if (data.accessibility_name != p_name) {
2135+
data.accessibility_name = p_name;
2136+
queue_accessibility_update();
2137+
update_configuration_warnings();
2138+
}
2139+
}
2140+
2141+
String Control::get_accessibility_name() const {
2142+
return tr(data.accessibility_name);
2143+
}
2144+
2145+
void Control::set_accessibility_description(const String &p_description) {
2146+
ERR_THREAD_GUARD
2147+
if (data.accessibility_description != p_description) {
2148+
data.accessibility_description = p_description;
2149+
queue_accessibility_update();
2150+
}
2151+
}
2152+
2153+
String Control::get_accessibility_description() const {
2154+
return tr(data.accessibility_description);
2155+
}
2156+
2157+
void Control::set_accessibility_live(DisplayServer::AccessibilityLiveMode p_mode) {
2158+
ERR_THREAD_GUARD
2159+
if (data.accessibility_live != p_mode) {
2160+
data.accessibility_live = p_mode;
2161+
queue_accessibility_update();
2162+
}
2163+
}
2164+
2165+
DisplayServer::AccessibilityLiveMode Control::get_accessibility_live() const {
2166+
return data.accessibility_live;
2167+
}
2168+
2169+
void Control::set_accessibility_controls_nodes(const TypedArray<NodePath> &p_node_path) {
2170+
ERR_MAIN_THREAD_GUARD;
2171+
if (data.accessibility_controls_nodes != p_node_path) {
2172+
data.accessibility_controls_nodes = p_node_path;
2173+
queue_accessibility_update();
2174+
}
2175+
}
2176+
2177+
TypedArray<NodePath> Control::get_accessibility_controls_nodes() const {
2178+
return data.accessibility_controls_nodes;
2179+
}
2180+
2181+
void Control::set_accessibility_described_by_nodes(const TypedArray<NodePath> &p_node_path) {
2182+
ERR_MAIN_THREAD_GUARD;
2183+
if (data.accessibility_described_by_nodes != p_node_path) {
2184+
data.accessibility_described_by_nodes = p_node_path;
2185+
queue_accessibility_update();
2186+
}
2187+
}
2188+
2189+
TypedArray<NodePath> Control::get_accessibility_described_by_nodes() const {
2190+
return data.accessibility_described_by_nodes;
2191+
}
2192+
2193+
void Control::set_accessibility_labeled_by_nodes(const TypedArray<NodePath> &p_node_path) {
2194+
ERR_MAIN_THREAD_GUARD;
2195+
if (data.accessibility_labeled_by_nodes != p_node_path) {
2196+
data.accessibility_labeled_by_nodes = p_node_path;
2197+
queue_accessibility_update();
2198+
}
2199+
}
2200+
2201+
TypedArray<NodePath> Control::get_accessibility_labeled_by_nodes() const {
2202+
return data.accessibility_labeled_by_nodes;
2203+
}
2204+
2205+
void Control::set_accessibility_flow_to_nodes(const TypedArray<NodePath> &p_node_path) {
2206+
ERR_MAIN_THREAD_GUARD;
2207+
if (data.accessibility_flow_to_nodes != p_node_path) {
2208+
data.accessibility_flow_to_nodes = p_node_path;
2209+
queue_accessibility_update();
2210+
}
2211+
}
2212+
2213+
TypedArray<NodePath> Control::get_accessibility_flow_to_nodes() const {
2214+
return data.accessibility_flow_to_nodes;
2215+
}
2216+
21232217
void Control::set_drag_preview(Control *p_control) {
21242218
ERR_MAIN_THREAD_GUARD;
21252219
ERR_FAIL_COND(!is_inside_tree());
@@ -3605,6 +3699,16 @@ void Control::_notification(int p_notification) {
36053699
RID ae = get_accessibility_element();
36063700
ERR_FAIL_COND(ae.is_null());
36073701

3702+
// Base info.
3703+
if (get_parent_control()) {
3704+
String container_info = get_parent_control()->get_accessibility_container_name(this);
3705+
DisplayServer::get_singleton()->accessibility_update_set_name(ae, container_info.is_empty() ? get_accessibility_name() : get_accessibility_name() + " " + container_info);
3706+
} else {
3707+
DisplayServer::get_singleton()->accessibility_update_set_name(ae, get_accessibility_name());
3708+
}
3709+
DisplayServer::get_singleton()->accessibility_update_set_description(ae, get_accessibility_description());
3710+
DisplayServer::get_singleton()->accessibility_update_set_live(ae, get_accessibility_live());
3711+
36083712
DisplayServer::get_singleton()->accessibility_update_set_transform(ae, get_transform());
36093713
DisplayServer::get_singleton()->accessibility_update_set_bounds(ae, Rect2(Vector2(), data.size_cache));
36103714
DisplayServer::get_singleton()->accessibility_update_set_tooltip(ae, data.tooltip);
@@ -3623,6 +3727,44 @@ void Control::_notification(int p_notification) {
36233727
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")));
36243728
}
36253729
}
3730+
3731+
// Related nodes.
3732+
for (int i = 0; i < data.accessibility_controls_nodes.size(); i++) {
3733+
const NodePath &np = data.accessibility_controls_nodes[i];
3734+
if (!np.is_empty()) {
3735+
Node *n = get_node(np);
3736+
if (n && !n->is_part_of_edited_scene()) {
3737+
DisplayServer::get_singleton()->accessibility_update_add_related_controls(ae, n->get_accessibility_element());
3738+
}
3739+
}
3740+
}
3741+
for (int i = 0; i < data.accessibility_described_by_nodes.size(); i++) {
3742+
const NodePath &np = data.accessibility_described_by_nodes[i];
3743+
if (!np.is_empty()) {
3744+
Node *n = get_node(np);
3745+
if (n && !n->is_part_of_edited_scene()) {
3746+
DisplayServer::get_singleton()->accessibility_update_add_related_described_by(ae, n->get_accessibility_element());
3747+
}
3748+
}
3749+
}
3750+
for (int i = 0; i < data.accessibility_labeled_by_nodes.size(); i++) {
3751+
const NodePath &np = data.accessibility_labeled_by_nodes[i];
3752+
if (!np.is_empty()) {
3753+
Node *n = get_node(np);
3754+
if (n && !n->is_part_of_edited_scene()) {
3755+
DisplayServer::get_singleton()->accessibility_update_add_related_labeled_by(ae, n->get_accessibility_element());
3756+
}
3757+
}
3758+
}
3759+
for (int i = 0; i < data.accessibility_flow_to_nodes.size(); i++) {
3760+
const NodePath &np = data.accessibility_flow_to_nodes[i];
3761+
if (!np.is_empty()) {
3762+
Node *n = get_node(np);
3763+
if (n && !n->is_part_of_edited_scene()) {
3764+
DisplayServer::get_singleton()->accessibility_update_add_related_flow_to(ae, n->get_accessibility_element());
3765+
}
3766+
}
3767+
}
36263768
} break;
36273769

36283770
case NOTIFICATION_POSTINITIALIZE: {
@@ -3962,6 +4104,22 @@ void Control::_bind_methods() {
39624104
ClassDB::bind_method(D_METHOD("accessibility_drag"), &Control::accessibility_drag);
39634105
ClassDB::bind_method(D_METHOD("accessibility_drop"), &Control::accessibility_drop);
39644106

4107+
ClassDB::bind_method(D_METHOD("set_accessibility_name", "name"), &Control::set_accessibility_name);
4108+
ClassDB::bind_method(D_METHOD("get_accessibility_name"), &Control::get_accessibility_name);
4109+
ClassDB::bind_method(D_METHOD("set_accessibility_description", "description"), &Control::set_accessibility_description);
4110+
ClassDB::bind_method(D_METHOD("get_accessibility_description"), &Control::get_accessibility_description);
4111+
ClassDB::bind_method(D_METHOD("set_accessibility_live", "mode"), &Control::set_accessibility_live);
4112+
ClassDB::bind_method(D_METHOD("get_accessibility_live"), &Control::get_accessibility_live);
4113+
4114+
ClassDB::bind_method(D_METHOD("set_accessibility_controls_nodes", "node_path"), &Control::set_accessibility_controls_nodes);
4115+
ClassDB::bind_method(D_METHOD("get_accessibility_controls_nodes"), &Control::get_accessibility_controls_nodes);
4116+
ClassDB::bind_method(D_METHOD("set_accessibility_described_by_nodes", "node_path"), &Control::set_accessibility_described_by_nodes);
4117+
ClassDB::bind_method(D_METHOD("get_accessibility_described_by_nodes"), &Control::get_accessibility_described_by_nodes);
4118+
ClassDB::bind_method(D_METHOD("set_accessibility_labeled_by_nodes", "node_path"), &Control::set_accessibility_labeled_by_nodes);
4119+
ClassDB::bind_method(D_METHOD("get_accessibility_labeled_by_nodes"), &Control::get_accessibility_labeled_by_nodes);
4120+
ClassDB::bind_method(D_METHOD("set_accessibility_flow_to_nodes", "node_path"), &Control::set_accessibility_flow_to_nodes);
4121+
ClassDB::bind_method(D_METHOD("get_accessibility_flow_to_nodes"), &Control::get_accessibility_flow_to_nodes);
4122+
39654123
ClassDB::bind_method(D_METHOD("set_mouse_filter", "filter"), &Control::set_mouse_filter);
39664124
ClassDB::bind_method(D_METHOD("get_mouse_filter"), &Control::get_mouse_filter);
39674125
ClassDB::bind_method(D_METHOD("get_mouse_filter_with_override"), &Control::get_mouse_filter_with_override);
@@ -4102,6 +4260,15 @@ void Control::_bind_methods() {
41024260
ADD_GROUP("Input", "");
41034261
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context");
41044262

4263+
ADD_GROUP("Accessibility", "accessibility_");
4264+
ADD_PROPERTY(PropertyInfo(Variant::STRING, "accessibility_name"), "set_accessibility_name", "get_accessibility_name");
4265+
ADD_PROPERTY(PropertyInfo(Variant::STRING, "accessibility_description"), "set_accessibility_description", "get_accessibility_description");
4266+
ADD_PROPERTY(PropertyInfo(Variant::INT, "accessibility_live", PROPERTY_HINT_ENUM, "Off,Polite,Assertive"), "set_accessibility_live", "get_accessibility_live");
4267+
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_controls_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_controls_nodes", "get_accessibility_controls_nodes");
4268+
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_described_by_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_described_by_nodes", "get_accessibility_described_by_nodes");
4269+
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_labeled_by_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_labeled_by_nodes", "get_accessibility_labeled_by_nodes");
4270+
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "accessibility_flow_to_nodes", PROPERTY_HINT_ARRAY_TYPE, "NodePath"), "set_accessibility_flow_to_nodes", "get_accessibility_flow_to_nodes");
4271+
41054272
ADD_GROUP("Theme", "theme_");
41064273
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme");
41074274
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() {
42254392
GDVIRTUAL_BIND(_make_custom_tooltip, "for_text");
42264393

42274394
GDVIRTUAL_BIND(_accessibility_get_contextual_info);
4395+
GDVIRTUAL_BIND(_get_accessibility_container_name, "node");
42284396

42294397
GDVIRTUAL_BIND(_gui_input, "event");
42304398
}

scene/gui/control.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,17 @@ class Control : public CanvasItem {
250250

251251
ObjectID shortcut_context;
252252

253+
// Accessibility.
254+
255+
String accessibility_name;
256+
String accessibility_description;
257+
DisplayServer::AccessibilityLiveMode accessibility_live = DisplayServer::AccessibilityLiveMode::LIVE_OFF;
258+
259+
TypedArray<NodePath> accessibility_controls_nodes;
260+
TypedArray<NodePath> accessibility_described_by_nodes;
261+
TypedArray<NodePath> accessibility_labeled_by_nodes;
262+
TypedArray<NodePath> accessibility_flow_to_nodes;
263+
253264
// Theming.
254265

255266
ThemeOwner *theme_owner = nullptr;
@@ -396,6 +407,7 @@ class Control : public CanvasItem {
396407
GDVIRTUAL1RC(Object *, _make_custom_tooltip, String)
397408

398409
GDVIRTUAL0RC(String, _accessibility_get_contextual_info);
410+
GDVIRTUAL1RC(String, _get_accessibility_container_name, const Node *)
399411

400412
GDVIRTUAL1(_gui_input, Ref<InputEvent>)
401413

@@ -597,6 +609,31 @@ class Control : public CanvasItem {
597609
void set_focus_previous(const NodePath &p_prev);
598610
NodePath get_focus_previous() const;
599611

612+
// Accessibility.
613+
614+
virtual String get_accessibility_container_name(const Node *p_node) const;
615+
616+
void set_accessibility_name(const String &p_name);
617+
String get_accessibility_name() const;
618+
619+
void set_accessibility_description(const String &p_description);
620+
String get_accessibility_description() const;
621+
622+
void set_accessibility_live(DisplayServer::AccessibilityLiveMode p_mode);
623+
DisplayServer::AccessibilityLiveMode get_accessibility_live() const;
624+
625+
void set_accessibility_controls_nodes(const TypedArray<NodePath> &p_node_path);
626+
TypedArray<NodePath> get_accessibility_controls_nodes() const;
627+
628+
void set_accessibility_described_by_nodes(const TypedArray<NodePath> &p_node_path);
629+
TypedArray<NodePath> get_accessibility_described_by_nodes() const;
630+
631+
void set_accessibility_labeled_by_nodes(const TypedArray<NodePath> &p_node_path);
632+
TypedArray<NodePath> get_accessibility_labeled_by_nodes() const;
633+
634+
void set_accessibility_flow_to_nodes(const TypedArray<NodePath> &p_node_path);
635+
TypedArray<NodePath> get_accessibility_flow_to_nodes() const;
636+
600637
// Rendering.
601638

602639
void set_default_cursor_shape(CursorShape p_shape);

0 commit comments

Comments
 (0)