]> uap-core.de Git - note.git/commitdiff
add sidebar container
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 6 Apr 2026 18:02:40 +0000 (20:02 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 6 Apr 2026 18:02:40 +0000 (20:02 +0200)
ui-rs/src/ui/container.rs

index 3aeeb2df43e0da69e283fa100c8d081585ee23bf..7bbe728f1f153b5ae685623b82850a3b41de669a 100644 (file)
@@ -689,6 +689,154 @@ impl<'a> Drop for SplitPaneBuilder<'a> {
 }
 
 
+
+/* -------------------------------- Sidebar -------------------------------- */
+
+pub type SidebarCreate = fn(*mut UiObject, *const UiSidebarArgs );
+
+pub struct SidebarBuilder<'a> {
+    args: *mut UiSidebarArgs,
+    obj: &'a mut toolkit::UiObject,
+    create: SidebarCreate
+}
+
+fn sidebar_create(obj: *mut UiObject, args: *const UiSidebarArgs) {
+    unsafe {
+        ui_sidebar_create(obj, args);
+    }
+}
+
+fn left_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) {
+    unsafe {
+        ui_left_panel_create(obj, args);
+    }
+}
+
+fn right_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) {
+    unsafe {
+        ui_right_panel_create(obj, args);
+    }
+}
+
+
+impl toolkit::UiObject {
+    container_fn!(sidebar, sidebar_builder, SidebarBuilder);
+
+    pub fn sidebar_builder(&mut self) -> SidebarBuilder<'_>
+    {
+        unsafe {
+            let args = ui_sidebar_args_new();
+            SidebarBuilder {
+                args,
+                obj: self,
+                create: sidebar_create
+            }
+        }
+    }
+
+    pub fn left_panel_builder(&mut self) -> SidebarBuilder<'_>
+    {
+        unsafe {
+            let args = ui_sidebar_args_new();
+            SidebarBuilder {
+                args,
+                obj: self,
+                create: left_panel_create
+            }
+        }
+    }
+
+    pub fn right_panel_builder(&mut self) -> SidebarBuilder<'_>
+    {
+        unsafe {
+            let args = ui_sidebar_args_new();
+            SidebarBuilder {
+                args,
+                obj: self,
+                create: right_panel_create
+            }
+        }
+    }
+}
+
+impl<'a> SidebarBuilder<'a> {
+    pub fn create<F>(&mut self, create_ui: F)
+    where F: FnOnce(&mut toolkit::UiObject) {
+        (self.create)(self.obj.ptr, self.args);
+        create_ui(self.obj);
+        unsafe {
+            ui_container_begin_close(self.obj.ptr);
+            ui_container_finish(self.obj.ptr);
+        }
+    }
+
+    pub fn margin(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_margin(self.args, value);
+        }
+        self
+    }
+
+    pub fn margin_left(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_margin_left(self.args, value);
+        }
+        self
+    }
+
+    pub fn margin_right(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_margin_right(self.args, value);
+        }
+        self
+    }
+
+    pub fn margin_top(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_margin_top(self.args, value);
+        }
+        self
+    }
+
+    pub fn margin_bottom(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_margin_bottom(self.args, value);
+        }
+        self
+    }
+
+    pub fn name(&mut self, value: &str) -> &mut Self {
+        let cstr = CString::new(value).unwrap();
+        unsafe {
+            ui_sidebar_args_set_name(self.args, cstr.as_ptr());
+        }
+        self
+    }
+
+    pub fn style_class(&mut self, value: &str) -> &mut Self {
+        let cstr = CString::new(value).unwrap();
+        unsafe {
+            ui_sidebar_args_set_style_class(self.args, cstr.as_ptr());
+        }
+        self
+    }
+
+    pub fn spacing(&mut self, value: i32) -> &mut Self {
+        unsafe {
+            ui_sidebar_args_set_spacing(self.args, value);
+        }
+        self
+    }
+}
+
+impl<'a> Drop for SidebarBuilder<'a> {
+    fn drop(&mut self) {
+        unsafe {
+            ui_sidebar_args_free(self.args);
+        }
+    }
+}
+
 /* -------------------------------- C functions -------------------------------- */
 
 extern "C" {
@@ -703,6 +851,9 @@ extern "C" {
     fn ui_scrolledwindow_create(obj: *mut UiObject, args: *const UiFrameArgs) -> *mut c_void;
     fn ui_hsplitpane_create(obj: *mut UiObject, args: *const UiSplitPaneArgs) -> *mut c_void;
     fn ui_vsplitpane_create(obj: *mut UiObject, args: *const UiSplitPaneArgs) -> *mut c_void;
+    fn ui_sidebar_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void;
+    fn ui_left_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void;
+    fn ui_right_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void;
 
 
     fn ui_container_args_new() -> *mut UiContainerArgs;
@@ -774,4 +925,16 @@ extern "C" {
     fn ui_splitpane_args_set_rowspacing(args: *mut UiSplitPaneArgs, spacing: c_int);
     fn ui_splitpane_args_set_visibility_states(args: *mut UiSplitPaneArgs, states: *const c_int, numstates: c_int);
     fn ui_splitpane_args_free(args: *mut UiSplitPaneArgs);
+
+
+    fn ui_sidebar_args_new() -> *mut UiSidebarArgs;
+    fn ui_sidebar_args_set_margin(args: *mut UiSidebarArgs, value: c_int);
+    fn ui_sidebar_args_set_margin_left(args: *mut UiSidebarArgs, value: c_int);
+    fn ui_sidebar_args_set_margin_right(args: *mut UiSidebarArgs, value: c_int);
+    fn ui_sidebar_args_set_margin_top(args: *mut UiSidebarArgs, value: c_int);
+    fn ui_sidebar_args_set_margin_bottom(args: *mut UiSidebarArgs, value: c_int);
+    fn ui_sidebar_args_set_name(args: *mut UiSidebarArgs, name: *const c_char);
+    fn ui_sidebar_args_set_style_class(args: *mut UiSidebarArgs, classname: *const c_char);
+    fn ui_sidebar_args_set_spacing(args: *mut UiSidebarArgs, spacing: c_int);
+    fn ui_sidebar_args_free(args: *mut UiSidebarArgs);
 }