use std::process::exit;
use std::time::{Duration, Instant};
use buoyant::{
app::{App, Harness},
event::simulator::MouseTracker,
render_target::{EmbeddedGraphicsRenderTarget, RenderTarget as _},
view::prelude::*,
};
use embedded_graphics::{pixelcolor::Rgb888, prelude::*};
use embedded_graphics_simulator::{OutputSettings, SimulatorDisplay, Window};
#[derive(Clone, Default)]
struct State {
count: i32,
}
fn main() {
let size = Size::new(200, 100);
let mut display: SimulatorDisplay<Rgb888> = SimulatorDisplay::new(size.into());
let mut target = EmbeddedGraphicsRenderTarget::new(&mut display);
let mut window = Window::new("Example", &OutputSettings::default());
window.update(target.display());
let app_start = Instant::now();
let mut mouse_tracker = MouseTracker::new();
let mut app = App::new(State::default(), size.into(), counter_view);
loop {
app.set_time(app_start.elapsed());
window
.events()
.filter_map(|event| {
if event == embedded_graphics_simulator::SimulatorEvent::Quit {
exit(0);
}
mouse_tracker.process_event(event)
})
.for_each(|event| {
app.send(event);
});
if app.should_redraw() || target.clear_animation_status() {
app.render_animated(&mut target, &Rgb888::WHITE);
window.update(target.display());
target.clear(Rgb888::BLACK);
} else {
std::thread::sleep(Duration::from_millis(5));
}
}
}
fn counter_view(state: &State) -> impl View<Rgb888, State> + use<> {
let count = state.count;
Button::new(
|state: &mut State| state.count += 1,
move |_| {
Text::new_fmt::<48>(
format_args!("I've been tapped {count} times!"),
&embedded_graphics::mono_font::ascii::FONT_10X20,
)
.foreground_color(Rgb888::WHITE)
.padding(Edges::All, 10)
},
)
}