]> uap-core.de Git - note.git/commitdiff
button/toggle button builder create method returns a widget object main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 27 Apr 2026 20:27:59 +0000 (22:27 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 27 Apr 2026 20:27:59 +0000 (22:27 +0200)
ui-rs/src/ui/button.rs
ui-rs/src/ui/widget.rs

index 9d6b75ed06c472152ff29a33940a039e59b8cb16..f7352f239495c4c3838660f931a2ff36d0022951 100644 (file)
 
 use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
 
 use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
+use ui_rs_derive::{UiModel};
 use crate::ui::{event, toolkit, EventWrapper};
 use crate::ui::ffi::*;
 use crate::ui::{event, toolkit, EventWrapper};
 use crate::ui::ffi::*;
-use crate::ui::widget::widget_fn;
+use crate::ui::widget::*;
+
+pub struct Button {
+    ptr: *mut c_void
+}
+
+pub struct ToggleButton {
+    ptr: *mut c_void
+}
+
+impl Widget for Button {
+    fn get_widget(&self) -> *mut c_void {
+        self.ptr
+    }
+}
+
+impl Widget for ToggleButton {
+    fn get_widget(&self) -> *mut c_void {
+        self.ptr
+    }
+}
+
 
 pub struct ButtonBuilder<'a, T> {
     args: *mut UiButtonArgs,
 
 pub struct ButtonBuilder<'a, T> {
     args: *mut UiButtonArgs,
@@ -53,7 +75,7 @@ pub enum LabelType {
     TextIcon = 3,
 }
 
     TextIcon = 3,
 }
 
-pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs);
+pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs) -> *mut c_void;
 
 impl<T> toolkit::UiObject<T> {
     widget_fn!(button, button_builder, ButtonBuilder);
 
 impl<T> toolkit::UiObject<T> {
     widget_fn!(button, button_builder, ButtonBuilder);
@@ -100,27 +122,27 @@ impl<T> toolkit::UiObject<T> {
     }
 }
 
     }
 }
 
-fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) {
+fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
     unsafe {
     unsafe {
-        ui_togglebutton_create(obj, args);
+        ui_togglebutton_create(obj, args)
     }
 }
 
     }
 }
 
-fn checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
     unsafe {
     unsafe {
-        ui_checkbox_create(obj, args);
+        ui_checkbox_create(obj, args)
     }
 }
 
     }
 }
 
-fn switch_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn switch_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
     unsafe {
     unsafe {
-        ui_switch_create(obj, args);
+        ui_switch_create(obj, args)
     }
 }
 
     }
 }
 
-fn radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void{
     unsafe {
     unsafe {
-        ui_radiobutton_create(obj, args);
+        ui_radiobutton_create(obj, args)
     }
 }
 
     }
 }
 
@@ -141,9 +163,9 @@ impl<'a, T> Drop for ToggleBuilder<'a, T> {
 }
 
 impl<'a, T> ButtonBuilder<'a, T> {
 }
 
 impl<'a, T> ButtonBuilder<'a, T> {
-    pub fn create(&mut self) {
+    pub fn create(&mut self) -> Button {
         unsafe {
         unsafe {
-            ui_button_create(self.obj.ptr, self.args);
+            Button { ptr: ui_button_create(self.obj.ptr, self.args) }
         }
     }
 
         }
     }
 
@@ -321,8 +343,8 @@ impl<'a, T> ButtonBuilder<'a, T> {
 }
 
 impl<'a, T> ToggleBuilder<'a, T> {
 }
 
 impl<'a, T> ToggleBuilder<'a, T> {
-    pub fn create(&mut self) {
-        (self.create)(self.obj.ptr, self.args)
+    pub fn create(&mut self) -> ToggleButton {
+        ToggleButton { ptr: (self.create)(self.obj.ptr, self.args) }
     }
 
     pub fn fill(&mut self, fill: bool) -> &mut Self {
     }
 
     pub fn fill(&mut self, fill: bool) -> &mut Self {
@@ -514,12 +536,12 @@ impl<'a, T> ToggleBuilder<'a, T> {
 
 
 extern "C" {
 
 
 extern "C" {
-    fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs);
-    fn ui_togglebutton_create(obj: *const UiObject, args: *const UiToggleArgs);
-    fn ui_checkbox_create(obj: *const UiObject, args: *const UiToggleArgs);
-    fn ui_switch_create(obj: *const UiObject, args: *const UiToggleArgs);
-    fn ui_radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs);
-    fn ui_linkbutton_create(obj: *const UiObject, args: *const UiLinkButtonArgs);
+    fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs) -> *mut c_void;
+    fn ui_togglebutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+    fn ui_checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+    fn ui_switch_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+    fn ui_radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+    fn ui_linkbutton_create(obj: *const UiObject, args: *const UiLinkButtonArgs) -> *mut c_void;
 
     fn ui_button_args_new() -> *mut UiButtonArgs;
     fn ui_button_args_set_fill(args: *mut UiButtonArgs, fill: c_int);
 
     fn ui_button_args_new() -> *mut UiButtonArgs;
     fn ui_button_args_set_fill(args: *mut UiButtonArgs, fill: c_int);
index bfd02abb88d269c2c5d179da6a50e47bafee9a3f..0bb233733433a622e35f66b5443e3b6114773472 100644 (file)
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#![allow(dead_code)]
 
 
-/*
- * 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");
+///     }
+///
 macro_rules! widget_fn {
     ($fn_name:ident, $builder_fn:ident, $builder_ty:ident) => {
         pub fn $fn_name<F>(&mut self, build: F)
 macro_rules! widget_fn {
     ($fn_name:ident, $builder_fn:ident, $builder_ty:ident) => {
         pub fn $fn_name<F>(&mut self, build: F)
@@ -68,5 +112,7 @@ macro_rules! widget_typed_fn {
     };
 }
 
     };
 }
 
+use std::ffi::{c_int, c_void};
 pub(super) use widget_fn;
 pub(super) use widget_fn;
-pub(super) use widget_typed_fn;
\ No newline at end of file
+pub(super) use widget_typed_fn;
+