diff --git a/rusalka-macro/src/lib.rs b/rusalka-macro/src/lib.rs index b5407b9..09cb936 100644 --- a/rusalka-macro/src/lib.rs +++ b/rusalka-macro/src/lib.rs @@ -52,8 +52,6 @@ struct ReactiveBlock { #[proc_macro] /// If you have syntax errors because of attributes, wrap the default value in parentheses. pub fn make_component(item: TokenStream) -> TokenStream { - dbg!(&item); - let mut last_identifier = None; let mut item = item.into_iter(); let name = item.next().unwrap(); @@ -64,8 +62,6 @@ pub fn make_component(item: TokenStream) -> TokenStream { }; let str_name = name_ident.to_string(); - dbg!(&name_ident); - let mut attributes: Vec = Vec::new(); // let mut struct_values = Vec::new(); @@ -586,8 +582,7 @@ pub fn make_component(item: TokenStream) -> TokenStream { if attributes.len() > 0 { set_stream.extend(TokenStream::from(quote!(let mut to_update = [0; Self::UPDATE_LENGTH];))); - let mut i = 0; - for attribute in &attributes { + for (i, attribute) in attributes.iter().enumerate() { set_stream.extend(TokenStream::from(quote!(if let Some))); let mut some_inner = TokenStream::new(); @@ -608,16 +603,14 @@ pub fn make_component(item: TokenStream) -> TokenStream { let mut to_update_stream = TokenStream::new(); - to_update_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(i / 32)))); + to_update_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(i as u32 / 32)))); set_stream_inner.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Bracket, to_update_stream)))); set_stream_inner.extend(TokenStream::from(quote!(|= ))); - set_stream_inner.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(1 << i % 32)))); + set_stream_inner.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(1 << (i as u32 % 32))))); set_stream.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, set_stream_inner)))); - - i+=1; } set_stream.extend(TokenStream::from(quote!(if to_update.into_iter().reduce(|a,b| a+b).unwrap() != 0 { self.tick(Some(&to_update)); }))); @@ -683,7 +676,26 @@ pub fn make_component(item: TokenStream) -> TokenStream { let mut node_insert_stream = TokenStream::new(); - node_insert_stream.extend(TokenStream::from(quote!(parent,))); + match component.parent { + Some(parent) => { + let parent_ident = Ident::new(&format!("comp{}", parent), Span::call_site()); + + let mut node_insert_self_stream = TokenStream::new(); + + node_insert_self_stream.extend(TokenStream::from(quote!(self.))); + node_insert_self_stream.extend(Some(TokenTree::Ident(parent_ident))); + node_insert_self_stream.extend(TokenStream::from(quote!(.clone()))); + + let node_insert_self_group = Group::new(proc_macro::Delimiter::Brace, node_insert_self_stream); + node_insert_stream.extend(TokenStream::from(quote!(&))); + node_insert_stream.extend(Some(TokenTree::Group(node_insert_self_group))); + }, + None => { + node_insert_stream.extend(TokenStream::from(quote!(parent))); + } + } + + node_insert_stream.extend(TokenStream::from(quote!(,))); node_insert_stream.extend(TokenStream::from(quote!(&))); let mut node_insert_self_stream = TokenStream::new(); @@ -872,7 +884,7 @@ pub fn make_component(item: TokenStream) -> TokenStream { let component_set_some_stream = replace_variables(block.contents.clone()).1; - let mut component_set_group = Group::new(proc_macro::Delimiter::Parenthesis, component_set_some_stream); + let component_set_group = Group::new(proc_macro::Delimiter::Parenthesis, component_set_some_stream); component_set_stream.extend(Some(TokenTree::Group(component_set_group))); component_set_stream.extend(TokenStream::from(quote!(, ..Default::default()))); @@ -948,13 +960,6 @@ pub fn make_component(item: TokenStream) -> TokenStream { output.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, component_impl_stream)))); - - // dbg!(&output); - - dbg!(attributes); - - dbg!(reactive_variables); - println!("{}", output.to_string()); println!(); @@ -1079,8 +1084,6 @@ fn parse_components(name: Ident, group: Group, next: usize, parent: Option panic!("Expected group after ident") }; - let components = parse_components(ident, group, next + components_found.len() + 1, Some(next)); + let components = parse_components(ident, group, next + components_found.len(), Some(next)); components_found.extend(components); }, TokenTree::Punct(punct) if punct.as_char() == '$' => { diff --git a/ui/src/lib.rs b/ui/src/lib.rs index c3e20f9..0bbd836 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -304,16 +304,16 @@ pub fn run_event_loop(entry: MainEntry) -> () { _ => {} }, Event::NewEvents(_) => { - if let Some(monitor) = window.current_monitor() { - if let Some(refresh_rate) = monitor.refresh_rate_millihertz() { + // if let Some(monitor) = window.current_monitor() { + // if let Some(refresh_rate) = monitor.refresh_rate_millihertz() { // dbg!(refresh_rate); // some leeway before vsync - target.set_control_flow(ControlFlow::wait_duration(Duration::from_millis(1000 / refresh_rate as u64 - 100/refresh_rate as u64))); + // target.set_control_flow(ControlFlow::wait_duration(Duration::from_millis(1000 / refresh_rate as u64 - 100/refresh_rate as u64))); if let Ok(_) = entry.render.try_recv() { window.request_redraw(); } - } - } + // } + // } }, // In the future, window should be created after resuming from suspend (for android support) _ => {} diff --git a/ui/src/nodes/text.rs b/ui/src/nodes/text.rs index 83688d8..f60c890 100644 --- a/ui/src/nodes/text.rs +++ b/ui/src/nodes/text.rs @@ -60,7 +60,7 @@ impl Node for Text { context.canvas.draw_glyph_commands(cmds, &self.paint, 1.0); } - fn measure(&mut self, _context: &mut MeasureContext, known_dimensions: Size>, available_space: Size) -> Size { + fn measure(&mut self, context: &mut MeasureContext, known_dimensions: Size>, available_space: Size) -> Size { let width_constraint = known_dimensions.width.unwrap_or(match available_space.width { AvailableSpace::MinContent => 0.0, AvailableSpace::MaxContent => f32::INFINITY, @@ -69,16 +69,20 @@ impl Node for Text { // yes, this can crash if someone removes `buffer` during render from another thread. // though they're asking for it, so let them crash. let buf = self.buffer.as_mut().unwrap(); - buf.set_size(&mut FONT_SYSTEM.lock().unwrap(), width_constraint, f32::INFINITY); + let mut font = FONT_SYSTEM.lock().unwrap(); + buf.set_size(&mut font, width_constraint, f32::INFINITY); + buf.set_metrics(&mut font, self.metrics.scale(context.scale_factor)); // Compute layout - buf.shape_until_scroll(&mut FONT_SYSTEM.lock().unwrap(), false); + buf.shape_until_scroll(&mut font, false); + drop(font); // Determine measured size of text let (width, total_lines) = buf .layout_runs() .fold((0.0, 0usize), |(width, total_lines), run| (run.line_w.max(width), total_lines + 1)); - let height = total_lines as f32 * buf.metrics().line_height; + // fixes text not rendering in some cases (??????) + let height = total_lines as f32 * buf.metrics().line_height + 1.0; // fixes flickering of text on devices with non-integer scale factors due to loss of precision let width = width + 0.5;