Slider: return drag_started,dragged,drag_released if value was dragged

Closes https://github.com/emilk/egui/issues/1269
This commit is contained in:
Emil Ernerfeldt 2022-02-19 10:58:07 +01:00
parent 8e62b382fd
commit 989a6d202f

View file

@ -300,10 +300,10 @@ impl<'a> Slider<'a> {
impl<'a> Slider<'a> { impl<'a> Slider<'a> {
/// Just the slider, no text /// Just the slider, no text
fn allocate_slider_space(&self, ui: &mut Ui, perpendicular: f32) -> Response { fn allocate_slider_space(&self, ui: &mut Ui, thickness: f32) -> Response {
let desired_size = match self.orientation { let desired_size = match self.orientation {
SliderOrientation::Horizontal => vec2(ui.spacing().slider_width, perpendicular), SliderOrientation::Horizontal => vec2(ui.spacing().slider_width, thickness),
SliderOrientation::Vertical => vec2(perpendicular, ui.spacing().slider_width), SliderOrientation::Vertical => vec2(thickness, ui.spacing().slider_width),
}; };
ui.allocate_response(desired_size, Sense::click_and_drag()) ui.allocate_response(desired_size, Sense::click_and_drag())
} }
@ -453,15 +453,7 @@ impl<'a> Slider<'a> {
} }
} }
fn label_ui(&mut self, ui: &mut Ui) { fn value_ui(&mut self, ui: &mut Ui, position_range: RangeInclusive<f32>) -> Response {
if !self.text.is_empty() {
let text_color = self.text_color.unwrap_or_else(|| ui.visuals().text_color());
let text = RichText::new(&self.text).color(text_color);
ui.add(Label::new(text).wrap(false));
}
}
fn value_ui(&mut self, ui: &mut Ui, position_range: RangeInclusive<f32>) {
// If `DragValue` is controlled from the keyboard and `step` is defined, set speed to `step` // If `DragValue` is controlled from the keyboard and `step` is defined, set speed to `step`
let change = ui.input().num_presses(Key::ArrowUp) as i32 let change = ui.input().num_presses(Key::ArrowUp) as i32
+ ui.input().num_presses(Key::ArrowRight) as i32 + ui.input().num_presses(Key::ArrowRight) as i32
@ -472,7 +464,7 @@ impl<'a> Slider<'a> {
_ => self.current_gradient(&position_range), _ => self.current_gradient(&position_range),
}; };
let mut value = self.get_value(); let mut value = self.get_value();
ui.add( let response = ui.add(
DragValue::new(&mut value) DragValue::new(&mut value)
.speed(speed) .speed(speed)
.clamp_range(self.clamp_range()) .clamp_range(self.clamp_range())
@ -484,6 +476,7 @@ impl<'a> Slider<'a> {
if value != self.get_value() { if value != self.get_value() {
self.set_value(value); self.set_value(value);
} }
response
} }
/// delta(value) / delta(points) /// delta(value) / delta(points)
@ -499,21 +492,24 @@ impl<'a> Slider<'a> {
} }
fn add_contents(&mut self, ui: &mut Ui) -> Response { fn add_contents(&mut self, ui: &mut Ui) -> Response {
let perpendicular = ui let thickness = ui
.text_style_height(&TextStyle::Body) .text_style_height(&TextStyle::Body)
.at_least(ui.spacing().interact_size.y); .at_least(ui.spacing().interact_size.y);
let slider_response = self.allocate_slider_space(ui, perpendicular); let mut response = self.allocate_slider_space(ui, thickness);
self.slider_ui(ui, &slider_response); self.slider_ui(ui, &response);
if self.show_value { if self.show_value {
let position_range = self.position_range(&slider_response.rect); let position_range = self.position_range(&response.rect);
self.value_ui(ui, position_range); response |= self.value_ui(ui, position_range);
} }
if !self.text.is_empty() { if !self.text.is_empty() {
self.label_ui(ui); let text_color = self.text_color.unwrap_or_else(|| ui.visuals().text_color());
let text = RichText::new(&self.text).color(text_color);
ui.add(Label::new(text).wrap(false));
} }
slider_response
response
} }
} }