From: Olaf Wintermann Date: Mon, 27 Apr 2026 20:27:59 +0000 (+0200) Subject: button/toggle button builder create method returns a widget object X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;ds=sidebyside;p=note.git button/toggle button builder create method returns a widget object --- diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index 9d6b75e..f7352f2 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -31,9 +31,31 @@ 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::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, @@ -53,7 +75,7 @@ pub enum LabelType { TextIcon = 3, } -pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs); +pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs) -> *mut c_void; impl toolkit::UiObject { widget_fn!(button, button_builder, ButtonBuilder); @@ -100,27 +122,27 @@ impl toolkit::UiObject { } } -fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) { +fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void { 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 { - 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 { - 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 { - 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> { - pub fn create(&mut self) { + pub fn create(&mut self) -> Button { 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> { - 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 { @@ -514,12 +536,12 @@ impl<'a, T> ToggleBuilder<'a, T> { 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); diff --git a/ui-rs/src/ui/widget.rs b/ui-rs/src/ui/widget.rs index bfd02ab..0bb2337 100644 --- a/ui-rs/src/ui/widget.rs +++ b/ui-rs/src/ui/widget.rs @@ -26,22 +26,66 @@ * 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(&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_typed_fn; \ No newline at end of file +pub(super) use widget_typed_fn; +