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}