Skip to content

Commit

Permalink
Use macro-generated definition of fn size_rules
Browse files Browse the repository at this point in the history
  • Loading branch information
dhardy committed Feb 17, 2025
1 parent c164129 commit e498f7d
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 1 deletion.
91 changes: 91 additions & 0 deletions crates/kas-macros/src/make_layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ impl Tree {
self.0.generate(core_path)
}

/// Yield an implementation of `fn size_rules`
pub fn size_rules(&self, core_path: &Toks) -> Toks {
self.0.size_rules(core_path)
}

/// Yield an implementation of `fn set_rect`
pub fn set_rect(&self, core_path: &Toks) -> Toks {
self.0.set_rect(core_path)
Expand Down Expand Up @@ -717,6 +722,92 @@ impl Layout {
})
}

/// Yield an implementation of `fn size_rules`
fn size_rules(&self, core_path: &Toks) -> Toks {
match self {
Layout::Align(layout, _) => layout.size_rules(core_path),
Layout::Pack(layout, pack) => {
let stor = &pack.stor;
let inner = layout.size_rules(core_path);
quote! {{
let rules = #inner;
#core_path.#stor.size.set_component(axis, rules.ideal_size());
rules
}}
}
Layout::Single(expr) => quote! {
::kas::Layout::size_rules(&mut #expr, sizer, axis)
},
Layout::Widget(stor, _) | Layout::Label(stor, _) => quote! {
::kas::Layout::size_rules(&mut #core_path.#stor, sizer, axis)
},
Layout::Frame(stor, layout, style, _) => {
let inner = layout.size_rules(core_path);
quote! {
let child_rules = {
let sizer = sizer.re();
let axis = #core_path.#stor.child_axis(axis);
#inner
};
#core_path.#stor.size_rules(sizer, axis, child_rules, #style)
}
}
Layout::List(stor, dir, LayoutList(list)) => {
let len = list.len();
let mut toks = quote! {
let dim = (#dir, #len);
let mut solver = ::kas::layout::RowSolver::new(axis, dim, &mut #core_path.#stor);
};
for (index, item) in list.iter().enumerate() {
let inner = item.layout.size_rules(core_path);
toks.append_all(quote!{{
::kas::layout::RulesSolver::for_child(&mut solver, &mut #core_path.#stor, #index, |axis| {
let sizer = sizer.re();
#inner
});
}});
}
toks.append_all(quote! {
::kas::layout::RulesSolver::finish(solver, &mut #core_path.#stor)
});
toks
}
Layout::Float(LayoutList(list)) => {
let mut toks = quote! {
let mut rules = SizeRules::EMPTY;
};
for item in list {
let inner = item.layout.size_rules(core_path);
toks.append_all(quote! {
rules = rules.max({ #inner });
});
}
toks.append_all(quote! { rules });
toks
}
Layout::Grid(stor, dim, LayoutList(list)) => {
let mut toks = quote! {
let dim = #dim;
let mut solver = ::kas::layout::GridSolver::<Vec<_>, Vec<_>, _>::new(axis, dim, &mut #core_path.#stor);
};
for item in list {
let inner = item.layout.size_rules(core_path);
let cell = &item.cell;
toks.append_all(quote!{{
::kas::layout::RulesSolver::for_child(&mut solver, &mut #core_path.#stor, #cell, |axis| {
let sizer = sizer.re();
#inner
});
}});
}
toks.append_all(quote! {
::kas::layout::RulesSolver::finish(solver, &mut #core_path.#stor)
});
toks
}
}
}

/// Yield an implementation of `fn set_rect`
fn set_rect(&self, core_path: &Toks) -> Toks {
match self {
Expand Down
3 changes: 2 additions & 1 deletion crates/kas-macros/src/widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ pub fn widget(attr_span: Span, mut args: WidgetArgs, scope: &mut Scope) -> Resul
let fn_try_probe;
let mut fn_draw = None;
if let Some(Layout { tree, .. }) = args.layout.take() {
let size_rules = tree.size_rules(&core_path);
let set_rect = tree.set_rect(&core_path);
let try_probe = tree.try_probe(&core_path);
let draw = tree.draw(&core_path);
Expand All @@ -406,7 +407,7 @@ pub fn widget(attr_span: Span, mut args: WidgetArgs, scope: &mut Scope) -> Resul
sizer: ::kas::theme::SizeCx,
axis: ::kas::layout::AxisInfo,
) -> ::kas::layout::SizeRules {
::kas::layout::LayoutVisitor::layout_visitor(self).size_rules(sizer, axis)
#size_rules
}

#[inline]
Expand Down

0 comments on commit e498f7d

Please sign in to comment.