]> uap-core.de Git - note.git/commitdiff
add onchange arg to textfield/textarea builders
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 13 Apr 2026 18:06:25 +0000 (20:06 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 13 Apr 2026 18:06:25 +0000 (20:06 +0200)
ui-rs/src/ui/button.rs
ui-rs/src/ui/text.rs

index 8dbe4ea909d8236487da92614b8aae326219efb1..b44ba78190053eaa8685fed92c8a3c77f6f1194d 100644 (file)
@@ -3,7 +3,6 @@
 
 use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
-use std::marker::PhantomData;
 use crate::ui::{event, toolkit, EventWrapper};
 use crate::ui::ffi::*;
 use crate::ui::widget::widget_fn;
index 942c85ec7d4756d456c53dd5a0fbaef7ac7b7a5d..8c914943e72f83b85e599c376d2f04ec3cd3a4c0 100644 (file)
@@ -3,32 +3,30 @@
 
 use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
-use std::marker::PhantomData;
-use crate::ui::{toolkit};
+use crate::ui::{event, toolkit, EventWrapper};
 use crate::ui::ffi::*;
 use crate::ui::widget::widget_fn;
 
 
 /* -------------------------------- TextArea -------------------------------- */
 
-pub struct TextAreaBuilder<T> {
+pub struct TextAreaBuilder<'a, T> {
     args: *mut UiTextAreaArgs,
-    obj: *const UiObject,
-    _marker: PhantomData<T>
+    obj: &'a mut toolkit::UiObject<T>
 }
 
 impl<T> toolkit::UiObject<T> {
     widget_fn!(textarea, textarea_builder, TextAreaBuilder);
 
-    pub fn textarea_builder(&self) -> TextAreaBuilder<T> {
+    pub fn textarea_builder<'a>(&'a mut self) -> TextAreaBuilder<'a, T> {
         unsafe {
             let args = ui_textarea_args_new();
-            TextAreaBuilder { args: args, obj: self.ptr, _marker: PhantomData }
+            TextAreaBuilder { args: args, obj: self }
         }
     }
 }
 
-impl<T> Drop for TextAreaBuilder<T> {
+impl<'a, T> Drop for TextAreaBuilder<'a, T> {
     fn drop(&mut self) {
         unsafe {
             ui_textarea_args_free(self.args);
@@ -36,10 +34,10 @@ impl<T> Drop for TextAreaBuilder<T> {
     }
 }
 
-impl<T> TextAreaBuilder<T> {
+impl<'a, T> TextAreaBuilder<'a, T> {
     pub fn create(&mut self) {
         unsafe {
-            ui_textarea_create(self.obj, self.args);
+            ui_textarea_create(self.obj.ptr, self.args);
         }
     }
 
@@ -164,7 +162,18 @@ impl<T> TextAreaBuilder<T> {
         }
     }
 
-    // TODO: callback, states
+    pub fn onchange<F>(&mut self, f: F) -> &mut Self
+    where F: FnMut(&mut event::Event<T>) + 'static {
+        let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+        let ptr = self.obj.reg_box(wrapper);
+        unsafe {
+            ui_textarea_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
+            ui_textarea_args_set_onchangedata(self.args, ptr as *mut c_void);
+        }
+        self
+    }
+
+    // TODO: states
 }
 
 
@@ -172,11 +181,10 @@ impl<T> TextAreaBuilder<T> {
 
 pub type TextFieldCreate = fn(*const UiObject, *const UiTextFieldArgs);
 
-pub struct TextFieldBuilder<T> {
+pub struct TextFieldBuilder<'a, T> {
     args: *mut UiTextFieldArgs,
-    obj: *const UiObject,
-    create: TextFieldCreate,
-    _marker: PhantomData<T>
+    obj: &'a mut toolkit::UiObject<T>,
+    create: TextFieldCreate
 }
 
 pub fn textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) {
@@ -202,29 +210,29 @@ impl<T> toolkit::UiObject<T> {
     widget_fn!(passwordfield, passwordfield_builder, TextFieldBuilder);
     widget_fn!(frameless_textfield, frameless_textfield_builder, TextFieldBuilder);
 
-    pub fn textfield_builder(&self) -> TextFieldBuilder<T> {
+    pub fn textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
         unsafe {
             let args = ui_textfield_args_new();
-            TextFieldBuilder { args: args, obj: self.ptr, create: textfield_create, _marker: PhantomData }
+            TextFieldBuilder { args: args, obj: self, create: textfield_create }
         }
     }
 
-    pub fn passwordfield_builder(&self) -> TextFieldBuilder<T> {
+    pub fn passwordfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
         unsafe {
             let args = ui_textfield_args_new();
-            TextFieldBuilder { args: args, obj: self.ptr, create: passwordfield_create, _marker: PhantomData }
+            TextFieldBuilder { args: args, obj: self, create: passwordfield_create }
         }
     }
 
-    pub fn frameless_textfield_builder(&self) -> TextFieldBuilder<T> {
+    pub fn frameless_textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
         unsafe {
             let args = ui_textfield_args_new();
-            TextFieldBuilder { args: args, obj: self.ptr, create: frameless_textfield_create, _marker: PhantomData }
+            TextFieldBuilder { args: args, obj: self, create: frameless_textfield_create }
         }
     }
 }
 
-impl<T> Drop for TextFieldBuilder<T> {
+impl<'a, T> Drop for TextFieldBuilder<'a, T> {
     fn drop(&mut self) {
         unsafe {
             ui_textfield_args_free(self.args);
@@ -232,10 +240,10 @@ impl<T> Drop for TextFieldBuilder<T> {
     }
 }
 
-impl<T> TextFieldBuilder<T> {
+impl<'a, T> TextFieldBuilder<'a, T> {
     pub fn create(&mut self) {
         unsafe {
-            ui_textfield_create(self.obj, self.args);
+            ui_textfield_create(self.obj.ptr, self.args);
         }
     }
 
@@ -360,7 +368,18 @@ impl<T> TextFieldBuilder<T> {
         }
     }
 
-    // TODO: callback, states
+    pub fn onchange<F>(&mut self, f: F) -> &mut Self
+    where F: FnMut(&mut event::Event<T>) + 'static {
+        let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+        let ptr = self.obj.reg_box(wrapper);
+        unsafe {
+            ui_textfield_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
+            ui_textfield_args_set_onchangedata(self.args, ptr as *mut c_void);
+        }
+        self
+    }
+
+    // TODO: states
 }