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

commitcaa553da3a5cf7b3f1efcfd98986640a03dccb78
parent6b860c794b
authorLucas Galante <[email protected]>
date2026-06-21 19:35
Use cce-ui Paginator widget instead of MenuBar vertical page switcher

 src/widget/container/paginator.rs | 84 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

diff --git a/src/widget/container/paginator.rs b/src/widget/container/paginator.rs
index 4e62eea..4c8b1b5 100644
--- a/src/widget/container/paginator.rs
+++ b/src/widget/container/paginator.rs
@@ -17,6 +17,7 @@ pub struct Paginator {
     pub pages: Vec<String>,
     parent: Option<*mut (dyn Element + 'static)>,
     pub on_page_changed_cb: Option<Box<dyn Fn(usize) + Send + Sync>>,
+    pub just_clicked: Option<usize>,
 }
 
 impl Paginator {
@@ -53,6 +54,7 @@ impl Paginator {
             pages,
             parent: None,
             on_page_changed_cb: None,
+            just_clicked: None,
         }
     }
 
@@ -72,6 +74,14 @@ impl Paginator {
         self
     }
 
+    pub fn with_title(self, _title: &str) -> Self {
+        self
+    }
+
+    pub fn with_vertical(self, _vertical: bool) -> Self {
+        self
+    }
+
     pub fn on_page_changed<F: Fn(usize) + Send + Sync + 'static>(mut self, cb: F) -> Self {
         self.on_page_changed_cb = Some(Box::new(cb));
         self
@@ -220,6 +230,7 @@ impl Element for Paginator {
             changed = true;
             if let Some(idx) = self.sidebar_menu.take_click() {
                 self.set_selected_page(idx);
+                self.just_clicked = Some(idx);
             }
         }
         for (i, plate) in self.plates.iter_mut().enumerate() {
@@ -314,6 +325,14 @@ impl Element for Paginator {
         Some(self)
     }
 
+    fn as_menu_controller(&self) -> Option<&dyn MenuController> {
+        Some(self)
+    }
+
+    fn as_menu_controller_mut(&mut self) -> Option<&mut dyn MenuController> {
+        Some(self)
+    }
+
     fn extra_quads(&self) -> Vec<(f32, f32, f32, f32, [f32; 4])> {
         let mut quads = Vec::new();
         quads.extend(self.sidebar_menu.extra_quads());
@@ -324,6 +343,71 @@ impl Element for Paginator {
         }
         quads
     }
+
+    fn mouse_wheel(&mut self, delta: &MouseScrollDelta, px: f32, py: f32, ctx: &mut UiContext) -> bool {
+        let mut changed = false;
+        if self.sidebar_menu.mouse_wheel(delta, px, py, ctx) {
+            changed = true;
+        }
+        for (i, plate) in self.plates.iter_mut().enumerate() {
+            if i == self.selected_page && !self.page_hidden {
+                if plate.mouse_wheel(delta, px, py, ctx) {
+                    changed = true;
+                }
+            }
+        }
+        changed
+    }
+
+    fn keyboard_input(&mut self, event: &KeyEvent, ctx: &mut UiContext) -> bool {
+        let mut changed = false;
+        if self.sidebar_menu.keyboard_input(event, ctx) {
+            changed = true;
+        }
+        for (i, plate) in self.plates.iter_mut().enumerate() {
+            if i == self.selected_page && !self.page_hidden {
+                if plate.keyboard_input(event, ctx) {
+                    changed = true;
+                }
+            }
+        }
+        changed
+    }
+
+    fn prepare_text(&mut self, fs: &mut glyphon::FontSystem) {
+        self.sidebar_menu.prepare_text(fs);
+        for (i, plate) in self.plates.iter_mut().enumerate() {
+            if i == self.selected_page && !self.page_hidden {
+                plate.prepare_text(fs);
+            }
+        }
+    }
+
+    fn highlight_quad(&self, ctx: &UiContext) -> Option<(f32, f32, f32, f32, [f32; 4])> {
+        self.sidebar_menu.highlight_quad(ctx)
+    }
+}
+
+impl MenuController for Paginator {
+    fn menu_click(&mut self) -> Option<(usize, usize)> {
+        self.just_clicked.take().map(|idx| (idx, 0))
+    }
+
+    fn trigger_menu_click(&mut self, _menu_idx: usize, _item_idx: usize) {}
+    fn set_item_checked(&mut self, _menu_idx: usize, _item_idx: usize, _checked: bool) {}
+    fn set_menu_items(&mut self, _menu_idx: usize, _items: &[String]) {}
+    fn is_menu_bar(&self) -> bool { false }
+    fn is_menu_open(&self) -> bool { false }
+    fn menu_items(&self) -> Vec<String> { Vec::new() }
+    fn menu_item_checked(&self) -> Vec<Option<bool>> { Vec::new() }
+    fn is_vertical(&self) -> bool { true }
+    fn menu_names(&self) -> Vec<String> { Vec::new() }
+    fn menu_items_list(&self) -> Vec<Vec<String>> { Vec::new() }
+    fn menu_checked_list(&self) -> Vec<Vec<Option<bool>>> { Vec::new() }
+    fn take_context_change(&mut self) -> Option<usize> { None }
+    fn set_context_selected(&mut self, _selected: usize) {}
+    fn set_center_items(&mut self, _center: bool) {}
+    fn get_menu_items_at(&self, _px: f32, _py: f32) -> Option<(usize, String, Vec<String>, f32, f32, f32, f32)> { None }
 }
 
 impl Drop for Paginator {