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

@ -56,6 +56,7 @@ private:
friend class Tree;
struct Cell {
mutable RID accessibility_cell_element;
TreeCellMode mode = TreeItem::CELL_MODE_STRING;
Ref<Texture2D> icon;
@ -64,6 +65,7 @@ private:
String text;
String xl_text;
Node::AutoTranslateMode auto_translate_mode = Node::AUTO_TRANSLATE_MODE_INHERIT;
String alt_text;
bool edit_multiline = false;
String suffix;
Ref<TextParagraph> text_buf;
@ -104,11 +106,13 @@ private:
Callable custom_draw_callback;
struct Button {
mutable RID accessibility_button_element;
int id = 0;
bool disabled = false;
Ref<Texture2D> texture;
Color color = Color(1, 1, 1, 1);
String tooltip;
String alt_text;
};
Vector<Button> buttons;
@ -125,6 +129,9 @@ private:
void draw_icon(const RID &p_where, const Point2 &p_pos, const Size2 &p_size = Size2(), const Color &p_color = Color()) const;
};
mutable RID accessibility_row_element;
mutable bool accessibility_row_dirty = true;
Vector<Cell> cells;
bool collapsed = false; // Won't show children.
@ -165,6 +172,22 @@ private:
}
_FORCE_INLINE_ void _unlink_from_tree() {
if (accessibility_row_element.is_valid()) {
DisplayServer::get_singleton()->accessibility_free_element(accessibility_row_element);
accessibility_row_element = RID();
}
for (Cell &cell : cells) {
if (cell.accessibility_cell_element.is_valid()) {
DisplayServer::get_singleton()->accessibility_free_element(cell.accessibility_cell_element);
cell.accessibility_cell_element = RID();
}
for (Cell::Button &btn : cell.buttons) {
if (btn.accessibility_button_element.is_valid()) {
DisplayServer::get_singleton()->accessibility_free_element(btn.accessibility_button_element);
btn.accessibility_button_element = RID();
}
}
}
TreeItem *p = get_prev();
if (p) {
p->next = next;
@ -190,6 +213,11 @@ private:
protected:
static void _bind_methods();
#ifndef DISABLE_DEPRECATED
void _add_button_bind_compat_76829(int p_column, const Ref<Texture2D> &p_button, int p_id, bool p_disabled, const String &p_tooltip);
static void _bind_compatibility_methods();
#endif
// Bind helpers.
Dictionary _get_range_config(int p_column) {
Dictionary d;
@ -240,6 +268,9 @@ public:
void set_text(int p_column, String p_text);
String get_text(int p_column) const;
void set_alt_text(int p_column, String p_text);
String get_alt_text(int p_column) const;
void set_text_direction(int p_column, Control::TextDirection p_text_direction);
Control::TextDirection get_text_direction(int p_column) const;
@ -277,7 +308,7 @@ public:
int get_icon_max_width(int p_column) const;
void clear_buttons();
void add_button(int p_column, const Ref<Texture2D> &p_button, int p_id = -1, bool p_disabled = false, const String &p_tooltip = "");
void add_button(int p_column, const Ref<Texture2D> &p_button, int p_id = -1, bool p_disabled = false, const String &p_tooltip = "", const String &p_alt_text = "");
int get_button_count(int p_column) const;
String get_button_tooltip_text(int p_column, int p_index) const;
Ref<Texture2D> get_button(int p_column, int p_index) const;
@ -287,6 +318,7 @@ public:
Color get_button_color(int p_column, int p_index) const;
void set_button_tooltip_text(int p_column, int p_index, const String &p_tooltip);
void set_button(int p_column, int p_index, const Ref<Texture2D> &p_button);
void set_button_alt_text(int p_column, int p_index, const String &p_alt_text);
void set_button_color(int p_column, int p_index, const Color &p_color);
void set_button_disabled(int p_column, int p_index, bool p_disabled);
bool is_button_disabled(int p_column, int p_index) const;
@ -460,6 +492,7 @@ private:
Rect2 custom_popup_rect;
int edited_col = -1;
int selected_col = -1;
int selected_button = -1;
int popup_edited_item_col = -1;
bool hide_root = false;
SelectMode select_mode = SELECT_SINGLE;
@ -469,6 +502,7 @@ private:
int drop_mode_flags = 0;
struct ColumnInfo {
mutable RID accessibility_col_element;
int custom_min_width = 0;
int expand_ratio = 1;
bool expand = true;
@ -493,6 +527,8 @@ private:
VBoxContainer *popup_editor_vb = nullptr;
bool popup_edit_committed = true;
RID accessibility_scroll_element;
Popup *popup_editor = nullptr;
LineEdit *line_editor = nullptr;
TextEdit *text_editor = nullptr;
@ -624,7 +660,6 @@ private:
CLICK_NONE,
CLICK_TITLE,
CLICK_BUTTON,
};
ClickType click_type = Cache::CLICK_NONE;
@ -714,13 +749,39 @@ private:
Rect2 _get_content_rect() const; // Considering the background stylebox and scrollbars.
Rect2 _get_item_focus_rect(const TreeItem *p_item) const;
void _check_item_accessibility(TreeItem *p_item, PackedStringArray &r_warnings, int &r_row) const;
void _accessibility_clean_info(TreeItem *p_item);
void _accessibility_update_item(Point2 &r_ofs, TreeItem *p_item, int &r_row, int p_level);
protected:
virtual void _update_theme_item_cache() override;
void _notification(int p_what);
static void _bind_methods();
void _accessibility_action_scroll_down(const Variant &p_data);
void _accessibility_action_scroll_left(const Variant &p_data);
void _accessibility_action_scroll_right(const Variant &p_data);
void _accessibility_action_scroll_up(const Variant &p_data);
void _accessibility_action_scroll_set(const Variant &p_data);
void _accessibility_action_scroll_into_view(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_focus(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_blur(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_collapse(const Variant &p_data, TreeItem *p_item);
void _accessibility_action_expand(const Variant &p_data, TreeItem *p_item);
void _accessibility_action_set_text_value(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_set_num_value(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_set_bool_value(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_set_inc(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_set_dec(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_edit_custom(const Variant &p_data, TreeItem *p_item, int p_col);
void _accessibility_action_button_press(const Variant &p_data, TreeItem *p_item, int p_col, int p_btn);
public:
PackedStringArray get_accessibility_configuration_warnings() const override;
virtual RID get_focused_accessibility_element() const override;
virtual void gui_input(const Ref<InputEvent> &p_event) override;
virtual String get_tooltip(const Point2 &p_pos) const override;