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:
parent
74d18aedfb
commit
1fa0c0e977
2 changed files with 28 additions and 10 deletions
|
@ -7,6 +7,7 @@ use gtk::prelude::*;
|
|||
use gtk::Scale;
|
||||
use serde::Deserialize;
|
||||
use std::cell::Cell;
|
||||
use std::ops::Neg;
|
||||
use tokio::spawn;
|
||||
use tracing::error;
|
||||
|
||||
|
@ -21,6 +22,7 @@ pub struct SliderWidget {
|
|||
min: f64,
|
||||
#[serde(default = "default_max")]
|
||||
max: f64,
|
||||
step: Option<f64>,
|
||||
length: Option<i32>,
|
||||
}
|
||||
|
||||
|
@ -53,11 +55,26 @@ impl CustomWidget for SliderWidget {
|
|||
if let Some(on_change) = self.on_change {
|
||||
let min = self.min;
|
||||
let max = self.max;
|
||||
let step = self.step;
|
||||
let tx = context.tx.clone();
|
||||
|
||||
// GTK will spam the same value over and over
|
||||
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| {
|
||||
// GTK will send values outside min/max range
|
||||
let val = val.clamp(min, max);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue