diff --git a/api/cpp/include/slint-testing.h b/api/cpp/include/slint-testing.h index d7ad4fd8f50..6696aab3fc5 100644 --- a/api/cpp/include/slint-testing.h +++ b/api/cpp/include/slint-testing.h @@ -60,6 +60,23 @@ class ElementHandle return result; } + /// Find all elements matching the given type name. + template + static SharedVector + find_by_element_type_name(const ComponentHandle &component, std::string_view type_name) + { + cbindgen_private::Slice element_type_name_view { + const_cast(reinterpret_cast(type_name.data())), + type_name.size() + }; + auto vrc = component.into_dyn(); + SharedVector result; + cbindgen_private::slint_testing_element_find_by_element_type_name( + &vrc, &element_type_name_view, + reinterpret_cast *>(&result)); + return result; + } + /// Returns true if the underlying element still exists; false otherwise. bool is_valid() const { return private_api::upgrade_item_weak(inner.item).has_value(); } diff --git a/internal/backends/testing/ffi.rs b/internal/backends/testing/ffi.rs index d85702e9ab6..8f4d1d6c1b9 100644 --- a/internal/backends/testing/ffi.rs +++ b/internal/backends/testing/ffi.rs @@ -34,6 +34,18 @@ pub extern "C" fn slint_testing_element_find_by_element_id( }) } +#[no_mangle] +pub extern "C" fn slint_testing_element_find_by_element_type_name( + root: &ItemTreeRc, + type_name: &Slice, + out: &mut SharedVector, +) { + let Ok(type_name) = core::str::from_utf8(type_name.as_slice()) else { return }; + *out = crate::search_api::search_item(root, |elem| { + elem.element_type_names_and_ids().unwrap().any(|(tid, _)| tid == type_name) + }) +} + #[no_mangle] pub extern "C" fn slint_testing_element_type_names_and_ids( element: &crate::search_api::ElementHandle,