use std::f64::consts::PI;
use druid::kurbo::{Circle, Line};
use druid::widget::prelude::*;
use druid::{AppLauncher, Color, LocalizedString, Point, Vec2, WindowDesc};
struct AnimWidget {
t: f64,
}
impl Widget<u32> for AnimWidget {
fn event(&mut self, ctx: &mut EventCtx, event: &Event, _data: &mut u32, _env: &Env) {
match event {
Event::MouseDown(_) => {
self.t = 0.0;
ctx.request_anim_frame();
}
_ => (),
}
}
fn lifecycle(&mut self, ctx: &mut LifeCycleCtx, event: &LifeCycle, _data: &u32, _env: &Env) {
if let LifeCycle::AnimFrame(interval) = event {
self.t += (*interval as f64) * 1e-9;
if self.t < 1.0 {
ctx.request_anim_frame();
}
}
}
fn update(&mut self, _ctx: &mut UpdateCtx, _old_data: &u32, _data: &u32, _env: &Env) {}
fn layout(
&mut self,
_layout_ctx: &mut LayoutCtx,
bc: &BoxConstraints,
_data: &u32,
_env: &Env,
) -> Size {
bc.constrain((100.0, 100.0))
}
fn paint(&mut self, ctx: &mut PaintCtx, _data: &u32, _env: &Env) {
let t = self.t;
let center = Point::new(50.0, 50.0);
ctx.paint_with_z_index(1, move |ctx| {
let ambit = center + 45.0 * Vec2::from_angle((0.75 + t) * 2.0 * PI);
ctx.stroke(Line::new(center, ambit), &Color::WHITE, 1.0);
});
ctx.fill(Circle::new(center, 50.0), &Color::BLACK);
}
}
fn main() {
let window = WindowDesc::new(|| AnimWidget { t: 0.0 }).title(
LocalizedString::new("anim-demo-window-title")
.with_placeholder("You spin me right round..."),
);
AppLauncher::with_window(window)
.use_simple_logger()
.launch(0)
.expect("launch failed");
}