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 b43cd390d5a6..631326a24f41 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 5428d965e1df..09225a5af14a 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 38e9e644a287..a45c3ead029a 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 7c69cdc92ace..3ccc5dd9bd74 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 9013a2fea9a3..4378c8cf4f47 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 2d6bfa9b5a03..1e1b262274dd 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 249345377584..51d7f73be438 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 aa318b4bf610..593a02c92d77 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 63a7703b4873..4f8f0f98251e 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 7dcf9d286a08..02fe876c7e78 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,