git.lucas.co / cce-fonts
font browser

commit51817d04535cc45a3428ba2d6bf39177c03b3131
parent8ad9987f8d
authorLucas Galante <[email protected]>
date2026-06-28 08:53
Replace font size Slider with Spinbox

 src/main.rs | 60 ++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 34 insertions(+), 26 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index e516c2f..c426883 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,7 +5,7 @@ use glyphon::{FontSystem, Buffer, Metrics, Attrs};
 use cce_ui::engine::{Application, EngineState, LogicalPosition, LogicalSize, WindowSettings};
 use cce_ui::widget::{
     MouseButton, ElementState, MouseScrollDelta, KeyEvent, TextItem, Element,
-    TextBox, Button, TextLabel, Key, NamedKey, ScrollingList, ScrollBox, Dropdown, Slider,
+    TextBox, Button, TextLabel, Key, NamedKey, ScrollingList, ScrollBox, Dropdown, Spinbox,
     Backplate, Plate
 };
 use cce_ui::widget::focus::link_parent_child;
@@ -39,7 +39,7 @@ struct TypefaceApp {
 
     // Preview panel
     style_dropdown: Dropdown,
-    size_slider: Slider,
+    size_spinbox: Spinbox,
     preview_box: TextBox,
 
     // Details panel
@@ -165,7 +165,7 @@ impl TypefaceApp {
             link_parent_child(&mut self.mid_panel, &mut self.btn_open_folder, ctx);
             link_parent_child(&mut self.mid_panel, &mut self.btn_remove_font, ctx);
             link_parent_child(&mut self.mid_panel, &mut self.style_dropdown, ctx);
-            link_parent_child(&mut self.mid_panel, &mut self.size_slider, ctx);
+            link_parent_child(&mut self.mid_panel, &mut self.size_spinbox, ctx);
             link_parent_child(&mut self.mid_panel, &mut self.preview_box, ctx);
         }
 
@@ -300,7 +300,7 @@ impl TypefaceApp {
             btn.prepare_text(font_system);
         }
         self.style_dropdown.prepare_text(font_system);
-        self.size_slider.prepare_text(font_system);
+        self.size_spinbox.prepare_text(font_system);
         self.preview_box.prepare_text(font_system);
         self.btn_open_folder.prepare_text(font_system);
         self.btn_remove_font.prepare_text(font_system);
@@ -363,7 +363,7 @@ impl TypefaceApp {
 
         // Alphabet preview
         if let Some(ref family) = self.selected_family {
-            let font_size = self.size_slider.get_scaled_value();
+            let font_size = self.size_spinbox.value as f32;
             let mut style_val = None;
             let mut weight_val = None;
             if let Some(ref style) = self.selected_style {
@@ -484,8 +484,7 @@ impl Application for TypefaceApp {
 
         let style_dropdown = Dropdown::new(Vec::new(), 0).with_label("Style:");
 
-        let mut size_slider = Slider::new().with_range(8.0, 120.0).with_readout(true).with_label("Size:");
-        size_slider.set_scaled_value(32.0);
+        let size_spinbox = Spinbox::new(32, 8, 120, 1).with_label("Size:");
 
         let mut preview_box = TextBox::new(String::from("The quick brown fox jumps over the lazy dog")).with_multiline(true).with_draw_bg_border(true).with_max_width(None);
         preview_box.font_size = 32.0;
@@ -502,7 +501,7 @@ impl Application for TypefaceApp {
             font_list,
             font_buttons: Vec::new(),
             style_dropdown,
-            size_slider,
+            size_spinbox,
             preview_box,
             btn_open_folder,
             btn_remove_font,
@@ -578,7 +577,10 @@ impl Application for TypefaceApp {
         }
 
         if let Some(sz) = preselected_size {
-            app.size_slider.set_scaled_value(sz);
+            app.size_spinbox.value = sz as i32;
+            if app.size_spinbox.editing {
+                app.size_spinbox.edit_buffer = app.size_spinbox.value.to_string();
+            }
             app.preview_box.font_size = sz;
         }
 
@@ -637,7 +639,7 @@ impl Application for TypefaceApp {
                 }
             }
             AppMessage::FontSizeChanged => {
-                self.preview_box.font_size = self.size_slider.get_scaled_value();
+                self.preview_box.font_size = self.size_spinbox.value as f32;
                 *needs_rebuild = true;
                 self.needs_rebuild = true;
             }
@@ -766,7 +768,7 @@ impl Application for TypefaceApp {
 
             // Preview panel widgets layout
             let style_dropdown_h = cce_ui::layout::dropdown_height() + cce_ui::widget::label_offset(&self.style_dropdown);
-            let size_slider_h = cce_ui::layout::slider_height() + cce_ui::widget::label_offset(&self.size_slider);
+            let size_spinbox_h = cce_ui::layout::spinbox_height() + cce_ui::widget::label_offset(&self.size_spinbox);
             let preview_box_h = if self.select_mode { 120.0 } else { 180.0 };
 
             let scroll_y = self.mid_scroll.scroll_y;
@@ -791,12 +793,12 @@ impl Application for TypefaceApp {
                 self.style_dropdown.set_rect(-9999.0, -9999.0, 0.0, 0.0);
             }
 
-            // Size slider (virtual_y = 120.0, h = size_slider_h)
-            let slider_draw_y = 10.0 + 120.0 - scroll_y;
-            if slider_draw_y + size_slider_h >= viewport_top && slider_draw_y <= viewport_bottom {
-                self.size_slider.set_rect(mid_panel_x + 10.0, slider_draw_y, mid_panel_w - 20.0, size_slider_h);
+            // Size spinbox (virtual_y = 120.0, h = size_spinbox_h)
+            let spinbox_draw_y = 10.0 + 120.0 - scroll_y;
+            if spinbox_draw_y + size_spinbox_h >= viewport_top && spinbox_draw_y <= viewport_bottom {
+                self.size_spinbox.set_rect(mid_panel_x + 10.0, spinbox_draw_y, mid_panel_w - 20.0, size_spinbox_h);
             } else {
-                self.size_slider.set_rect(-9999.0, -9999.0, 0.0, 0.0);
+                self.size_spinbox.set_rect(-9999.0, -9999.0, 0.0, 0.0);
             }
 
             // Preview box (virtual_y = 190.0, h = preview_box_h)
@@ -934,7 +936,7 @@ impl Application for TypefaceApp {
             }
         }
 
-        let new_size = self.size_slider.get_scaled_value();
+        let new_size = self.size_spinbox.value as f32;
         if (new_size - old_size).abs() > 0.001 {
             self.preview_box.font_size = new_size;
             changed = true;
@@ -989,7 +991,7 @@ impl Application for TypefaceApp {
             if btn.rect().0 > -9000.0 && btn.take_click() {
                 if self.select_mode && self.last_click_idx == Some(idx) && self.click_timer > 0.0 {
                     let selected = self.filtered[idx].clone();
-                    print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
+                    print!("{} {}", selected, self.size_spinbox.value);
                     std::process::exit(0);
                 }
                 self.last_click_idx = Some(idx);
@@ -1000,7 +1002,7 @@ impl Application for TypefaceApp {
         }
 
         let old_size = self.preview_box.font_size;
-        let new_size = self.size_slider.get_scaled_value();
+        let new_size = self.size_spinbox.value as f32;
         if (new_size - old_size).abs() > 0.001 {
             self.preview_box.font_size = new_size;
             msg_out = Some(AppMessage::FontSizeChanged);
@@ -1019,7 +1021,7 @@ impl Application for TypefaceApp {
             }
             if self.select_confirm_btn.take_click() {
                 let selected = self.selected_family.clone().unwrap_or_default();
-                print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
+                print!("{} {}", selected, self.size_spinbox.value);
                 std::process::exit(0);
             }
         }
@@ -1096,18 +1098,24 @@ impl Application for TypefaceApp {
                 }
                 Key::Character(ref ch) if ch == "+" || ch == "=" => {
                     if self.selected_family.is_some() {
-                        let (_, max) = self.size_slider.range();
-                        let new_sz = (self.size_slider.get_scaled_value() + 2.0).min(max);
-                        self.size_slider.set_scaled_value(new_sz);
+                        let (_, max) = self.size_spinbox.range();
+                        let old_val = self.size_spinbox.value;
+                        self.size_spinbox.value = (self.size_spinbox.value + 2).min(max);
+                        if self.size_spinbox.value != old_val && self.size_spinbox.editing {
+                            self.size_spinbox.edit_buffer = self.size_spinbox.value.to_string();
+                        }
                         msg_out = Some(AppMessage::FontSizeChanged);
                         handled = true;
                     }
                 }
                 Key::Character(ref ch) if ch == "-" => {
                     if self.selected_family.is_some() {
-                        let (min, _) = self.size_slider.range();
-                        let new_sz = (self.size_slider.get_scaled_value() - 2.0).max(min);
-                        self.size_slider.set_scaled_value(new_sz);
+                        let (min, _) = self.size_spinbox.range();
+                        let old_val = self.size_spinbox.value;
+                        self.size_spinbox.value = (self.size_spinbox.value - 2).max(min);
+                        if self.size_spinbox.value != old_val && self.size_spinbox.editing {
+                            self.size_spinbox.edit_buffer = self.size_spinbox.value.to_string();
+                        }
                         msg_out = Some(AppMessage::FontSizeChanged);
                         handled = true;
                     }