mirror of
https://github.com/danbulant/mangui
synced 2026-07-07 20:00:35 +00:00
fix text size calculation
This commit is contained in:
parent
389b147bfb
commit
24481bed2a
3 changed files with 38 additions and 31 deletions
|
|
@ -52,8 +52,6 @@ struct ReactiveBlock {
|
||||||
#[proc_macro]
|
#[proc_macro]
|
||||||
/// If you have syntax errors because of attributes, wrap the default value in parentheses.
|
/// If you have syntax errors because of attributes, wrap the default value in parentheses.
|
||||||
pub fn make_component(item: TokenStream) -> TokenStream {
|
pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
dbg!(&item);
|
|
||||||
|
|
||||||
let mut last_identifier = None;
|
let mut last_identifier = None;
|
||||||
let mut item = item.into_iter();
|
let mut item = item.into_iter();
|
||||||
let name = item.next().unwrap();
|
let name = item.next().unwrap();
|
||||||
|
|
@ -64,8 +62,6 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
};
|
};
|
||||||
let str_name = name_ident.to_string();
|
let str_name = name_ident.to_string();
|
||||||
|
|
||||||
dbg!(&name_ident);
|
|
||||||
|
|
||||||
let mut attributes: Vec<Attribute> = Vec::new();
|
let mut attributes: Vec<Attribute> = Vec::new();
|
||||||
|
|
||||||
// let mut struct_values = Vec::new();
|
// let mut struct_values = Vec::new();
|
||||||
|
|
@ -586,8 +582,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
if attributes.len() > 0 {
|
if attributes.len() > 0 {
|
||||||
set_stream.extend(TokenStream::from(quote!(let mut to_update = [0; Self::UPDATE_LENGTH];)));
|
set_stream.extend(TokenStream::from(quote!(let mut to_update = [0; Self::UPDATE_LENGTH];)));
|
||||||
let mut i = 0;
|
for (i, attribute) in attributes.iter().enumerate() {
|
||||||
for attribute in &attributes {
|
|
||||||
set_stream.extend(TokenStream::from(quote!(if let Some)));
|
set_stream.extend(TokenStream::from(quote!(if let Some)));
|
||||||
|
|
||||||
let mut some_inner = TokenStream::new();
|
let mut some_inner = TokenStream::new();
|
||||||
|
|
@ -608,16 +603,14 @@ pub fn make_component(item: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
let mut to_update_stream = TokenStream::new();
|
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(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Bracket, to_update_stream))));
|
||||||
|
|
||||||
set_stream_inner.extend(TokenStream::from(quote!(|= )));
|
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))));
|
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)); })));
|
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();
|
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!(&)));
|
node_insert_stream.extend(TokenStream::from(quote!(&)));
|
||||||
|
|
||||||
let mut node_insert_self_stream = TokenStream::new();
|
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 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(Some(TokenTree::Group(component_set_group)));
|
||||||
|
|
||||||
component_set_stream.extend(TokenStream::from(quote!(, ..Default::default())));
|
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))));
|
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!("{}", output.to_string());
|
||||||
|
|
||||||
println!();
|
println!();
|
||||||
|
|
@ -1079,8 +1084,6 @@ fn parse_components(name: Ident, group: Group, next: usize, parent: Option<usize
|
||||||
let mut group = group.stream().into_iter();
|
let mut group = group.stream().into_iter();
|
||||||
let mut self_stream = TokenStream::new();
|
let mut self_stream = TokenStream::new();
|
||||||
|
|
||||||
// dbg!(&name);
|
|
||||||
|
|
||||||
let name_starts_lowercase = name.to_string().chars().next().unwrap().is_lowercase();
|
let name_starts_lowercase = name.to_string().chars().next().unwrap().is_lowercase();
|
||||||
|
|
||||||
let this_component = ComponentUsed {
|
let this_component = ComponentUsed {
|
||||||
|
|
@ -1114,7 +1117,7 @@ fn parse_components(name: Ident, group: Group, next: usize, parent: Option<usize
|
||||||
_ => panic!("Expected group after ident")
|
_ => 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);
|
components_found.extend(components);
|
||||||
},
|
},
|
||||||
TokenTree::Punct(punct) if punct.as_char() == '$' => {
|
TokenTree::Punct(punct) if punct.as_char() == '$' => {
|
||||||
|
|
|
||||||
|
|
@ -304,16 +304,16 @@ pub fn run_event_loop(entry: MainEntry) -> () {
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
Event::NewEvents(_) => {
|
Event::NewEvents(_) => {
|
||||||
if let Some(monitor) = window.current_monitor() {
|
// if let Some(monitor) = window.current_monitor() {
|
||||||
if let Some(refresh_rate) = monitor.refresh_rate_millihertz() {
|
// if let Some(refresh_rate) = monitor.refresh_rate_millihertz() {
|
||||||
// dbg!(refresh_rate);
|
// dbg!(refresh_rate);
|
||||||
// some leeway before vsync
|
// 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() {
|
if let Ok(_) = entry.render.try_recv() {
|
||||||
window.request_redraw();
|
window.request_redraw();
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
},
|
},
|
||||||
// In the future, window should be created after resuming from suspend (for android support)
|
// In the future, window should be created after resuming from suspend (for android support)
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ impl Node for Text {
|
||||||
context.canvas.draw_glyph_commands(cmds, &self.paint, 1.0);
|
context.canvas.draw_glyph_commands(cmds, &self.paint, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn measure(&mut self, _context: &mut MeasureContext, known_dimensions: Size<Option<f32>>, available_space: Size<AvailableSpace>) -> Size<f32> {
|
fn measure(&mut self, context: &mut MeasureContext, known_dimensions: Size<Option<f32>>, available_space: Size<AvailableSpace>) -> Size<f32> {
|
||||||
let width_constraint = known_dimensions.width.unwrap_or(match available_space.width {
|
let width_constraint = known_dimensions.width.unwrap_or(match available_space.width {
|
||||||
AvailableSpace::MinContent => 0.0,
|
AvailableSpace::MinContent => 0.0,
|
||||||
AvailableSpace::MaxContent => f32::INFINITY,
|
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.
|
// yes, this can crash if someone removes `buffer` during render from another thread.
|
||||||
// though they're asking for it, so let them crash.
|
// though they're asking for it, so let them crash.
|
||||||
let buf = self.buffer.as_mut().unwrap();
|
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
|
// 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
|
// Determine measured size of text
|
||||||
let (width, total_lines) = buf
|
let (width, total_lines) = buf
|
||||||
.layout_runs()
|
.layout_runs()
|
||||||
.fold((0.0, 0usize), |(width, total_lines), run| (run.line_w.max(width), total_lines + 1));
|
.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
|
// fixes flickering of text on devices with non-integer scale factors due to loss of precision
|
||||||
let width = width + 0.5;
|
let width = width + 0.5;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue