mirror of
https://github.com/danbulant/mangui
synced 2026-06-20 14:51:11 +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]
|
||||
/// 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<Attribute> = 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<usize
|
|||
let mut group = group.stream().into_iter();
|
||||
let mut self_stream = TokenStream::new();
|
||||
|
||||
// dbg!(&name);
|
||||
|
||||
let name_starts_lowercase = name.to_string().chars().next().unwrap().is_lowercase();
|
||||
|
||||
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")
|
||||
};
|
||||
|
||||
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() == '$' => {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
_ => {}
|
||||
|
|
|
|||
|
|
@ -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<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 {
|
||||
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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue