-/*
- * Create a closure-based widget creation function
- *
- * Example:
- * pub fn button_builder(&self) -> ButtonBuilder { ... }
- * widget_fn!(button, button_builder, ButtonBuilder);
- *
- * This creates a function
- * pub fn button(&self, build: F)
- *
- * That can be used like:
- * obj.button(|b| {
- * b.label("Hello");
- * }
- */
+pub trait Widget {
+ fn get_widget(&self) -> *mut c_void;
+
+ fn set_size(&mut self, width: i32, height: i32) {
+ unsafe {
+ ui_widget_set_size(self.get_widget(), width, height);
+ }
+ }
+
+ fn redraw(&mut self) {
+ unsafe {
+ ui_widget_redraw(self.get_widget());
+ }
+ }
+
+ fn set_enabled(&mut self, enabled: bool) {
+ unsafe {
+ ui_widget_set_enabled(self.get_widget(), enabled as c_int);
+ }
+ }
+
+ fn set_visible(&mut self, enabled: bool) {
+ unsafe {
+ ui_widget_set_visible(self.get_widget(), enabled as c_int);
+ }
+ }
+}
+
+
+/* ------------------------------ C functions ----------------------------- */
+
+extern "C" {
+ fn ui_widget_set_size(widget: *mut c_void, width: c_int, height: c_int);
+ fn ui_widget_redraw(widget: *mut c_void);
+ fn ui_widget_set_enabled(widget: *mut c_void, enable: c_int);
+ fn ui_widget_set_visible(widget: *mut c_void, enable: c_int);
+}
+
+/* ------------------------ internal helper macros ------------------------ */
+
+///
+/// Create a closure-based widget creation function
+///
+/// # Example:
+///
+/// pub fn button_builder(&self) -> ButtonBuilder { ... }
+/// widget_fn!(button, button_builder, ButtonBuilder);
+///
+/// This creates a function
+///
+/// pub fn button(&self, build: F)
+///
+/// That can be used like:
+///
+/// obj.button(|b| {
+/// b.label("Hello");
+/// }
+///