GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git
Fix Spinbox and Slider change propagation by setting just_changed = true
src/widget/input/slider.rs | 5 +++++
src/widget/input/spinbox.rs | 16 ++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/src/widget/input/slider.rs b/src/widget/input/slider.rs
index 647401e..c5a5fcc 100644
--- a/src/widget/input/slider.rs
+++ b/src/widget/input/slider.rs
@@ -174,6 +174,7 @@ impl Element for Slider {
let new_val = raw.clamp(0.0, 1.0);
if (new_val - self.value).abs() > 0.001 {
self.value = new_val;
+ self.just_changed = true;
if self.editing {
let scaled_val = self.min + self.value * (self.max - self.min);
self.edit_buffer = format!("{:.2}", scaled_val);
@@ -309,6 +310,7 @@ impl Element for Slider {
fn unfocus(&mut self) {
if self.editing {
self.editing = false;
+ let old_val = self.value;
if let Ok(new_val) = self.edit_buffer.parse::<f32>() {
let range = self.max - self.min;
if range != 0.0 {
@@ -317,6 +319,9 @@ impl Element for Slider {
self.value = 0.0;
}
}
+ if (self.value - old_val).abs() > 0.0001 {
+ self.just_changed = true;
+ }
}
}
diff --git a/src/widget/input/spinbox.rs b/src/widget/input/spinbox.rs
index 3d79fc5..3a4751c 100644
--- a/src/widget/input/spinbox.rs
+++ b/src/widget/input/spinbox.rs
@@ -167,10 +167,18 @@ impl Element for Spinbox {
let split_left = self.base.x + btn_w;
let split_right = self.base.x + self.base.w * 0.775;
if px < split_left {
+ let old_val = self.value;
self.value = (self.value - self.step).max(self.min);
+ if self.value != old_val {
+ self.just_changed = true;
+ }
true
} else if px >= split_right {
+ let old_val = self.value;
self.value = (self.value + self.step).min(self.max);
+ if self.value != old_val {
+ self.just_changed = true;
+ }
true
} else {
self.editing = true;
@@ -210,6 +218,7 @@ impl Element for Spinbox {
fn unfocus(&mut self) {
if self.editing {
self.editing = false;
+ let old_val = self.value;
if self.decimals > 0 {
if let Ok(val_f) = self.edit_buffer.parse::<f32>() {
let divisor = 10.0f32.powi(self.decimals as i32);
@@ -221,6 +230,9 @@ impl Element for Spinbox {
self.value = val.clamp(self.min, self.max);
}
}
+ if self.value != old_val {
+ self.just_changed = true;
+ }
}
}
@@ -250,6 +262,7 @@ impl Element for Spinbox {
handled = state.move_cursor_right(false);
}
Key::Named(NamedKey::Enter) => {
+ let old_val = self.value;
if self.decimals > 0 {
if let Ok(val_f) = state.buffer.parse::<f32>() {
let divisor = 10.0f32.powi(self.decimals as i32);
@@ -261,6 +274,9 @@ impl Element for Spinbox {
self.value = val.clamp(self.min, self.max);
}
}
+ if self.value != old_val {
+ self.just_changed = true;
+ }
self.editing = false;
handled = true;
}