1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-07-01 10:41:03 +02:00

feat(custom): support mouse wheel on slider

This commit is contained in:
Jake Stanger 2023-04-22 21:23:33 +01:00
parent 74d18aedfb
commit 1fa0c0e977
No known key found for this signature in database
GPG key ID: C51FC8F9CB0BEA61
2 changed files with 28 additions and 10 deletions

View file

@ -76,16 +76,17 @@ A draggable slider.
Note that `on_change` will provide the **floating point** value as an argument. Note that `on_change` will provide the **floating point** value as an argument.
If your input program requires an integer, you will need to round it. If your input program requires an integer, you will need to round it.
| Name | Type | Default | Description | | Name | Type | Default | Description |
|---------------|----------------------------------------------------|--------------|------------------------------------------------------------------------------| |---------------|----------------------------------------------------|--------------|---------------------------------------------------------------------------------------------------------------------------------|
| `src` | `image` | `null` | Image source. See [here](images) for information on images. | | `src` | `image` | `null` | Image source. See [here](images) for information on images. |
| `size` | `integer` | `null` | Width/height of the image. Aspect ratio is preserved. | | `size` | `integer` | `null` | Width/height of the image. Aspect ratio is preserved. |
| `orientation` | `horizontal` or `vertical` (shorthand: `h` or `v`) | `horizontal` | Orientation of the slider. | | `orientation` | `horizontal` or `vertical` (shorthand: `h` or `v`) | `horizontal` | Orientation of the slider. |
| `value` | `Script` | `null` | Script to run to get the slider value. Output must be a valid number. | | `value` | `Script` | `null` | Script to run to get the slider value. Output must be a valid number. |
| `on_change` | `string [command]` | `null` | Command to execute when the slider changes. More on this [below](#commands). | | `on_change` | `string [command]` | `null` | Command to execute when the slider changes. More on this [below](#commands). |
| `min` | `float` | `0` | Minimum slider value. | | `min` | `float` | `0` | Minimum slider value. |
| `max` | `float` | `100` | Maximum slider value. | | `max` | `float` | `100` | Maximum slider value. |
| `length` | `integer` | `null` | Slider length. GTK will automatically size if left unset. | | `step` | `float` | - | The increment to change when scrolling with the mouse wheel. If left blank, will use the default determined by the environment. |
| `length` | `integer` | `null` | Slider length. GTK will automatically size if left unset. |
The example slider widget below shows a volume control for MPC, The example slider widget below shows a volume control for MPC,
which updates the server when changed, and polls the server for volume changes to keep the slider in sync. which updates the server when changed, and polls the server for volume changes to keep the slider in sync.

View file

@ -7,6 +7,7 @@ use gtk::prelude::*;
use gtk::Scale; use gtk::Scale;
use serde::Deserialize; use serde::Deserialize;
use std::cell::Cell; use std::cell::Cell;
use std::ops::Neg;
use tokio::spawn; use tokio::spawn;
use tracing::error; use tracing::error;
@ -21,6 +22,7 @@ pub struct SliderWidget {
min: f64, min: f64,
#[serde(default = "default_max")] #[serde(default = "default_max")]
max: f64, max: f64,
step: Option<f64>,
length: Option<i32>, length: Option<i32>,
} }
@ -53,11 +55,26 @@ impl CustomWidget for SliderWidget {
if let Some(on_change) = self.on_change { if let Some(on_change) = self.on_change {
let min = self.min; let min = self.min;
let max = self.max; let max = self.max;
let step = self.step;
let tx = context.tx.clone(); let tx = context.tx.clone();
// GTK will spam the same value over and over // GTK will spam the same value over and over
let prev_value = Cell::new(scale.value()); let prev_value = Cell::new(scale.value());
scale.connect_scroll_event(move |scale, event| {
let value = scale.value();
let delta = event.delta().1.neg();
let delta = match (step, delta.is_sign_positive()) {
(Some(step), true) => step,
(Some(step), false) => -step,
(None, _) => delta,
};
scale.set_value(value + delta);
Inhibit(false)
});
scale.connect_change_value(move |scale, _, val| { scale.connect_change_value(move |scale, _, val| {
// GTK will send values outside min/max range // GTK will send values outside min/max range
let val = val.clamp(min, max); let val = val.clamp(min, max);