use std::rc::Rc;
use std::time::Duration;
use lieui::app::ExternalData;
use lieui::prelude::*;
struct Tick;
struct Counter {
count: Signal<i32>,
volume: Signal<f32>,
agree: Signal<bool>,
}
impl Counter {
fn inc(&self) {
self.count.update(|v| *v += 1);
}
}
impl ViewModel for Counter {
fn view(self: &Rc<Self>, v: &mut ViewBuf) {
v.column(|c| {
c.center();
c.gap(12.0);
c.text("Counter(点按钮 / Tab 切焦点 / 每秒 +1)").font_size(16.0);
c.text(self.count.get().to_string())
.font_size(72.0)
.color(Color::RED);
c.row(|r| {
r.gap(12.0);
r.button("+1")
.tab_stop(true)
.on_tap(act(self, Self::inc));
});
c.text(format!("音量 {:.1}", self.volume.get())).font_size(14.0);
c.slider_bound(&self.volume, 0.0, 10.0);
c.checkbox_bound(&self.agree);
});
}
fn on_external(self: &Rc<Self>, _cx: &mut Ctx, data: ExternalData) {
if data.downcast::<Tick>().is_some() {
self.inc();
}
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rt = Runtime::new();
let mut app = App::new(rt.clone());
let vm = Rc::new(Counter {
count: Signal::new(&rt, 0),
volume: Signal::new(&rt, 3.0),
agree: Signal::new(&rt, false),
});
let id = app.window_erased(
WindowConfig::new()
.title("lieui v3 · counter(M4)")
.size(480.0, 320.0)
.min_size(320.0, 220.0),
lieui::app::erased(Rc::clone(&vm)),
);
app.run_with_handle(move |handle| {
std::thread::spawn(move || {
loop {
std::thread::sleep(Duration::from_secs(1));
if !handle.post_external(id, ExternalData::new(Tick)) {
break; }
}
});
})
}