Enhance Slider and VerticalSlider functionality

* Add optional default behavior
  * Add a `default` field
  * Add a `default()` method to set the `default` field
  * A double-click, ctrl-click or command-click will set the slider to the default value
* Add optional fine-grained control
  * Add an optional `step_fine` field
  * Add a `step_fine()` method to set the `step_fine` field
  * Use `step_fine` in place of `step` while shift is pressed
* Add increment/decrement via up/down keys
* Update `Slider` and `VerticalSlider` examples
This commit is contained in:
Jonatan Pettersson 2023-09-20 20:56:50 +02:00 committed by Héctor Ramón Jiménez
parent 66c8a804c6
commit 5e2b3d4a51
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
3 changed files with 324 additions and 40 deletions

View file

@ -12,13 +12,21 @@ pub enum Message {
pub struct Slider {
slider_value: u8,
slider_default: u8,
slider_step: u8,
slider_step_fine: u8,
}
impl Sandbox for Slider {
type Message = Message;
fn new() -> Slider {
Slider { slider_value: 50 }
Slider {
slider_value: 50,
slider_default: 50,
slider_step: 5,
slider_step_fine: 1,
}
}
fn title(&self) -> String {
@ -35,14 +43,25 @@ impl Sandbox for Slider {
fn view(&self) -> Element<Message> {
let value = self.slider_value;
let default = self.slider_default;
let step = self.slider_step;
let step_fine = self.slider_step_fine;
let h_slider =
container(slider(0..=100, value, Message::SliderChanged))
.width(250);
let h_slider = container(
slider(0..=100, value, Message::SliderChanged)
.default(default)
.step(step)
.step_fine(step_fine),
)
.width(250);
let v_slider =
container(vertical_slider(0..=100, value, Message::SliderChanged))
.height(200);
let v_slider = container(
vertical_slider(0..=100, value, Message::SliderChanged)
.default(default)
.step(step)
.step_fine(step_fine),
)
.height(200);
let text = text(format!("{value}"));