git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commitbcbd078e03396cfed4e1c5df19b9eb22741ea98a
parent8c262c0633
authorLucas Galante <[email protected]>
date2026-06-27 17:25
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;
             }