core-glyph 0.1.0

View tree, Signal<T>, flexbox layout, and flat quad output for the Glyph UI framework
Documentation
#![allow(clippy::type_complexity)]
use crate::component::Component;
use crate::signal::Signal;
use crate::theme::Theme;
use crate::view::View;

pub struct Router {
    pub stack: Signal<Vec<usize>>,
    pages: Vec<Box<dyn Fn(&Theme) -> View + Send>>,
}

impl Router {
    pub fn new(pages: Vec<Box<dyn Fn(&Theme) -> View + Send>>) -> Self {
        Self {
            stack: Signal::new(vec![0]),
            pages,
        }
    }

    pub fn push(&self, idx: usize) {
        let mut s = self.stack.get();
        s.push(idx);
        self.stack.set(s);
    }

    pub fn pop(&self) {
        let mut s = self.stack.get();
        if s.len() > 1 {
            s.pop();
        }
        self.stack.set(s);
    }

    pub fn replace(&self, idx: usize) {
        let mut s = self.stack.get();
        if let Some(last) = s.last_mut() {
            *last = idx;
        }
        self.stack.set(s);
    }

    pub fn current(&self) -> usize {
        *self.stack.get().last().unwrap_or(&0)
    }
}

impl Component for Router {
    fn render(&self, theme: &Theme) -> View {
        let idx = self.current();
        (self.pages[idx])(theme)
    }
}