From f099fed9fb4fc37b7ff5547829d24cfdcb7d70e0 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Mon, 30 Mar 2026 21:25:06 +0200 Subject: [PATCH] add button bindings --- application/src/main.rs | 1 + ui-rs/src/ui/button.rs | 96 +++++++++++++++++++++++++++++++++++++++++ ui-rs/src/ui/ffi.rs | 15 +++++++ ui-rs/src/ui/mod.rs | 2 + 4 files changed, 114 insertions(+) create mode 100644 ui-rs/src/ui/button.rs diff --git a/application/src/main.rs b/application/src/main.rs index 097f1c4..dcc15e4 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -12,6 +12,7 @@ struct App; impl ui::Application for App { fn on_startup(&self) { let obj = ui::window("note"); + obj.button().label("Hello").build(); obj.show(); } } diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs new file mode 100644 index 0000000..412de6d --- /dev/null +++ b/ui-rs/src/ui/button.rs @@ -0,0 +1,96 @@ +#![allow(dead_code)] +#[allow(unused_imports)] + +use std::ffi::{c_char, c_int, c_void}; +use std::ffi::CString; +use crate::ui::toolkit; +use crate::ui::ffi::*; + +extern "C" { + fn ui_window(title: *const c_char) -> *const UiObject; + + 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_args_new() -> *mut UiButtonArgs; + fn ui_button_args_set_label(args: *mut UiButtonArgs, label: *const c_char); + // TODO: implement arg funcs + fn ui_button_args_free(args: *mut UiButtonArgs); + + fn ui_toggle_args_new() -> *mut UiToggleArgs; + fn ui_toggle_args_free(args: *mut UiToggleArgs); +} + +pub struct ButtonBuilder { + args: *mut UiButtonArgs, + obj: *const UiObject +} + +pub struct ToggleBuilder { + args: *mut UiToggleArgs +} + +impl toolkit::UiObject { + pub fn button(&self) -> ButtonBuilder { + unsafe { + let args = ui_button_args_new(); + ButtonBuilder { args: args, obj: self.ptr } + } + } + + pub fn togglebutton() -> ToggleBuilder { + unsafe { + let args = ui_toggle_args_new(); + ToggleBuilder { args: args } + } + } + + pub fn checkbox() -> ToggleBuilder { + unsafe { + let args = ui_toggle_args_new(); + ToggleBuilder { args: args } + } + } + + pub fn switch() -> ToggleBuilder { + unsafe { + let args = ui_toggle_args_new(); + ToggleBuilder { args: args } + } + } + + pub fn radiobutton() -> ToggleBuilder { + unsafe { + let args = ui_toggle_args_new(); + ToggleBuilder { args: args } + } + } +} + +impl Drop for ButtonBuilder { + fn drop(&mut self) { + unsafe { + ui_button_args_free(self.args); + } + } +} + +impl ButtonBuilder { + pub fn build(self) { + unsafe { + ui_button_create(self.obj, self.args); + } + } + + pub fn label(self, label: &str) -> Self { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_button_args_set_label(self.args, cstr.as_ptr()); + } + self + } +} diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index c4a27a8..a266786 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -45,3 +45,18 @@ pub struct UiList { pub type UiCallback = Option; + +#[repr(C)] +pub struct UiButtonArgs { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiToggleArgs { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiLinkButtonArgs { + _private: [u8; 0], +} diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs index 8a061fe..57aa5bf 100644 --- a/ui-rs/src/ui/mod.rs +++ b/ui-rs/src/ui/mod.rs @@ -2,7 +2,9 @@ mod ffi; mod toolkit; mod application; mod window; +mod button; pub use toolkit::*; pub use application::*; pub use window::*; +pub use button::*; -- 2.47.3