git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commit21d2d792b36e00ed34d6235ffcbca190c84c21e3
parent7c7f36fcbd
authorLucas Galante <[email protected]>
date2026-07-05 19:25
Replace settings sidebar with statusbar page dropdown

 src/input_handler.rs | 65 +++++++++++++---------------------------------------
 src/main.rs          | 13 ++++++-----
 src/renderer.rs      | 14 +++++++----
 3 files changed, 32 insertions(+), 60 deletions(-)

diff --git a/src/input_handler.rs b/src/input_handler.rs
index 778d2f4..1893279 100644
--- a/src/input_handler.rs
+++ b/src/input_handler.rs
@@ -33,7 +33,7 @@ impl SystemInterface {
         let ly = self.cursor_y / s + self.scroll_y;
         cce_ui::widget::hover_animation::set_cursor_pos(lx, ly_no_scroll);
         let mut changed = false;
-        if self.menubar.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+        if self.page_dropdown.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
             changed = true;
         }
         if self.switcher.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
@@ -115,49 +115,23 @@ impl SystemInterface {
         }
 
         let mut handled = false;
-        if state == cce_ui::widget::ElementState::Pressed {
-            if lx_no_scroll < self.sidebar_width {
-                if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
-                    use cce_ui::widget::MenuController;
-                    if let Some((idx, _)) = self.menubar.menu_click() {
-                        if idx < Page::ALL.len() {
-                            cce_ui::widget::focus::clear_focus();
-                            let new_page = Page::ALL[idx];
-                            self.app.current_page = new_page;
-                            self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
-                            self.scroll_y = 0.0;
-                            self.update_status_text();
-                        }
-                    }
-                    self.needs_rebuild = true;
-                    handled = true;
+        if self.page_dropdown.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+            if self.page_dropdown.take_change() {
+                let idx = self.page_dropdown.selected;
+                if idx < Page::ALL.len() {
+                    cce_ui::widget::focus::clear_focus();
+                    let new_page = Page::ALL[idx];
+                    self.app.current_page = new_page;
+                    self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
+                    self.scroll_y = 0.0;
+                    self.update_status_text();
                 }
-            } else {
-                if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
-                    self.needs_rebuild = true;
-                    handled = true;
-                }
-            }
-        } else {
-            if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
-                use cce_ui::widget::MenuController;
-                if let Some((idx, _)) = self.menubar.menu_click() {
-                    if idx < Page::ALL.len() {
-                        cce_ui::widget::focus::clear_focus();
-                        let new_page = Page::ALL[idx];
-                        self.app.current_page = new_page;
-                        self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
-                        self.scroll_y = 0.0;
-                        self.update_status_text();
-                    }
-                }
-                self.needs_rebuild = true;
-                handled = true;
-            }
-            if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
-                self.needs_rebuild = true;
-                handled = true;
             }
+            self.needs_rebuild = true;
+            handled = true;
+        } else if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+            self.needs_rebuild = true;
+            handled = true;
         }
         if handled {
             return true;
@@ -297,13 +271,6 @@ impl SystemInterface {
                 self.last_scroll_y = self.scroll_y;
                 return true;
             }
-        } else {
-            let lx = px / s;
-            let ly = py / s;
-            if self.menubar.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
-                self.needs_rebuild = true;
-                return true;
-            }
         }
         false
     }
diff --git a/src/main.rs b/src/main.rs
index e6e36be..b30cf80 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,4 @@
-use cce_ui::widget::{hover_animation, Element, PageSelector};
+use cce_ui::widget::{hover_animation, Element};
 use glyphon::{Attrs, Buffer, FontSystem, Metrics};
 
 use cce_settings::app::{AppAction, AppState};
@@ -193,7 +193,7 @@ struct SystemInterface {
     last_scroll_y: f32,
     page_sec_containers: Vec<cce_ui::widget::SectionContainer>,
     root_window: cce_ui::widget::Backplate,
-    menubar: cce_ui::widget::Paginator,
+    page_dropdown: cce_ui::widget::input::Dropdown,
     switcher: cce_ui::widget::Switcher,
     pages: Vec<cce_ui::widget::Page>,
     statusbar: cce_ui::widget::StatusBar,
@@ -230,8 +230,9 @@ impl cce_ui::engine::Application for SystemInterface {
         let (sans_family, serif_family, monospace_family, _, _, _, _) = pages::fonts::read_preferred_fonts();
 
         let pages_names = Page::ALL.iter().map(|p| p.label().to_string()).collect::<Vec<_>>();
-        let menubar = cce_ui::widget::Paginator::new(pages_names);
-        let sidebar_width = menubar.sidebar_w();
+        let page_dropdown = cce_ui::widget::input::Dropdown::new(pages_names, initial_page_idx)
+            .with_open_upward(true);
+        let sidebar_width = 0.0f32;
 
         let switcher = cce_ui::widget::Switcher::new(sidebar_width, 0.0, 820.0 - sidebar_width, 680.0);
         let mut pages = Vec::new();
@@ -299,7 +300,7 @@ impl cce_ui::engine::Application for SystemInterface {
                 ])
                 .with_border([0.22, 0.22, 0.28, 1.0], 1.5)
                 .with_radius(win_radius as f32),
-            menubar,
+            page_dropdown,
             switcher,
             pages,
             statusbar: cce_ui::widget::StatusBar::new(),
@@ -321,7 +322,7 @@ impl cce_ui::engine::Application for SystemInterface {
             this.switcher.add_child(page.as_ptr(), &mut this.ui_context);
         }
 
-        this.root_window.add_child(this.menubar.as_ptr(), &mut this.ui_context);
+        this.root_window.add_child(this.page_dropdown.as_ptr(), &mut this.ui_context);
         this.root_window.add_child(this.switcher.as_ptr(), &mut this.ui_context);
         this.root_window.add_child(this.statusbar.as_ptr(), &mut this.ui_context);
 
diff --git a/src/renderer.rs b/src/renderer.rs
index 7e034c1..6b864af 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -1,7 +1,7 @@
 use crate::{SystemInterface, AppWidget, make_text_buffer_with_font};
 use cce_settings::app::PageContent;
 use cce_settings::pages::Page;
-use cce_ui::widget::{Element, TextItem, PageSelector};
+use cce_ui::widget::{Element, TextItem};
 
 impl SystemInterface {
 
@@ -37,7 +37,7 @@ impl SystemInterface {
 
         active_page.link_children(page_root, &mut self.page_sec_containers, &mut self.ui_context);
 
-        self.sidebar_width = self.menubar.sidebar_w();
+        self.sidebar_width = 0.0;
         self.header_height = 0.0; // No CSD Titlebar
         let mut widgets = Vec::new();
         let mut text_items = Vec::new();
@@ -66,7 +66,7 @@ impl SystemInterface {
         }
 
         let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
-        self.menubar.set_selected_page(page_idx);
+        self.page_dropdown.selected = page_idx;
         self.switcher.set_active_index(Some(page_idx));
 
         // Update root window size, background color, opacity, corner radius, and children
@@ -78,7 +78,7 @@ impl SystemInterface {
         self.root_window.background_color = Some(cce_ui::color::to_linear([win_r, win_g, win_b, win_a]));
         self.root_window.radius = 12.0;
         self.root_window.clear_children(&mut self.ui_context);
-        self.root_window.add_child(self.menubar.as_ptr(), &mut self.ui_context);
+        self.root_window.add_child(self.page_dropdown.as_ptr(), &mut self.ui_context);
         self.root_window.add_child(self.switcher.as_ptr(), &mut self.ui_context);
         self.root_window.add_child(self.statusbar.as_ptr(), &mut self.ui_context);
         if self.search_open {
@@ -88,7 +88,11 @@ impl SystemInterface {
 
         // Position sidebar and switcher below the titlebar
         let mut dummy_pc = PageContent::new();
-        cce_ui::layout::render_widget(&mut dummy_pc, &mut self.menubar, 0.0, self.header_height, self.sidebar_width, logical_sh - self.header_height - self.status_height, &mut self.ui_context);
+        let dropdown_w = 180.0f32;
+        let dropdown_h = 18.0f32;
+        let dropdown_x = logical_sw - dropdown_w - 12.0;
+        let dropdown_y = logical_sh - self.status_height + (self.status_height - dropdown_h) / 2.0;
+        cce_ui::layout::render_widget(&mut dummy_pc, &mut self.page_dropdown, dropdown_x, dropdown_y, dropdown_w, dropdown_h, &mut self.ui_context);
         let switcher_h = if self.search_open {
             logical_sh - self.header_height - 42.0 - self.status_height
         } else {