use std::marker::PhantomData; use crate::prelude::*; pub struct Stack { pub children: Vec, pub size: StackSize, pub offset: usize, } impl Widget for Stack { fn draw(&mut self, painter: &mut Painter) { for _ in 0..self.offset { painter.next_layer(); } let mut iter = self.children.iter(); if let Some(child) = iter.next() { painter.child_layer(); painter.widget(child); } for child in iter { painter.next_layer(); painter.widget(child); } } fn desired_width(&mut self, ctx: &mut SizeCtx) -> Len { match self.size { StackSize::Default => Len::default(), StackSize::Child(i) => ctx.width(&self.children[i]), } } fn desired_height(&mut self, ctx: &mut SizeCtx) -> Len { match self.size { StackSize::Default => Len::default(), StackSize::Child(i) => ctx.height(&self.children[i]), } } } #[derive(Default, Debug)] pub enum StackSize { #[default] Default, Child(usize), } pub struct StackBuilder, Tag> { pub children: Wa, pub size: StackSize, pub offset: usize, _pd: PhantomData, } impl, Tag> FnOnce<(&mut Ui,)> for StackBuilder { type Output = Stack; extern "rust-call" fn call_once(self, args: (&mut Ui,)) -> Self::Output { Stack { children: self.children.ui(args.0).arr.to_vec(), offset: self.offset, size: self.size, } } } impl, Tag> StackBuilder { pub fn new(children: Wa) -> Self { Self { children, size: StackSize::default(), offset: 0, _pd: PhantomData, } } pub fn size(mut self, size: StackSize) -> Self { self.size = size; self } pub fn offset_layer(mut self, offset: usize) -> Self { self.offset = offset; self } }