violet 0.0.1

Retained mode GUI library
Documentation
use std::time::Duration;

use flax::{child_of, name, Entity};
use futures::StreamExt;
use violet::{time::interval, App, Frame, StreamEffect, Widget};

struct MainApp;

struct Counter;
impl Widget for Counter {
    fn mount(self, frame: &mut Frame) -> Entity {
        let id = Entity::builder().spawn(&mut frame.world);

        frame.spawner.spawn(StreamEffect::new(
            interval(Duration::from_millis(200)).enumerate(),
            move |frame: &mut Frame, (i, _)| {
                frame
                    .world
                    .set(id, name(), format!("Counter: {:#?}", i))
                    .unwrap();
            },
        ));

        id
    }
}

impl Widget for MainApp {
    fn mount(self, frame: &mut Frame) -> Entity {
        frame.spawner.spawn(StreamEffect::new(
            interval(Duration::from_secs(1)),
            |frame: &mut Frame, deadline| tracing::info!(?deadline, "World: {:#?}", frame.world),
        ));

        let _counter = Counter.mount(frame);

        Entity::builder()
            .set(name(), "MainApp".into())
            .spawn(&mut frame.world)
    }
}

pub fn main() -> anyhow::Result<()> {
    tracing_subscriber::fmt().init();

    App::new().run(MainApp)
}