use std::f64::consts::PI;
use druid::kurbo::Line;
use druid::{
AppLauncher, BoxConstraints, Color, Env, Event, EventCtx, LayoutCtx, PaintCtx, Point,
RenderContext, Size, UpdateCtx, Vec2, Widget, 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();
}
Event::AnimFrame(interval) => {
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: Option<&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, paint_ctx: &mut PaintCtx, _data: &u32, _env: &Env) {
let center = Point::new(50.0, 50.0);
let ambit = center + 45.0 * Vec2::from_angle((0.75 + self.t) * 2.0 * PI);
paint_ctx.stroke(Line::new(center, ambit), &Color::WHITE, 1.0);
}
}
fn main() {
let window = WindowDesc::new(|| AnimWidget { t: 0.0 });
AppLauncher::with_window(window)
.use_simple_logger()
.launch(0)
.expect("launch failed");
}