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();
}
}
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) {
}
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);