Add window_adapter to ComponentVTable

Make it duplicate as `maybe_window_adapter` with a boolean `do_create`
parameter.
This commit is contained in:
Tobias Hunger 2023-07-06 20:14:42 +02:00 committed by Olivier Goffart
parent de96455dda
commit a362b7a1ae
7 changed files with 148 additions and 58 deletions

View file

@ -1292,6 +1292,21 @@ fn generate_item_tree(
}),
));
target_struct.members.push((
Access::Private,
Declaration::Function(Function {
name: "window_adapter".into(),
signature:
"([[maybe_unused]] slint::private_api::ComponentRef component, [[maybe_unused]] bool do_create, [[maybe_unused]] slint::cbindgen_private::Option<slint::private_api::WindowAdapterRc>* result) -> void"
.into(),
is_static: true,
statements: Some(vec![format!(
"/* TODO: implement this! */",
)]),
..Default::default()
}),
));
target_struct.members.push((
Access::Public,
Declaration::Var(Var {
@ -1307,7 +1322,7 @@ fn generate_item_tree(
init: Some(format!(
"{{ visit_children, get_item_ref, get_subtree_range, get_subtree_component, \
get_item_tree, parent_node, embed_component, subtree_index, layout_info, \
accessible_role, accessible_string_property, \
accessible_role, accessible_string_property, window_adapter, \
slint::private_api::drop_in_place<{}>, slint::private_api::dealloc }}",
item_tree_class_name
)),

View file

@ -1256,16 +1256,16 @@ fn generate_item_tree(
(
quote!(
#[allow(unused)]
fn window_adapter(&self) -> Rc<dyn sp::WindowAdapter> {
self.root.get().unwrap().upgrade().unwrap().window_adapter()
fn window_adapter_impl(&self) -> Rc<dyn sp::WindowAdapter> {
self.root.get().unwrap().upgrade().unwrap().window_adapter_impl()
}
#[allow(unused)]
fn maybe_window_adapter(&self) -> Option<Rc<dyn sp::WindowAdapter>> {
fn maybe_window_adapter_impl(&self) -> Option<Rc<dyn sp::WindowAdapter>> {
self.root
.get()
.and_then(|root_weak| root_weak.upgrade())
.and_then(|root| root.maybe_window_adapter())
.and_then(|root| root.maybe_window_adapter_impl())
}
),
quote!(vtable::VRc<sp::ComponentVTable, Self>),
@ -1283,7 +1283,7 @@ fn generate_item_tree(
(
quote!(
#[allow(unused)]
fn window_adapter(&self) -> Rc<dyn sp::WindowAdapter> {
fn window_adapter_impl(&self) -> Rc<dyn sp::WindowAdapter> {
Rc::clone(self.window_adapter_ref().unwrap())
}
@ -1300,7 +1300,7 @@ fn generate_item_tree(
}
#[allow(unused)]
fn maybe_window_adapter(&self) -> Option<Rc<dyn sp::WindowAdapter>> {
fn maybe_window_adapter_impl(&self) -> Option<Rc<dyn sp::WindowAdapter>> {
self.window_adapter_.get().cloned()
}
),
@ -1392,7 +1392,7 @@ fn generate_item_tree(
#(_self.parent = parent.clone() as #parent_component_type;)*
let self_rc = VRc::new(_self);
let self_dyn_rc = vtable::VRc::into_dyn(self_rc.clone());
sp::register_component(&self_dyn_rc, (*#root_token).maybe_window_adapter());
sp::register_component(&self_dyn_rc, (*#root_token).maybe_window_adapter_impl());
Self::init(sp::VRc::map(self_rc.clone(), |x| x), #root_token, 0, 1);
#new_end
}
@ -1418,7 +1418,7 @@ fn generate_item_tree(
use slint::private_unstable_api::re_exports::*;
ComponentVTable_static!(static VT for self::#inner_component_id);
new_vref!(let vref : VRef<ComponentVTable> for Component = self.as_ref().get_ref());
if let Some(wa) = self.maybe_window_adapter() {
if let Some(wa) = self.maybe_window_adapter_impl() {
sp::unregister_component(self.as_ref(), vref, Self::item_array(), &wa);
}
}
@ -1493,6 +1493,18 @@ fn generate_item_tree(
) {
*result = self.accessible_string_property(index, what);
}
fn window_adapter(
self: ::core::pin::Pin<&Self>,
do_create: bool,
result: &mut Option<Rc<dyn WindowAdapter>>,
) {
if do_create {
*result = Some(self.window_adapter_impl());
} else {
*result = self.maybe_window_adapter_impl();
}
}
}
@ -1798,7 +1810,7 @@ fn follow_sub_component_path<'a>(
fn access_window_adapter_field(ctx: &EvaluationContext) -> TokenStream {
let root = &ctx.generator_state;
quote!((&#root.window_adapter()))
quote!((&#root.window_adapter_impl()))
}
/// Given a property reference to a native item (eg, the property name is empty)