Base accessibility API.

This commit is contained in:
Pāvels Nadtočajevs 2025-03-21 16:42:23 +02:00
parent af2c713971
commit b106dfd4f9
No known key found for this signature in database
GPG key ID: 8413210218EF35D2
124 changed files with 7631 additions and 181 deletions

View file

@ -41,6 +41,7 @@ void BaseButton::_unpress_group() {
if (toggle_mode && !button_group->is_allow_unpress()) {
status.pressed = true;
queue_accessibility_update();
}
for (BaseButton *E : button_group->buttons) {
@ -83,15 +84,66 @@ void BaseButton::gui_input(const Ref<InputEvent> &p_event) {
}
}
void BaseButton::_accessibility_action_click(const Variant &p_data) {
if (toggle_mode) {
status.pressed = !status.pressed;
if (status.pressed) {
_unpress_group();
if (button_group.is_valid()) {
button_group->emit_signal(SceneStringName(pressed), this);
}
}
_toggled(status.pressed);
_pressed();
} else {
_pressed();
}
queue_accessibility_update();
queue_redraw();
}
void BaseButton::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ACCESSIBILITY_UPDATE: {
RID ae = get_accessibility_element();
ERR_FAIL_COND(ae.is_null());
DisplayServer::get_singleton()->accessibility_update_set_role(ae, DisplayServer::AccessibilityRole::ROLE_BUTTON);
DisplayServer::get_singleton()->accessibility_update_add_action(ae, DisplayServer::AccessibilityAction::ACTION_CLICK, callable_mp(this, &BaseButton::_accessibility_action_click));
DisplayServer::get_singleton()->accessibility_update_set_flag(ae, DisplayServer::AccessibilityFlags::FLAG_DISABLED, status.disabled);
if (toggle_mode) {
DisplayServer::get_singleton()->accessibility_update_set_checked(ae, status.pressed);
}
if (button_group.is_valid()) {
for (const BaseButton *btn : button_group->buttons) {
if (btn->is_part_of_edited_scene()) {
continue;
}
DisplayServer::get_singleton()->accessibility_update_add_related_radio_group(ae, btn->get_accessibility_element());
}
}
if (shortcut_in_tooltip && shortcut.is_valid() && shortcut->has_valid_event()) {
String text = atr(shortcut->get_name()) + " (" + shortcut->get_as_text() + ")";
String tooltip = get_tooltip_text();
if (!tooltip.is_empty() && shortcut->get_name().nocasecmp_to(tooltip) != 0) {
text += "\n" + atr(tooltip);
}
DisplayServer::get_singleton()->accessibility_update_set_tooltip(ae, text);
}
} break;
case NOTIFICATION_MOUSE_ENTER: {
status.hovering = true;
queue_accessibility_update();
queue_redraw();
} break;
case NOTIFICATION_MOUSE_EXIT: {
status.hovering = false;
queue_accessibility_update();
queue_redraw();
} break;
@ -175,6 +227,7 @@ void BaseButton::on_action_event(Ref<InputEvent> p_event) {
}
_toggled(status.pressed);
_pressed();
queue_accessibility_update();
}
} else {
if ((p_event->is_pressed() && action_mode == ACTION_MODE_BUTTON_PRESS) || (!p_event->is_pressed() && action_mode == ACTION_MODE_BUTTON_RELEASE)) {
@ -214,6 +267,7 @@ void BaseButton::set_disabled(bool p_disabled) {
status.press_attempt = false;
status.pressing_inside = false;
}
queue_accessibility_update();
queue_redraw();
update_minimum_size();
}
@ -247,7 +301,7 @@ void BaseButton::set_pressed_no_signal(bool p_pressed) {
return;
}
status.pressed = p_pressed;
queue_accessibility_update();
queue_redraw();
}
@ -303,6 +357,7 @@ void BaseButton::set_toggle_mode(bool p_on) {
if (!p_on) {
set_pressed(false);
}
queue_accessibility_update();
toggle_mode = p_on;
update_configuration_warnings();
@ -313,7 +368,10 @@ bool BaseButton::is_toggle_mode() const {
}
void BaseButton::set_shortcut_in_tooltip(bool p_on) {
shortcut_in_tooltip = p_on;
if (shortcut_in_tooltip != p_on) {
shortcut_in_tooltip = p_on;
queue_accessibility_update();
}
}
bool BaseButton::is_shortcut_in_tooltip_enabled() const {
@ -353,8 +411,11 @@ bool BaseButton::is_shortcut_feedback() const {
}
void BaseButton::set_shortcut(const Ref<Shortcut> &p_shortcut) {
shortcut = p_shortcut;
set_process_shortcut_input(shortcut.is_valid());
if (shortcut != p_shortcut) {
shortcut = p_shortcut;
set_process_shortcut_input(shortcut.is_valid());
queue_accessibility_update();
}
}
Ref<Shortcut> BaseButton::get_shortcut() const {
@ -380,7 +441,7 @@ void BaseButton::shortcut_input(const Ref<InputEvent> &p_event) {
_toggled(status.pressed);
_pressed();
queue_accessibility_update();
} else {
_pressed();
}
@ -440,6 +501,7 @@ void BaseButton::set_button_group(const Ref<ButtonGroup> &p_group) {
button_group->buttons.insert(this);
}
queue_accessibility_update();
queue_redraw(); //checkbox changes to radio if set a buttongroup
update_configuration_warnings();
}