From: Olaf Wintermann Date: Mon, 6 Apr 2026 18:02:40 +0000 (+0200) Subject: add sidebar container X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=a9748fbb563e8ed5ee0c600d508cbc834dc543f1;p=note.git add sidebar container --- diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs index 3aeeb2d..7bbe728 100644 --- a/ui-rs/src/ui/container.rs +++ b/ui-rs/src/ui/container.rs @@ -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(&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); }