mirror of
https://github.com/danbulant/mangui
synced 2026-07-09 04:40:35 +00:00
working reactive blocks
This commit is contained in:
parent
206ecbe26f
commit
327a13147d
3 changed files with 65 additions and 11 deletions
|
|
@ -13,25 +13,25 @@ make_component!(
|
||||||
radius: f32
|
radius: f32
|
||||||
}
|
}
|
||||||
Variables {
|
Variables {
|
||||||
test: bool = false
|
test_: bool = false
|
||||||
}
|
}
|
||||||
Reactive {
|
Reactive {
|
||||||
dbg!($test);
|
dbg!($test_);
|
||||||
}
|
}
|
||||||
Component {
|
Component {
|
||||||
@layout {
|
@layout {
|
||||||
@Rectangle {
|
@Rectangle {
|
||||||
radius: if $test { attrs.radius } else { 0. },
|
radius: if $test_ { attrs.radius } else { 0. },
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
$|event| {
|
$|event| {
|
||||||
match event.event {
|
match event.event {
|
||||||
mangui::events::InnerEvent::MouseDown(_) => {
|
mangui::events::InnerEvent::MouseDown(_) => {
|
||||||
$test = true;
|
$test_ = true;
|
||||||
println!("Mouse down");
|
println!("Mouse down");
|
||||||
},
|
},
|
||||||
mangui::events::InnerEvent::MouseUp(_) => {
|
mangui::events::InnerEvent::MouseUp(_) => {
|
||||||
$test = false;
|
$test_ = false;
|
||||||
println!("Mouse up");
|
println!("Mouse up");
|
||||||
},
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
||||||
|
|
@ -470,7 +470,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
component_new_stream.extend(Some(TokenTree::Ident(Ident::new(&format!("{}Attributes", component_name), Span::call_site()))));
|
component_new_stream.extend(Some(TokenTree::Ident(Ident::new(&format!("{}Attributes", component_name), Span::call_site()))));
|
||||||
|
|
||||||
let (reactive_variables, subcomponent_stream) = replace_variables(component.contents.clone());
|
let (_reactive_variables, subcomponent_stream) = replace_variables(component.contents.clone());
|
||||||
let components_attributes_group = Group::new(proc_macro::Delimiter::Brace, subcomponent_stream);
|
let components_attributes_group = Group::new(proc_macro::Delimiter::Brace, subcomponent_stream);
|
||||||
|
|
||||||
component_new_stream.extend(Some(TokenTree::Group(components_attributes_group)));
|
component_new_stream.extend(Some(TokenTree::Group(components_attributes_group)));
|
||||||
|
|
@ -484,7 +484,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
new_returnvalue_stream.extend(wrap_in_arcmutex_cyclic(component_stream));
|
new_returnvalue_stream.extend(wrap_in_arcmutex_cyclic(component_stream));
|
||||||
},
|
},
|
||||||
ComponentType::Node => {
|
ComponentType::Node => {
|
||||||
let (reactive_variables, subcomponent_stream) = replace_variables(component.contents.clone());
|
let (_reactive_variables, subcomponent_stream) = replace_variables(component.contents.clone());
|
||||||
let node_group = Group::new(proc_macro::Delimiter::Brace, subcomponent_stream);
|
let node_group = Group::new(proc_macro::Delimiter::Brace, subcomponent_stream);
|
||||||
component_stream.extend(Some(TokenTree::Group(node_group)));
|
component_stream.extend(Some(TokenTree::Group(node_group)));
|
||||||
new_returnvalue_stream.extend(wrap_in_arcrwlock(component_stream));
|
new_returnvalue_stream.extend(wrap_in_arcrwlock(component_stream));
|
||||||
|
|
@ -535,7 +535,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
inner_callback_stream.extend(TokenStream::from(quote!(
|
inner_callback_stream.extend(TokenStream::from(quote!(
|
||||||
let selfref = selfref.upgrade().unwrap();
|
let selfref = selfref.upgrade().unwrap();
|
||||||
let this = selfref.lock().unwrap();
|
let mut this = selfref.lock().unwrap();
|
||||||
let attrs = &this.attrs;
|
let attrs = &this.attrs;
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
|
@ -549,6 +549,8 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
inner_callback_stream.extend(replace_variables(event_listener.callback.clone().stream()).1);
|
inner_callback_stream.extend(replace_variables(event_listener.callback.clone().stream()).1);
|
||||||
|
|
||||||
|
inner_callback_stream.extend(TokenStream::from(quote!(this.tick(None);)));
|
||||||
|
|
||||||
let callback_group = Group::new(proc_macro::Delimiter::Brace, inner_callback_stream);
|
let callback_group = Group::new(proc_macro::Delimiter::Brace, inner_callback_stream);
|
||||||
|
|
||||||
callback_stream.extend(Some(TokenTree::Group(callback_group)));
|
callback_stream.extend(Some(TokenTree::Group(callback_group)));
|
||||||
|
|
@ -756,8 +758,19 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
component_impl_stream.extend(TokenStream::from(quote!(fn update(&self, bitmap: &[u32]))));
|
component_impl_stream.extend(TokenStream::from(quote!(fn update(&self, bitmap: &[u32]))));
|
||||||
let mut update_stream = TokenStream::new();
|
let mut update_stream = TokenStream::new();
|
||||||
update_stream.extend(TokenStream::from(quote!(self.check_update(bitmap);)));
|
update_stream.extend(TokenStream::from(quote!(
|
||||||
|
self.check_update(bitmap);
|
||||||
|
let attrs = &self.attrs;
|
||||||
|
)));
|
||||||
|
|
||||||
|
for variable in &reactive_variables {
|
||||||
|
update_stream.extend(TokenStream::from(quote!(let)));
|
||||||
|
update_stream.extend(Some(TokenTree::Ident(variable.name.clone())));
|
||||||
|
update_stream.extend(TokenStream::from(quote!(=)));
|
||||||
|
update_stream.extend(TokenStream::from(quote!(&self.)));
|
||||||
|
update_stream.extend(Some(TokenTree::Ident(variable.name.clone())));
|
||||||
|
update_stream.extend(TokenStream::from(quote!(;)));
|
||||||
|
}
|
||||||
|
|
||||||
'block: for block in &reactive_blocks {
|
'block: for block in &reactive_blocks {
|
||||||
let mut keys: Vec<u32> = vec![0; all_variables.len() / 32 + 1];
|
let mut keys: Vec<u32> = vec![0; all_variables.len() / 32 + 1];
|
||||||
|
|
@ -800,8 +813,48 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
// fn tick
|
// fn tick
|
||||||
|
|
||||||
|
component_impl_stream.extend(TokenStream::from(quote!(fn tick(&mut self, inbitmap: Option<&[u32]>))));
|
||||||
|
|
||||||
|
let mut tick_stream = TokenStream::new();
|
||||||
|
|
||||||
|
tick_stream.extend(TokenStream::from(quote!(
|
||||||
|
let mut bitmap = [0; Self::UPDATE_LENGTH];
|
||||||
|
if let Some(inbitmap) = inbitmap {
|
||||||
|
bitmap.clone_from_slice(inbitmap);
|
||||||
|
}
|
||||||
|
self.check_update(&bitmap);
|
||||||
|
)));
|
||||||
|
|
||||||
|
let mut i = attributes.len() as u32;
|
||||||
|
for variable in &reactive_variables {
|
||||||
|
tick_stream.extend(TokenStream::from(quote!(if self.)));
|
||||||
|
tick_stream.extend(Some(TokenTree::Ident(variable.name.clone())));
|
||||||
|
tick_stream.extend(TokenStream::from(quote!(.lock().unwrap().invalidated())));
|
||||||
|
|
||||||
|
let mut if_stream = TokenStream::new();
|
||||||
|
|
||||||
|
let array_offset = i / 32;
|
||||||
|
let num_offset = i % 32;
|
||||||
|
|
||||||
|
if_stream.extend(TokenStream::from(quote!(bitmap)));
|
||||||
|
let mut ifgroup_stream = TokenStream::new();
|
||||||
|
ifgroup_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(array_offset))));
|
||||||
|
if_stream.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Bracket, ifgroup_stream))));
|
||||||
|
if_stream.extend(TokenStream::from(quote!(|= )));
|
||||||
|
if_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(1 << num_offset))));
|
||||||
|
|
||||||
|
tick_stream.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, if_stream))));
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tick_stream.extend(TokenStream::from(quote!(
|
||||||
|
if bitmap.into_iter().reduce(|a, b| a + b).unwrap() != 0 {
|
||||||
|
self.update(&bitmap);
|
||||||
|
}
|
||||||
|
)));
|
||||||
|
|
||||||
|
let tick_group = Group::new(proc_macro::Delimiter::Brace, tick_stream);
|
||||||
|
component_impl_stream.extend(Some(TokenTree::Group(tick_group)));
|
||||||
|
|
||||||
output.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, component_impl_stream))));
|
output.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, component_impl_stream))));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ impl Component for Rectangle {
|
||||||
let mut to_update = [0; Self::UPDATE_LENGTH];
|
let mut to_update = [0; Self::UPDATE_LENGTH];
|
||||||
if let Some(radius) = attrs.radius {
|
if let Some(radius) = attrs.radius {
|
||||||
self.attrs.radius = radius;
|
self.attrs.radius = radius;
|
||||||
|
dbg!("Radius set", radius);
|
||||||
to_update[0] |= 1;
|
to_update[0] |= 1;
|
||||||
}
|
}
|
||||||
if to_update.into_iter().reduce(|a,b| a+b).unwrap() != 0 {
|
if to_update.into_iter().reduce(|a,b| a+b).unwrap() != 0 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue