From a67ab832899094f5532fb4580fdc1120a109ed62 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Mon, 13 Apr 2026 20:06:25 +0200 Subject: [PATCH] add onchange arg to textfield/textarea builders --- ui-rs/src/ui/button.rs | 1 - ui-rs/src/ui/text.rs | 69 +++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index 8dbe4ea..b44ba78 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -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; diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs index 942c85e..8c91494 100644 --- a/ui-rs/src/ui/text.rs +++ b/ui-rs/src/ui/text.rs @@ -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 { +pub struct TextAreaBuilder<'a, T> { args: *mut UiTextAreaArgs, - obj: *const UiObject, - _marker: PhantomData + obj: &'a mut toolkit::UiObject } impl toolkit::UiObject { widget_fn!(textarea, textarea_builder, TextAreaBuilder); - pub fn textarea_builder(&self) -> TextAreaBuilder { + 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 Drop for TextAreaBuilder { +impl<'a, T> Drop for TextAreaBuilder<'a, T> { fn drop(&mut self) { unsafe { ui_textarea_args_free(self.args); @@ -36,10 +34,10 @@ impl Drop for TextAreaBuilder { } } -impl TextAreaBuilder { +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 TextAreaBuilder { } } - // TODO: callback, states + pub fn onchange(&mut self, f: F) -> &mut Self + where F: FnMut(&mut event::Event) + '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::)); + ui_textarea_args_set_onchangedata(self.args, ptr as *mut c_void); + } + self + } + + // TODO: states } @@ -172,11 +181,10 @@ impl TextAreaBuilder { pub type TextFieldCreate = fn(*const UiObject, *const UiTextFieldArgs); -pub struct TextFieldBuilder { +pub struct TextFieldBuilder<'a, T> { args: *mut UiTextFieldArgs, - obj: *const UiObject, - create: TextFieldCreate, - _marker: PhantomData + obj: &'a mut toolkit::UiObject, + create: TextFieldCreate } pub fn textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) { @@ -202,29 +210,29 @@ impl toolkit::UiObject { widget_fn!(passwordfield, passwordfield_builder, TextFieldBuilder); widget_fn!(frameless_textfield, frameless_textfield_builder, TextFieldBuilder); - pub fn textfield_builder(&self) -> TextFieldBuilder { + pub fn textfield_builder<'a>(&'a mut self) -> TextFieldBuilder { 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 { + pub fn passwordfield_builder<'a>(&'a mut self) -> TextFieldBuilder { 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 { + pub fn frameless_textfield_builder<'a>(&'a mut self) -> TextFieldBuilder { 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 Drop for TextFieldBuilder { +impl<'a, T> Drop for TextFieldBuilder<'a, T> { fn drop(&mut self) { unsafe { ui_textfield_args_free(self.args); @@ -232,10 +240,10 @@ impl Drop for TextFieldBuilder { } } -impl TextFieldBuilder { +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 TextFieldBuilder { } } - // TODO: callback, states + pub fn onchange(&mut self, f: F) -> &mut Self + where F: FnMut(&mut event::Event) + '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::)); + ui_textfield_args_set_onchangedata(self.args, ptr as *mut c_void); + } + self + } + + // TODO: states } -- 2.47.3