From f5e6686cb2756dca3375cde49cba9f1691e4bec5 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 3 Apr 2026 15:58:16 +0200 Subject: [PATCH] move container ui closure to build method --- application/src/main.rs | 7 +++++- ui-rs/src/ui/container.rs | 45 ++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/application/src/main.rs b/application/src/main.rs index dcc15e4..3f3e2ce 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -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(); } } diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs index 4005ed7..4a0aec2 100644 --- a/ui-rs/src/ui/container.rs +++ b/ui-rs/src/ui/container.rs @@ -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, + 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(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); -- 2.47.3