]> uap-core.de Git - note.git/commitdiff
implement box and grid containers
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 2 Apr 2026 19:13:24 +0000 (21:13 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 2 Apr 2026 19:13:24 +0000 (21:13 +0200)
ui-rs/src/ui/container.rs [new file with mode: 0644]
ui-rs/src/ui/ffi.rs
ui-rs/src/ui/mod.rs

diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs
new file mode 100644 (file)
index 0000000..4005ed7
--- /dev/null
@@ -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<dyn Fn() + 'a>,
+}
+
+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
index 47051759a833b9a289497036dc76e4faf70cc3e4..939280a0ae3caa263b8aeec8668e9e679317ef94 100644 (file)
@@ -50,6 +50,11 @@ pub struct UiList {
 pub type UiCallback = Option<extern "C" fn(event: *const UiEvent, *mut c_void)>;
 
 
+#[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],
 }
+
index 57aa5bf0dc05a28e5f1797390b8e0f4398f7807f..0dba9938ac82b7b1fb3ecd87084c6169491f228d 100644 (file)
@@ -3,6 +3,7 @@ mod toolkit;
 mod application;
 mod window;
 mod button;
+mod container;
 
 pub use toolkit::*;
 pub use application::*;