--- /dev/null
+#![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