]> uap-core.de Git - note.git/commitdiff
add button bindings main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 30 Mar 2026 19:25:06 +0000 (21:25 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 30 Mar 2026 19:25:06 +0000 (21:25 +0200)
application/src/main.rs
ui-rs/src/ui/button.rs [new file with mode: 0644]
ui-rs/src/ui/ffi.rs
ui-rs/src/ui/mod.rs

index 097f1c4b8e25762ef80b555c80665f1c87e46a1a..dcc15e4d921c6c5e0afc86e50e2646989ce543b4 100644 (file)
@@ -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 (file)
index 0000000..412de6d
--- /dev/null
@@ -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
+    }
+}
index c4a27a86f0463948d2de75832d66c09165fda11f..a266786ceacfa0a857d6724eb3951e47d7e2dbda 100644 (file)
@@ -45,3 +45,18 @@ pub struct UiList {
 
 pub type UiCallback = Option<extern "C" fn(event: *const UiEvent, *mut c_void)>;
 
+
+#[repr(C)]
+pub struct UiButtonArgs {
+    _private: [u8; 0],
+}
+
+#[repr(C)]
+pub struct UiToggleArgs {
+    _private: [u8; 0],
+}
+
+#[repr(C)]
+pub struct UiLinkButtonArgs {
+    _private: [u8; 0],
+}
index 8a061feec112fec5e4211e8ba52cdd256a5810af..57aa5bf0dc05a28e5f1797390b8e0f4398f7807f 100644 (file)
@@ -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::*;