#[allow(unused)] use crate::adapt::AdaptWidget;
use kas::prelude::*;
use kas::theme::MarginStyle;
#[impl_self]
mod Reserve {
#[autoimpl(Deref, DerefMut using self.inner)]
#[autoimpl(Viewport using self.inner where W: trait)]
#[derive_widget]
pub struct Reserve<W: Widget> {
#[widget]
pub inner: W,
reserve: Box<dyn Fn(&mut SizeCx, AxisInfo) -> SizeRules + 'static>,
}
impl Self {
#[inline]
pub fn new(
inner: W,
reserve: impl Fn(&mut SizeCx, AxisInfo) -> SizeRules + 'static,
) -> Self {
let reserve = Box::new(reserve);
Reserve { inner, reserve }
}
}
impl Layout for Self {
fn size_rules(&mut self, cx: &mut SizeCx, axis: AxisInfo) -> SizeRules {
let inner_rules = self.inner.size_rules(cx, axis);
let reserve_rules = (self.reserve)(cx, axis);
inner_rules.max(reserve_rules)
}
}
}
#[impl_self]
mod WithMarginStyle {
#[autoimpl(Deref, DerefMut using self.inner)]
#[autoimpl(Viewport using self.inner where W: trait)]
#[derive_widget]
pub struct WithMarginStyle<W: Widget> {
#[widget]
pub inner: W,
style: MarginStyle,
}
impl Self {
#[inline]
pub fn new(inner: W, style: MarginStyle) -> Self {
WithMarginStyle { inner, style }
}
}
impl Layout for Self {
fn size_rules(&mut self, cx: &mut SizeCx, axis: AxisInfo) -> SizeRules {
let child_rules = self.inner.size_rules(cx, axis);
let margins = cx.margins(self.style).extract(axis);
child_rules.with_margins(margins)
}
}
}