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::to((!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 } }