1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#![windows_subsystem = "windows"]
use druid::kurbo::Circle;
use druid::piet::RadialGradient;
use druid::widget::prelude::*;
use druid::widget::{Flex, Padding};
use druid::{AppLauncher, Data, Insets, LocalizedString, Rect, WidgetExt, WindowDesc};
pub fn main() {
let window = WindowDesc::new(build_widget())
.title(LocalizedString::new("scroll-demo-window-title").with_placeholder("Scroll demo"));
AppLauncher::with_window(window)
.log_to_console()
.launch(0u32)
.expect("launch failed");
}
fn build_widget() -> impl Widget<u32> {
let mut col = Flex::column();
for i in 0..30 {
col.add_child(Padding::new(3.0, OverPainter(i)));
}
col.scroll()
}
struct OverPainter(u64);
const INSETS: Insets = Insets::uniform(50.);
impl<T: Data> Widget<T> for OverPainter {
fn event(&mut self, _: &mut EventCtx, _: &Event, _: &mut T, _: &Env) {}
fn lifecycle(&mut self, _: &mut LifeCycleCtx, _: &LifeCycle, _: &T, _: &Env) {}
fn update(&mut self, _: &mut UpdateCtx, _: &T, _: &T, _: &Env) {}
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, _: &T, _: &Env) -> Size {
ctx.set_paint_insets(INSETS);
bc.constrain(Size::new(100., 100.))
}
fn paint(&mut self, ctx: &mut PaintCtx, _: &T, env: &Env) {
let rect = Rect::ZERO.with_size(ctx.size());
let color = env.get_debug_color(self.0);
let radius = (rect + INSETS).size().height / 2.0;
let circle = Circle::new(rect.center(), radius);
let grad = RadialGradient::new(1.0, (color.clone(), color.clone().with_alpha(0.0)));
ctx.fill(circle, &grad);
ctx.stroke(rect, &color, 2.0);
}
}