Rust: add on_* to set signal handler

This commit is contained in:
Olivier Goffart 2020-08-03 13:26:43 +02:00
parent b2a1a72450
commit 8aef208340
3 changed files with 18 additions and 13 deletions

View file

@ -144,16 +144,14 @@ Hello := Rectangle {
fn main() { fn main() {
let app = Hello::new(); let app = Hello::new();
let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone()); let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone());
app.plus_clicked.set_handler(move |()| { app.as_ref().on_plus_clicked(move || {
let app = app_weak.upgrade().unwrap(); let app = app_weak.upgrade().unwrap();
let counter = Hello::field_offsets().counter.apply_pin(app.as_ref()); app.as_ref().set_counter(app.as_ref().get_counter() + 1);
counter.set(counter.get() + 1);
}); });
let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone()); let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone());
app.minus_clicked.set_handler(move |()| { app.as_ref().on_minus_clicked(move || {
let app = app_weak.upgrade().unwrap(); let app = app_weak.upgrade().unwrap();
let counter = Hello::field_offsets().counter.apply_pin(app.as_ref()); app.as_ref().set_counter(app.as_ref().get_counter() - 1);
counter.set(counter.get() - 1);
}); });
app.run(); app.run();
} }

View file

@ -5,16 +5,14 @@ sixtyfps::include_modules!();
fn main() { fn main() {
let app = Hello::new(); let app = Hello::new();
let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone()); let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone());
app.plus_clicked.set_handler(move |()| { app.as_ref().on_plus_clicked(move || {
let app = app_weak.upgrade().unwrap(); let app = app_weak.upgrade().unwrap();
let counter = Hello::field_offsets().counter.apply_pin(app.as_ref()); app.as_ref().set_counter(app.as_ref().get_counter() + 1);
counter.set(counter.get() + 1);
}); });
let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone()); let app_weak = sixtyfps::re_exports::PinWeak::downgrade(app.clone());
app.minus_clicked.set_handler(move |()| { app.as_ref().on_minus_clicked(move || {
let app = app_weak.upgrade().unwrap(); let app = app_weak.upgrade().unwrap();
let counter = Hello::field_offsets().counter.apply_pin(app.as_ref()); app.as_ref().set_counter(app.as_ref().get_counter() - 1);
counter.set(counter.get() - 1);
}); });
app.run(); app.run();
} }

View file

@ -52,7 +52,6 @@ pub fn generate(component: &Rc<Component>, diag: &mut BuildDiagnostics) -> Optio
declared_signals.push(prop_ident.clone()); declared_signals.push(prop_ident.clone());
if property_decl.expose_in_public_api { if property_decl.expose_in_public_api {
let emitter_ident = quote::format_ident!("emit_{}", prop_name); let emitter_ident = quote::format_ident!("emit_{}", prop_name);
property_and_signal_accessors.push( property_and_signal_accessors.push(
quote!( quote!(
#[allow(dead_code)] #[allow(dead_code)]
@ -62,6 +61,16 @@ pub fn generate(component: &Rc<Component>, diag: &mut BuildDiagnostics) -> Optio
) )
.into(), .into(),
); );
let on_ident = quote::format_ident!("on_{}", prop_name);
property_and_signal_accessors.push(
quote!(
#[allow(dead_code)]
fn #on_ident(self: ::core::pin::Pin<&Self>, f: impl Fn() + 'static) {
Self::field_offsets().#prop_ident.apply_pin(self).set_handler(move |()|f())
}
)
.into(),
);
} }
} else { } else {
declared_property_vars.push(prop_ident.clone()); declared_property_vars.push(prop_ident.clone());