ansiq-widgets 0.1.0

Widget builders and shell-oriented UI primitives for Ansiq.
Documentation
use ansiq_core::{Element, ElementKind, Layout, Length, ShellProps, Style};

pub struct Shell<Message = ()> {
    element: Element<Message>,
}

impl<Message> Shell<Message> {
    pub fn new() -> Self {
        Self {
            element: Element::new(ElementKind::Shell(ShellProps)).with_layout(Layout {
                width: Length::Fill,
                height: Length::Fill,
            }),
        }
    }

    pub fn header(mut self, child: Element<Message>) -> Self {
        set_shell_slot(&mut self.element.children, 0, child);
        self
    }

    pub fn body(mut self, child: Element<Message>) -> Self {
        set_shell_slot(&mut self.element.children, 1, child);
        self
    }

    pub fn footer(mut self, child: Element<Message>) -> Self {
        set_shell_slot(&mut self.element.children, 2, child);
        self
    }

    pub fn style(mut self, style: Style) -> Self {
        self.element.style = style;
        self
    }

    pub fn layout(mut self, layout: Layout) -> Self {
        self.element.layout = layout;
        self
    }

    pub fn build(self) -> Element<Message> {
        self.element
    }
}

fn set_shell_slot<Message>(
    children: &mut Vec<Element<Message>>,
    index: usize,
    child: Element<Message>,
) {
    if children.len() <= index {
        children.resize_with(index + 1, || {
            Element::new(ElementKind::Text(ansiq_core::TextProps {
                content: String::new(),
            }))
            .with_layout(Layout {
                width: Length::Fill,
                height: Length::Auto,
            })
        });
    }

    children[index] = child;
}