Skip to main content

basic/
basic.rs

1use std::time::Duration;
2
3use flax::{child_of, name, Entity};
4use futures::StreamExt;
5use violet::{time::interval, App, Frame, StreamEffect, Widget};
6
7struct MainApp;
8
9struct Counter;
10impl Widget for Counter {
11    fn mount(self, frame: &mut Frame) -> Entity {
12        let id = Entity::builder().spawn(&mut frame.world);
13
14        frame.spawner.spawn(StreamEffect::new(
15            interval(Duration::from_millis(200)).enumerate(),
16            move |frame: &mut Frame, (i, _)| {
17                frame
18                    .world
19                    .set(id, name(), format!("Counter: {:#?}", i))
20                    .unwrap();
21            },
22        ));
23
24        id
25    }
26}
27
28impl Widget for MainApp {
29    fn mount(self, frame: &mut Frame) -> Entity {
30        frame.spawner.spawn(StreamEffect::new(
31            interval(Duration::from_secs(1)),
32            |frame: &mut Frame, deadline| tracing::info!(?deadline, "World: {:#?}", frame.world),
33        ));
34
35        let _counter = Counter.mount(frame);
36
37        Entity::builder()
38            .set(name(), "MainApp".into())
39            .spawn(&mut frame.world)
40    }
41}
42
43pub fn main() -> anyhow::Result<()> {
44    tracing_subscriber::fmt().init();
45
46    App::new().run(MainApp)
47}