git.lucas.co / cce-gallery
widget gallery and compositor test bench

commit4042daa944b197f84bdecfe21a432079a34729a8
parent3fa00f664c
authorLucas Galante <[email protected]>
date2026-07-04 19:50
Integrate Ramp control button and child window type into main test suite application

 src/main.rs | 128 ++++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 86 insertions(+), 42 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 84e37ab..c2d9108 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,7 @@
 use cce_ui::widget::{
     Button, Checkbox, ContentBg, Dropdown, Label, Paginator, Panel, ProgressBar, RangeSlider, Slider, Spinbox, StatusBar,
     TextLabel, Toggle, Element, Trackpad, hover_animation, TextBox, Plate, CornerRadii, Backplate, MenuBar, SectionContainer,
+    Ramp,
 };
 use cce_ui::engine::{Vertex, quad_vertices, push_rounded_rect_vertices_corners};
 
@@ -94,6 +95,7 @@ struct State {
     border_enabled: bool,
     border_width: f32,
     border_bevel: bool,
+    child_type: Option<String>,
     ui_context: cce_ui::context::UiContext,
 }
 
@@ -260,17 +262,27 @@ impl State {
             } else {
                 Box::new(ContentBg::new())
             };
-            let menu_bar = MenuBar::new(0.0, 0.0, lw, 40.0)
-                .with_item("File", &["New", "Open", "Save", "Exit"])
-                .with_item("Edit", &["Undo", "Redo", "Cut", "Copy", "Paste"]);
-
-            vec![
-                bg,                      // 0
-                Box::new(Label::new(&desc_label).with_font_size(12.0).with_color([0xcc, 0xcc, 0xd4])), // 1
-                Box::new(Button::new(0.0, 0.0, 100.0, 35.0).with_label("Close")), // 2
-                Box::new(menu_bar),      // 3
-                Box::new(StatusBar::new()), // 4
-            ]
+            if child_type.as_deref() == Some("Ramp") {
+                vec![
+                    bg,                      // 0
+                    Box::new(Ramp::new()), // 1
+                    Box::new(Button::new(0.0, 0.0, 100.0, 35.0).with_label("Close")), // 2
+                    Box::new(Label::new("").with_font_size(12.0)), // 3
+                    Box::new(Label::new("").with_font_size(12.0)), // 4
+                ]
+            } else {
+                let menu_bar = MenuBar::new(0.0, 0.0, lw, 40.0)
+                    .with_item("File", &["New", "Open", "Save", "Exit"])
+                    .with_item("Edit", &["Undo", "Redo", "Cut", "Copy", "Paste"]);
+
+                vec![
+                    bg,                      // 0
+                    Box::new(Label::new(&desc_label).with_font_size(12.0).with_color([0xcc, 0xcc, 0xd4])), // 1
+                    Box::new(Button::new(0.0, 0.0, 100.0, 35.0).with_label("Close")), // 2
+                    Box::new(menu_bar),      // 3
+                    Box::new(StatusBar::new()), // 4
+                ]
+            }
         } else {
             let menu_bar = MenuBar::new(0.0, 0.0, lw, 40.0)
                 .with_item("File", &["Exit"])
@@ -369,11 +381,12 @@ cascades in cce."
                 Box::new(Spinbox::new(1, 1, 10, 1).with_label("Border Width")), // 43 Spinbox: Border Width
                 Box::new(SectionContainer::new("Window Elements")), // 44 Section: Window Elements
                 Box::new(Dropdown::new(vec!["Controls".to_string(), "Windows".to_string(), "XDG".to_string()], 0).with_open_upward(true)), // 45 Dropdown: Page selector
+                Box::new(Button::new(0.0, 0.0, 120.0, 28.0).with_label("Ramp Control...")), // 46 Button: Ramp Control
             ]
         };
 
         let positions = if is_child {
-            child_positions(sw, sh, use_backplate, use_menubar, use_statusbar)
+            child_positions(sw, sh, use_backplate, use_menubar, use_statusbar, child_type.as_deref())
         } else {
             let sidebar_w = widgets[1].as_page_selector().unwrap().sidebar_w();
             demo_positions(sw, sh, sidebar_w)
@@ -423,6 +436,7 @@ cascades in cce."
             border_enabled,
             border_width,
             border_bevel,
+            child_type: child_type.clone(),
             ui_context: cce_ui::context::UiContext::new(),
         };
 
@@ -443,7 +457,7 @@ cascades in cce."
         }
         match index {
             0..=2 | 45 => true,
-            3..=13 | 30 | 31 | 36 | 37 => self.current_page == Page::Controls,
+            3..=13 | 30 | 31 | 36 | 37 | 46 => self.current_page == Page::Controls,
             14..=29 | 38..=44 => self.current_page == Page::Windows,
             32..=35 => self.current_page == Page::Xdg,
             _ => false,
@@ -820,7 +834,7 @@ cascades in cce."
             } else {
                 match index {
                     0..=2 | 45 => true,
-                    3..=13 | 30 | 31 | 36 | 37 => current_page == Page::Controls,
+                    3..=13 | 30 | 31 | 36 | 37 | 46 => current_page == Page::Controls,
                     14..=29 | 38..=44 => current_page == Page::Windows,
                     32..=35 => current_page == Page::Xdg,
                     _ => false,
@@ -985,7 +999,7 @@ cascades in cce."
             self.config.height = height;
             self.surface.configure(&self.device, &self.config);
             self.positions = if self.is_child {
-                child_positions(self.width, self.height, self.use_backplate, self.use_menubar, self.use_statusbar)
+                child_positions(self.width, self.height, self.use_backplate, self.use_menubar, self.use_statusbar, self.child_type.as_deref())
             } else {
                 let sidebar_w = self.widgets[1].as_page_selector().unwrap().sidebar_w();
                 demo_positions(self.width, self.height, sidebar_w)
@@ -1083,7 +1097,7 @@ cascades in cce."
             } else {
                 match index {
                     0..=2 | 45 => true,
-                    3..=13 | 30 | 31 | 36 | 37 => current_page == Page::Controls,
+                    3..=13 | 30 | 31 | 36 | 37 | 46 => current_page == Page::Controls,
                     14..=29 | 38..=44 => current_page == Page::Windows,
                     32..=35 => current_page == Page::Xdg,
                     _ => false,
@@ -1120,9 +1134,10 @@ fn demo_positions(sw: f32, sh: f32, sidebar_w: f32) -> Vec<(f32, f32, f32, f32)>
     let ctrl_verify_layout_pos = (base_x + 300.0, ctrl_y, 140.0, bh);
     ctrl_y += bh + 20.0;
     
-    // Row 2: diagnostics & reset
+    // Row 2: diagnostics & reset & ramp
     let ctrl_diagnostics_pos = (base_x, ctrl_y, 140.0, bh);
     let ctrl_reset_pos = (base_x + 150.0, ctrl_y, 140.0, bh);
+    let ctrl_ramp_pos = (base_x + 300.0, ctrl_y, 140.0, bh);
     ctrl_y += bh + 20.0;
     
     // Row 3: checkbox, toggle, progress_bar
@@ -1248,6 +1263,7 @@ fn demo_positions(sw: f32, sh: f32, sidebar_w: f32) -> Vec<(f32, f32, f32, f32)>
         border_width_pos,                     // 43 Spinbox: Border Width
         win_sec_pos,                          // 44 SectionContainer: Window Elements
         (sw - 140.0, sh - 25.0, 120.0, 22.0),         // 45 Dropdown: Page selector
+        ctrl_ramp_pos,                        // 46 Button: Ramp Control
     ]
 }
 
@@ -1257,34 +1273,49 @@ fn child_positions(
     _use_backplate: bool,
     use_menubar: bool,
     use_statusbar: bool,
+    child_type: Option<&str>,
 ) -> Vec<(f32, f32, f32, f32)> {
-    let bg_y = 0.0;
-    let bg_h = sh;
+    if child_type == Some("Ramp") {
+        let bg_y = 0.0;
+        let bg_h = sh;
+        let ramp_pos = (10.0, 10.0, sw - 20.0, sh - 60.0);
+        let close_pos = ((sw - 100.0) / 2.0, sh - 45.0, 100.0, 30.0);
+        vec![
+            (0.0, bg_y, sw, bg_h),              // 0 bg
+            ramp_pos,                           // 1 Ramp
+            close_pos,                          // 2 close button
+            (-1000.0, -1000.0, 0.0, 0.0),       // 3 dummy
+            (-1000.0, -1000.0, 0.0, 0.0),       // 4 dummy
+        ]
+    } else {
+        let bg_y = 0.0;
+        let bg_h = sh;
 
-    let status_h = if use_statusbar { 30.0 } else { 0.0 };
+        let status_h = if use_statusbar { 30.0 } else { 0.0 };
 
-    let menu_pos = if use_menubar {
-        (0.0, 0.0, sw, 40.0)
-    } else {
-        (-1000.0, -1000.0, 0.0, 0.0)
-    };
+        let menu_pos = if use_menubar {
+            (0.0, 0.0, sw, 40.0)
+        } else {
+            (-1000.0, -1000.0, 0.0, 0.0)
+        };
 
-    let status_pos = if use_statusbar {
-        (0.0, sh - 30.0, sw, 30.0)
-    } else {
-        (-1000.0, -1000.0, 0.0, 0.0)
-    };
+        let status_pos = if use_statusbar {
+            (0.0, sh - 30.0, sw, 30.0)
+        } else {
+            (-1000.0, -1000.0, 0.0, 0.0)
+        };
 
-    let label_pos = (20.0, 80.0, sw - 40.0, 40.0);
-    let close_pos = ((sw - 100.0) / 2.0, sh - status_h - 60.0, 100.0, 35.0);
+        let label_pos = (20.0, 80.0, sw - 40.0, 40.0);
+        let close_pos = ((sw - 100.0) / 2.0, sh - status_h - 60.0, 100.0, 35.0);
 
-    vec![
-        (0.0, bg_y, sw, bg_h),              // 0 bg
-        label_pos,                          // 1 label
-        close_pos,                          // 2 close button
-        menu_pos,                           // 3 MenuBar
-        status_pos,                         // 4 StatusBar
-    ]
+        vec![
+            (0.0, bg_y, sw, bg_h),              // 0 bg
+            label_pos,                          // 1 label
+            close_pos,                          // 2 close button
+            menu_pos,                           // 3 MenuBar
+            status_pos,                         // 4 StatusBar
+        ]
+    }
 }
 
 struct AppState {
@@ -1492,7 +1523,7 @@ impl PointerHandler for AppState {
                                 } else {
                                     match index {
                                         0..=2 | 45 => true,
-                                        3..=13 | 30 | 31 | 36 | 37 => current_page == Page::Controls,
+                                        3..=13 | 30 | 31 | 36 | 37 | 46 => current_page == Page::Controls,
                                         14..=29 | 38..=44 => current_page == Page::Windows,
                                         32..=35 => current_page == Page::Xdg,
                                         _ => false,
@@ -1538,7 +1569,7 @@ impl PointerHandler for AppState {
                             } else {
                                 match index {
                                     0..=2 | 45 => true,
-                                    3..=13 | 30 | 31 | 36 | 37 => current_page == Page::Controls,
+                                    3..=13 | 30 | 31 | 36 | 37 | 46 => current_page == Page::Controls,
                                     14..=29 | 38..=44 => current_page == Page::Windows,
                                     32..=35 => current_page == Page::Xdg,
                                     _ => false,
@@ -1620,7 +1651,7 @@ impl PointerHandler for AppState {
                             } else {
                                 match index {
                                     0..=2 | 45 => true,
-                                    3..=13 | 30 | 31 | 36 | 37 => current_page == Page::Controls,
+                                    3..=13 | 30 | 31 | 36 | 37 | 46 => current_page == Page::Controls,
                                     14..=29 | 38..=44 => current_page == Page::Windows,
                                     32..=35 => current_page == Page::Xdg,
                                     _ => false,
@@ -1684,6 +1715,19 @@ impl PointerHandler for AppState {
                                         run_all = true;
                                     } else if st.widgets[8].take_click() {
                                         do_reset = true;
+                                    } else if st.widgets[46].take_click() {
+                                        if let Ok(exe) = std::env::current_exe() {
+                                            let mut cmd = std::process::Command::new(exe);
+                                            cmd.arg("--child")
+                                               .arg("--type")
+                                               .arg("Ramp")
+                                               .arg("--width")
+                                               .arg("450")
+                                               .arg("--height")
+                                               .arg("200")
+                                               .arg("--backplate");
+                                            let _ = cmd.spawn();
+                                        }
                                     } else {
                                         for i in [9, 10, 11, 12, 13, 30, 31, 36, 37] {
                                             if st.widgets[i].take_click() {