From: Olaf Wintermann Date: Thu, 2 Apr 2026 19:13:24 +0000 (+0200) Subject: implement box and grid containers X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=356d402c3f3f0b265f6febc4a2e0c5193152ba1e;p=note.git implement box and grid containers --- diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs new file mode 100644 index 0000000..4005ed7 --- /dev/null +++ b/ui-rs/src/ui/container.rs @@ -0,0 +1,133 @@ +#![allow(dead_code)] +#[allow(unused_imports)] + +use std::ffi::{c_char, c_int, c_void}; +use crate::ui::ffi::*; +use crate::ui::{toolkit}; + +extern "C" { + fn ui_container_begin_close(obj: *mut UiObject); + fn ui_container_finish(obj: *mut UiObject) -> c_int; + + fn ui_vbox_create(obj: *mut UiObject, args: *const UiContainerArgs) -> *mut c_void; + fn ui_hbox_create(obj: *mut UiObject, args: *const UiContainerArgs) -> *mut c_void; + fn ui_grid_create(obj: *mut UiObject, args: *const UiContainerArgs) -> *mut c_void; + + + + fn ui_container_args_new() -> *mut UiContainerArgs; + fn ui_container_args_set_fill(args: *mut UiContainerArgs, fill: c_int); + fn ui_container_args_set_hexpand(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_vexpand(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_hfill(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_vfill(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_override_defaults(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_margin(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_margin_left(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_margin_right(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_margin_top(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_margin_bottom(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_colspan(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_rowspan(args: *mut UiContainerArgs, value: c_int); + fn ui_container_args_set_name(args: *mut UiContainerArgs, name: *const c_char); + fn ui_container_args_set_style_class(args: *mut UiContainerArgs, classname: *const c_char); + fn ui_container_args_set_spacing(args: *mut UiContainerArgs, spacing: c_int); + fn ui_container_args_set_columnspacing(args: *mut UiContainerArgs, spacing: c_int); + fn ui_container_args_set_rowspacing(args: *mut UiContainerArgs, spacing: c_int); + fn ui_container_args_set_visibility_states(args: *mut UiContainerArgs, states: *const c_int, numstates: c_int); + fn ui_container_args_free(args: *mut UiContainerArgs); +} + +pub type ContainerCreate = fn(*mut UiObject, *const UiContainerArgs); +pub type CreateContainerUI = fn(obj: &toolkit::UiObject); + +pub struct ContainerBuilder<'a> { + args: *mut UiContainerArgs, + obj: *mut UiObject, + create: ContainerCreate, + create_ui: Box, +} + +fn vbox_create(obj: *mut UiObject, args: *const UiContainerArgs) { + unsafe { + ui_vbox_create(obj, args); + } +} + +fn hbox_create(obj: *mut UiObject, args: *const UiContainerArgs) { + unsafe { + ui_hbox_create(obj, args); + } +} + +fn grid_create(obj: *mut UiObject, args: *const UiContainerArgs) { + unsafe { + ui_grid_create(obj, args); + } +} + +impl toolkit::UiObject { + pub fn vbox<'a, F>(&self, f: F) -> ContainerBuilder<'a> + where + F: Fn() + 'a, + { + unsafe { + let args = ui_container_args_new(); + ContainerBuilder { + args, + obj: self.ptr, + create: vbox_create, + create_ui: Box::new(f), + } + } + } + + pub fn hbox<'a, F>(&self, f: F) -> ContainerBuilder<'a> + where + F: Fn() + 'a, + { + unsafe { + let args = ui_container_args_new(); + ContainerBuilder { + args, + obj: self.ptr, + create: hbox_create, + create_ui: Box::new(f), + } + } + } + + pub fn grid<'a, F>(&self, f: F) -> ContainerBuilder<'a> + where + F: Fn() + 'a, + { + unsafe { + let args = ui_container_args_new(); + ContainerBuilder { + args, + obj: self.ptr, + create: grid_create, + create_ui: Box::new(f), + } + } + } +} + +impl<'a> ContainerBuilder<'a> { + pub fn build(self) { + (self.create)(self.obj, self.args); + (self.create_ui)(); + unsafe { + ui_container_begin_close(self.obj); + ui_container_finish(self.obj); + } + } +} + +impl<'a> Drop for ContainerBuilder<'a> { + fn drop(&mut self) { + unsafe { + ui_container_args_free(self.args); + } + } +} \ No newline at end of file diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index 4705175..939280a 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -50,6 +50,11 @@ pub struct UiList { pub type UiCallback = Option; +#[repr(C)] +pub struct UiContainerArgs { + _private: [u8; 0], +} + #[repr(C)] pub struct UiButtonArgs { _private: [u8; 0], @@ -64,3 +69,4 @@ pub struct UiToggleArgs { pub struct UiLinkButtonArgs { _private: [u8; 0], } + diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs index 57aa5bf..0dba993 100644 --- a/ui-rs/src/ui/mod.rs +++ b/ui-rs/src/ui/mod.rs @@ -3,6 +3,7 @@ mod toolkit; mod application; mod window; mod button; +mod container; pub use toolkit::*; pub use application::*;