From: Olaf Wintermann Date: Wed, 8 Apr 2026 20:13:05 +0000 (+0200) Subject: add textfield bindings X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git add textfield bindings --- diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs index 8cc5563..59be488 100644 --- a/ui-rs/src/ui/text.rs +++ b/ui-rs/src/ui/text.rs @@ -8,6 +8,8 @@ use crate::ui::ffi::*; use crate::ui::widget::widget_fn; +/* -------------------------------- TextArea -------------------------------- */ + pub struct TextAreaBuilder { args: *mut UiTextAreaArgs, obj: *const UiObject @@ -164,6 +166,202 @@ impl TextAreaBuilder { } +/* -------------------------------- TextField -------------------------------- */ + +pub type TextFieldCreate = fn(*const UiObject, *const UiTextFieldArgs); + +pub struct TextFieldBuilder { + args: *mut UiTextFieldArgs, + obj: *const UiObject, + create: TextFieldCreate +} + +pub fn textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) { + unsafe { + ui_textfield_create(obj, args); + } +} + +pub fn passwordfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) { + unsafe { + ui_passwordfield_create(obj, args); + } +} + +pub fn frameless_textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) { + unsafe { + ui_frameless_textfield_create(obj, args); + } +} + +impl toolkit::UiObject { + widget_fn!(textfield, textfield_builder, TextFieldBuilder); + widget_fn!(passwordfield, passwordfield_builder, TextFieldBuilder); + widget_fn!(frameless_textfield, frameless_textfield_builder, TextFieldBuilder); + + pub fn textfield_builder(&self) -> TextFieldBuilder { + unsafe { + let args = ui_textfield_args_new(); + TextFieldBuilder { args: args, obj: self.ptr, create: textfield_create } + } + } + + pub fn passwordfield_builder(&self) -> TextFieldBuilder { + unsafe { + let args = ui_textfield_args_new(); + TextFieldBuilder { args: args, obj: self.ptr, create: passwordfield_create } + } + } + + pub fn frameless_textfield_builder(&self) -> TextFieldBuilder { + unsafe { + let args = ui_textfield_args_new(); + TextFieldBuilder { args: args, obj: self.ptr, create: frameless_textfield_create } + } + } +} + +impl Drop for TextFieldBuilder { + fn drop(&mut self) { + unsafe { + ui_textfield_args_free(self.args); + } + } +} + +impl TextFieldBuilder { + pub fn create(&mut self) { + unsafe { + ui_textfield_create(self.obj, self.args); + } + } + + pub fn fill(&mut self, fill: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_fill(self.args, if fill { 1 } else { 0 }); + } + self + } + + pub fn hexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_hexpand(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn vexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_vexpand(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn hfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_hfill(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn vfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_vfill(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn override_defaults(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textfield_args_set_override_defaults(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn margin(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_margin(self.args, value); + } + self + } + + pub fn margin_left(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_margin_left(self.args, value); + } + self + } + + pub fn margin_right(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_margin_right(self.args, value); + } + self + } + + pub fn margin_top(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_margin_top(self.args, value); + } + self + } + + pub fn margin_bottom(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_margin_bottom(self.args, value); + } + self + } + + pub fn colspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_colspan(self.args, value); + } + self + } + + pub fn rowspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textfield_args_set_rowspan(self.args, value); + } + self + } + + pub fn name(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_textfield_args_set_name(self.args, cstr.as_ptr()); + } + self + } + + pub fn style_class(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_textfield_args_set_style_class(self.args, cstr.as_ptr()); + } + self + } + + pub fn varname(&mut self, varname: &str) -> &mut Self { + let cstr = CString::new(varname).unwrap(); + unsafe { + ui_textfield_args_set_varname(self.args, cstr.as_ptr()); + } + self + } + + pub fn value(&mut self, value: &toolkit::UiString) { + unsafe { + ui_textfield_args_set_value(self.args, value.ptr); + } + } + + // TODO: callback, states +} + + +/* -------------------------------- C functions -------------------------------- */ extern "C" { fn ui_textarea_create(obj: *const UiObject, args: *const UiTextAreaArgs); @@ -188,7 +386,7 @@ extern "C" { fn ui_textfield_args_set_name(args: *mut UiTextFieldArgs, name: *const c_char); fn ui_textfield_args_set_style_class(args: *mut UiTextFieldArgs, classname: *const c_char); fn ui_textfield_args_set_varname(args: *mut UiTextFieldArgs, varname: *const c_char); - fn ui_textfield_args_set_value(args: *mut UiTextAreaArgs, ivalue: *mut UiString); + fn ui_textfield_args_set_value(args: *mut UiTextFieldArgs, ivalue: *mut UiString); fn ui_textfield_args_set_onchange(args: *mut UiTextFieldArgs, callback: UiCallback); fn ui_textfield_args_set_onchangedata(args: *mut UiTextFieldArgs, data: *mut c_void); fn ui_textfield_args_set_states(args: *mut UiTextFieldArgs, states: *const c_int, numstates: c_int);