#![windows_subsystem = "windows"]
use druid::widget::prelude::*;
use druid::widget::{Button, Controller, Flex, Label, WidgetId};
use druid::{AppLauncher, Data, Lens, Selector, WidgetExt, WindowDesc};
const INCREMENT: Selector = Selector::new("identity-example.increment");
#[derive(Clone, Data, Lens)]
struct OurData {
counter_one: u64,
counter_two: u64,
}
pub fn main() {
let window = WindowDesc::new(make_ui()).title("identity example");
let data = OurData {
counter_one: 0,
counter_two: 0,
};
AppLauncher::with_window(window)
.log_to_console()
.launch(data)
.expect("launch failed");
}
const ID_ONE: WidgetId = WidgetId::reserved(1);
fn make_ui() -> impl Widget<OurData> {
let id_two = WidgetId::next();
Flex::column()
.with_child(
Label::dynamic(|data, _| format!("One: {data}"))
.controller(LabelControler)
.with_id(ID_ONE)
.lens(OurData::counter_one)
.padding(2.0),
)
.with_child(
Label::dynamic(|data, _| format!("Two: {data}"))
.controller(LabelControler)
.with_id(id_two)
.lens(OurData::counter_two)
.padding(2.0),
)
.with_child(
Button::<OurData>::new("Increment one")
.on_click(|ctx, _data, _env| ctx.submit_command(INCREMENT.to(ID_ONE)))
.padding(2.0),
)
.with_child(
Button::<OurData>::new("Increment two")
.on_click(move |ctx, _data, _env| ctx.submit_command(INCREMENT.to(id_two)))
.padding(2.0),
)
.padding(10.0)
}
struct LabelControler;
impl Controller<u64, Label<u64>> for LabelControler {
fn event(
&mut self,
child: &mut Label<u64>,
ctx: &mut EventCtx,
event: &Event,
data: &mut u64,
env: &Env,
) {
match event {
Event::Command(cmd) if cmd.is(INCREMENT) => *data += 1,
_ => child.event(ctx, event, data, env),
}
}
}