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
use super::*;

pub struct Slider {
	pub pip_pos: f32,
}
impl Default for Slider {
	fn default() -> Self {
		Self { pip_pos: 1. }
	}
}
impl Slider {
	pub fn draw<'s>(&'s mut self, r: &mut RenderLock<'s>, t: &Theme, pos: Vec2, size: Vec2, pip_size: f32) -> f32 {
		let vert = size.y() > size.x();
		let o = move |v: Vec2| if vert { v.y() } else { v.x() };
		let set_pip = move |v: f32| ((v - o(pos)) / o(size)).clamp(0., 1.);

		let id = LUID(self);
		let Self { pip_pos } = self;

		let p = *pip_pos * (1. - pip_size);
		r.draw_with_logic(
			Rect { pos, size, color: t.fg },
			move |e, focused, mouse_pos| {
				match e {
					OfferFocus => return Accept,
					MouseButton { state, .. } if focused && state.released() => return DropFocus,
					MouseButton { state, .. } if state.pressed() => *pip_pos = set_pip(o(mouse_pos)),
					MouseMove { at, .. } if focused => *pip_pos = set_pip(o(*at)),
					Scroll { at, .. } => {
						*pip_pos = (*pip_pos + o(at.mul((-1, 1))) * pip_size).clamp(0., 1.);
						return Accept;
					}
					_ => (),
				}
				Reject
			},
			id,
		);

		r.draw(Rect {
			pos: pos.sum(Vec2((!vert, vert)).mul(size).mul(p)),
			size: size.mul((if !vert { pip_size } else { 1. }, if vert { pip_size } else { 1. })),
			color: t.highlight,
		});
		p
	}
}