]> uap-core.de Git - note.git/commitdiff
move container ui closure to build method
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 3 Apr 2026 13:58:16 +0000 (15:58 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 3 Apr 2026 13:58:16 +0000 (15:58 +0200)
application/src/main.rs
ui-rs/src/ui/container.rs

index dcc15e4d921c6c5e0afc86e50e2646989ce543b4..3f3e2ce4b8d1837b708b487fef09170cf37ff0b3 100644 (file)
@@ -11,8 +11,13 @@ struct App;
 
 impl ui::Application for App {
     fn on_startup(&self) {
-        let obj = ui::window("note");
+        let mut obj = ui::window("note");
         obj.button().label("Hello").build();
+        obj.hbox().build(|obj| {
+            obj.button().label("HButton 1").build();
+            obj.button().label("HButton 2").build();
+            obj.button().label("HButton 3").build();
+        });
         obj.show();
     }
 }
index 4005ed71191b36fdbfae8da649e586a4bbf017e4..4a0aec2b4e634b8d8b849e31fc91dc992b5e51f6 100644 (file)
@@ -43,9 +43,8 @@ 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>,
+    obj: &'a mut toolkit::UiObject,
+    create: ContainerCreate
 }
 
 fn vbox_create(obj: *mut UiObject, args: *const UiContainerArgs) {
@@ -67,64 +66,56 @@ fn grid_create(obj: *mut UiObject, args: *const UiContainerArgs) {
 }
 
 impl toolkit::UiObject {
-    pub fn vbox<'a, F>(&self, f: F) -> ContainerBuilder<'a>
-    where
-        F: Fn() + 'a,
+    pub fn vbox(&mut self) -> ContainerBuilder
     {
         unsafe {
             let args = ui_container_args_new();
             ContainerBuilder {
                 args,
-                obj: self.ptr,
-                create: vbox_create,
-                create_ui: Box::new(f),
+                obj: self,
+                create: vbox_create
             }
         }
     }
 
-    pub fn hbox<'a, F>(&self, f: F) -> ContainerBuilder<'a>
-    where
-        F: Fn() + 'a,
+    pub fn hbox(&mut self) -> ContainerBuilder
     {
         unsafe {
             let args = ui_container_args_new();
             ContainerBuilder {
                 args,
-                obj: self.ptr,
-                create: hbox_create,
-                create_ui: Box::new(f),
+                obj: self,
+                create: hbox_create
             }
         }
     }
 
-    pub fn grid<'a, F>(&self, f: F) -> ContainerBuilder<'a>
-    where
-        F: Fn() + 'a,
+    pub fn grid(&mut self) -> ContainerBuilder
     {
         unsafe {
             let args = ui_container_args_new();
             ContainerBuilder {
                 args,
-                obj: self.ptr,
-                create: grid_create,
-                create_ui: Box::new(f),
+                obj: self,
+                create: grid_create
             }
         }
     }
 }
 
 impl<'a> ContainerBuilder<'a> {
-    pub fn build(self) {
-        (self.create)(self.obj, self.args);
-        (self.create_ui)();
+    pub fn build<F>(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);
-            ui_container_finish(self.obj);
+            ui_container_begin_close(self.obj.ptr);
+            ui_container_finish(self.obj.ptr);
         }
     }
 }
 
-impl<'a>  Drop for ContainerBuilder<'a> {
+impl<'a> Drop for ContainerBuilder<'a> {
     fn drop(&mut self) {
         unsafe {
             ui_container_args_free(self.args);