From d89cb12c3144448fba1be4f15822548db26299f2 Mon Sep 17 00:00:00 2001 From: Arnold Loubriat Date: Sun, 23 Jun 2024 14:52:33 +0200 Subject: [PATCH] Add the `accessible-placeholder-text` property --- api/cpp/include/slint-testing.h | 11 +++++++++-- docs/reference/src/language/builtins/elements.md | 1 + examples/todo-mvc/ui/views/create_task_view.slint | 3 ++- internal/backends/testing/search_api.rs | 10 ++++++++++ internal/backends/winit/accesskit.rs | 11 ++++++++++- internal/compiler/typeregister.rs | 1 + internal/compiler/widgets/cosmic-base/lineedit.slint | 2 +- .../compiler/widgets/cupertino-base/lineedit.slint | 2 +- internal/compiler/widgets/fluent-base/lineedit.slint | 2 +- .../compiler/widgets/material-base/lineedit.slint | 2 +- internal/core/accessibility.rs | 1 + 11 files changed, 38 insertions(+), 8 deletions(-) diff --git a/api/cpp/include/slint-testing.h b/api/cpp/include/slint-testing.h index b43cd390d5a..631326a24f4 100644 --- a/api/cpp/include/slint-testing.h +++ b/api/cpp/include/slint-testing.h @@ -51,8 +51,8 @@ class ElementHandle typename R = std::invoke_result_t> requires((std::is_constructible_v && std::is_default_constructible_v) || std::is_void_v) - static auto visit_elements(const ComponentHandle &component, - Visitor visitor) -> std::invoke_result_t + static auto visit_elements(const ComponentHandle &component, Visitor visitor) + -> std::invoke_result_t { // using R = std::invoke_result_t; auto vrc = component.into_dyn(); @@ -232,6 +232,13 @@ class ElementHandle return get_accessible_string_property(cbindgen_private::AccessibleStringProperty::Value); } + /// Returns the accessible-placeholder-text of that element, if any. + std::optional accessible_placeholder_text() const + { + return get_accessible_string_property( + cbindgen_private::AccessibleStringProperty::PlaceholderText); + } + /// Returns the accessible-description of that element, if any. std::optional accessible_description() const { diff --git a/docs/reference/src/language/builtins/elements.md b/docs/reference/src/language/builtins/elements.md index 5428d965e1d..09225a5af14 100644 --- a/docs/reference/src/language/builtins/elements.md +++ b/docs/reference/src/language/builtins/elements.md @@ -73,6 +73,7 @@ Use the following `accessible-` properties to make your items interact well with - **`accessible-value-minimum`** (_in_ _float_): The minimum value of the item. - **`accessible-value-step`** (_in_ _float_) The smallest increment or decrement by which the current value can change. This corresponds to the step by which a handle on a slider can be dragged. - **`accessible-value`** (_in_ _string_): The current value of the item. +- **`accessible-placeholder-text`** (_in_ _string_): A placeholder text to use when the item's value is empty. Applies to text elements. You can also use the following callbacks that are going to be called by the accessibility framework: diff --git a/examples/todo-mvc/ui/views/create_task_view.slint b/examples/todo-mvc/ui/views/create_task_view.slint index 38e9e644a28..a45c3ead029 100644 --- a/examples/todo-mvc/ui/views/create_task_view.slint +++ b/examples/todo-mvc/ui/views/create_task_view.slint @@ -58,7 +58,7 @@ export component CreateTaskView { VerticalLayout { spacing: SpaceSettings.default-spacing; - Text { + title-label := Text { text: @tr("Task name"); color: TodoPalette.foreground; font-size: FontSettings.body-strong.font-size; @@ -69,6 +69,7 @@ export component CreateTaskView { title-input := LineEdit { placeholder-text: @tr("Describe your task"); + accessible-label: title-label.text; } } diff --git a/internal/backends/testing/search_api.rs b/internal/backends/testing/search_api.rs index 7c69cdc92ac..3ccc5dd9bd7 100644 --- a/internal/backends/testing/search_api.rs +++ b/internal/backends/testing/search_api.rs @@ -352,6 +352,16 @@ impl ElementHandle { .and_then(|item| item.accessible_string_property(AccessibleStringProperty::Value)) } + /// Returns the value of the element's `accessible-placeholder-text` property, if present. + pub fn accessible_placeholder_text(&self) -> Option { + if self.element_index != 0 { + return None; + } + self.item.upgrade().and_then(|item| { + item.accessible_string_property(AccessibleStringProperty::PlaceholderText) + }) + } + /// Sets the value of the element's `accessible-value` property. Note that you can only set this /// property if it is declared in your Slint code. pub fn set_accessible_value(&self, value: impl Into) { diff --git a/internal/backends/winit/accesskit.rs b/internal/backends/winit/accesskit.rs index 9013a2fea9a..4378c8cf4f4 100644 --- a/internal/backends/winit/accesskit.rs +++ b/internal/backends/winit/accesskit.rs @@ -437,7 +437,16 @@ impl NodeCollection { builder.set_numeric_value_step(step); } - if let Some(value) = item.accessible_string_property(AccessibleStringProperty::Value) { + let value = item.accessible_string_property(AccessibleStringProperty::Value); + if value.is_none() || value.as_ref().is_some_and(|x| x.is_empty()) { + if let Some(placeholder) = item + .accessible_string_property(AccessibleStringProperty::PlaceholderText) + .filter(|x| !x.is_empty()) + { + builder.set_placeholder(placeholder.to_string()); + } + } + if let Some(value) = value { if let Ok(value) = value.parse() { builder.set_numeric_value(value); } else { diff --git a/internal/compiler/typeregister.rs b/internal/compiler/typeregister.rs index 2d6bfa9b5a0..1e1b262274d 100644 --- a/internal/compiler/typeregister.rs +++ b/internal/compiler/typeregister.rs @@ -111,6 +111,7 @@ pub fn reserved_accessibility_properties() -> impl Iterator base.edited; accessible-role: text-input; accessible-value <=> text; - accessible-label: placeholder-text; + accessible-placeholder-text: placeholder-text; accessible-action-set-value(v) => { text = v; edited(v); } public function set-selection-offsets(start: int, end: int) { diff --git a/internal/compiler/widgets/cupertino-base/lineedit.slint b/internal/compiler/widgets/cupertino-base/lineedit.slint index 24934537758..51d7f73be43 100644 --- a/internal/compiler/widgets/cupertino-base/lineedit.slint +++ b/internal/compiler/widgets/cupertino-base/lineedit.slint @@ -19,7 +19,7 @@ export component LineEdit { callback edited <=> i-base.edited; accessible-role: text-input; accessible-value <=> text; - accessible-label: placeholder-text; + accessible-placeholder-text: placeholder-text; accessible-action-set-value(v) => { text = v; edited(v); } public function set-selection-offsets(start: int, end: int) { diff --git a/internal/compiler/widgets/fluent-base/lineedit.slint b/internal/compiler/widgets/fluent-base/lineedit.slint index aa318b4bf61..593a02c92d7 100644 --- a/internal/compiler/widgets/fluent-base/lineedit.slint +++ b/internal/compiler/widgets/fluent-base/lineedit.slint @@ -18,7 +18,7 @@ export component LineEdit { callback edited <=> i-base.edited; accessible-role: text-input; accessible-value <=> text; - accessible-label: placeholder-text; + accessible-placeholder-text: placeholder-text; accessible-action-set-value(v) => { text = v; edited(v); } public function set-selection-offsets(start: int, end: int) { diff --git a/internal/compiler/widgets/material-base/lineedit.slint b/internal/compiler/widgets/material-base/lineedit.slint index 63a7703b487..4f8f0f98251 100644 --- a/internal/compiler/widgets/material-base/lineedit.slint +++ b/internal/compiler/widgets/material-base/lineedit.slint @@ -19,7 +19,7 @@ export component LineEdit { callback edited <=> i-base.edited; accessible-role: text-input; accessible-value <=> text; - accessible-label: placeholder-text; + accessible-placeholder-text: placeholder-text; accessible-action-set-value(v) => { text = v; edited(v); } public function set-selection-offsets(start: int, end: int) { diff --git a/internal/core/accessibility.rs b/internal/core/accessibility.rs index 7dcf9d286a0..02fe876c7e7 100644 --- a/internal/core/accessibility.rs +++ b/internal/core/accessibility.rs @@ -20,6 +20,7 @@ pub enum AccessibleStringProperty { DelegateFocus, Description, Label, + PlaceholderText, Value, ValueMaximum, ValueMinimum,