Sliders now draw round-rect tracks

This commit is contained in:
Jonathan Johnson 2023-11-20 12:13:31 -08:00
parent bb66803653
commit 8f2ff1b5dc
No known key found for this signature in database
GPG key ID: A66D6A34D6620579

View file

@ -80,46 +80,51 @@ impl<T> Slider<T> {
self.rendered_size = spec.size.height; self.rendered_size = spec.size.height;
} }
let track_length = self.rendered_size - spec.knob_size; let track_length = self.rendered_size - spec.knob_size;
let value_location = (track_length) * spec.percent + spec.half_knob; let value_location = track_length * spec.percent;
let half_track = spec.track_size / 2; let half_track = spec.track_size / 2;
// Draw the track // Draw the track
if value_location > spec.half_knob { if value_location < track_length {
context.gfx.draw_shape(&Shape::filled_rect( context.gfx.draw_shape(&Shape::filled_round_rect(
Rect::new( Rect::new(
flipped( flipped(
!self.horizontal, !self.horizontal,
Point::new(spec.half_knob, spec.half_knob - half_track), Point::new(value_location + spec.half_knob, spec.half_knob - half_track),
),
flipped(
!self.horizontal,
Size::new(track_length - value_location + half_track, spec.track_size),
), ),
flipped(!self.horizontal, Size::new(value_location, spec.track_size)),
), ),
spec.track_color, half_track,
spec.inactive_track_color,
)); ));
} }
if value_location < track_length { if value_location > 0 {
context.gfx.draw_shape(&Shape::filled_rect( context.gfx.draw_shape(&Shape::filled_round_rect(
Rect::new( Rect::new(
flipped( flipped(
!self.horizontal, !self.horizontal,
Point::new(value_location, spec.half_knob - half_track), Point::new(spec.half_knob - half_track, spec.half_knob - half_track),
), ),
flipped( flipped(
!self.horizontal, !self.horizontal,
Size::new( Size::new(value_location + spec.track_size, spec.track_size),
track_length - value_location + spec.half_knob,
spec.track_size,
),
), ),
), ),
spec.inactive_track_color, half_track,
spec.track_color,
)); ));
} }
// Draw the knob // Draw the knob
context.gfx.draw_shape( context.gfx.draw_shape(
Shape::filled_circle(spec.half_knob, spec.knob_color, Origin::Center).translate_by( Shape::filled_circle(spec.half_knob, spec.knob_color, Origin::Center).translate_by(
flipped(!self.horizontal, Point::new(value_location, spec.half_knob)), flipped(
!self.horizontal,
Point::new(value_location + spec.half_knob, spec.half_knob),
),
), ),
); );
} }
@ -130,13 +135,15 @@ where
T: LinearInterpolate + Clone, T: LinearInterpolate + Clone,
{ {
fn update_from_click(&mut self, position: Point<Px>) { fn update_from_click(&mut self, position: Point<Px>) {
let knob_size = self.knob_size.into_signed();
let position = if self.horizontal { let position = if self.horizontal {
position.x position.x - knob_size / 2
} else { } else {
position.y position.y - knob_size / 2
}; };
let position = position.clamp(Px::ZERO, self.rendered_size); let track_width = self.rendered_size - knob_size;
let percent = position.into_float() / self.rendered_size.into_float(); let position = position.clamp(Px::ZERO, track_width);
let percent = position.into_float() / track_width.into_float();
let min = self.minimum.get(); let min = self.minimum.get();
let max = self.maximum.get(); let max = self.maximum.get();
self.value.update(min.lerp(&max, percent)); self.value.update(min.lerp(&max, percent));