90 lines
2.1 KiB
Rust
90 lines
2.1 KiB
Rust
use std::marker::PhantomData;
|
|
|
|
use crate::prelude::*;
|
|
|
|
pub struct Stack {
|
|
pub children: Vec<WidgetId>,
|
|
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<const LEN: usize, Wa: WidgetArrLike<LEN, Tag>, Tag> {
|
|
pub children: Wa,
|
|
pub size: StackSize,
|
|
pub offset: usize,
|
|
_pd: PhantomData<Tag>,
|
|
}
|
|
|
|
impl<const LEN: usize, Wa: WidgetArrLike<LEN, Tag>, Tag> FnOnce<(&mut Ui,)>
|
|
for StackBuilder<LEN, Wa, Tag>
|
|
{
|
|
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<const LEN: usize, Wa: WidgetArrLike<LEN, Tag>, Tag> StackBuilder<LEN, Wa, Tag> {
|
|
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
|
|
}
|
|
}
|