Slider: return drag_started,dragged,drag_released if value was dragged
Closes https://github.com/emilk/egui/issues/1269
This commit is contained in:
parent
8e62b382fd
commit
989a6d202f
1 changed files with 16 additions and 20 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue