From 71afbcebe711d5e065b3337e39a27804e75516f0 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Tue, 7 Apr 2026 20:04:18 +0200 Subject: [PATCH] add textarea --- ui-rs/src/ui/button.rs | 131 ++++++++++++------------ ui-rs/src/ui/ffi.rs | 10 ++ ui-rs/src/ui/mod.rs | 1 + ui-rs/src/ui/text.rs | 221 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 298 insertions(+), 65 deletions(-) create mode 100644 ui-rs/src/ui/text.rs diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index 45f36ab..9001aca 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -7,70 +7,6 @@ use crate::ui::{toolkit}; use crate::ui::ffi::*; use crate::ui::widget::widget_fn; -extern "C" { - 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_fill(args: *mut UiButtonArgs, fill: c_int); - fn ui_button_args_set_hexpand(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_vexpand(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_hfill(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_vfill(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_override_defaults(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_margin(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_margin_left(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_margin_right(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_margin_top(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_margin_bottom(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_colspan(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_rowspan(args: *mut UiButtonArgs, value: c_int); - fn ui_button_args_set_name(args: *mut UiButtonArgs, name: *const c_char); - fn ui_button_args_set_style_class(args: *mut UiButtonArgs, classname: *const c_char); - fn ui_button_args_set_label(args: *mut UiButtonArgs, label: *const c_char); - fn ui_button_args_set_icon(args: *mut UiButtonArgs, icon: *const c_char); - fn ui_button_args_set_tooltip(args: *mut UiButtonArgs, tooltip: *const c_char); - fn ui_button_args_set_labeltype(args: *mut UiButtonArgs, ltype: c_int); - fn ui_button_args_set_onclick(args: *mut UiButtonArgs, callback: UiCallback); - fn ui_button_args_set_onclickdata(args: *mut UiButtonArgs, data: *mut c_void); - fn ui_button_args_set_states(args: *mut UiButtonArgs, states: *const c_int, numstates: c_int); - fn ui_button_args_set_visibility_states(args: *mut UiButtonArgs, states: *const c_int, numstates: c_int); - fn ui_button_args_free(args: *mut UiButtonArgs); - - fn ui_toggle_args_new() -> *mut UiToggleArgs; - fn ui_toggle_args_set_fill(args: *mut UiToggleArgs, fill: c_int); - fn ui_toggle_args_set_hexpand(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_vexpand(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_hfill(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_vfill(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_override_defaults(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_margin(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_margin_left(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_margin_right(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_margin_top(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_margin_bottom(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_colspan(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_rowspan(args: *mut UiToggleArgs, value: c_int); - fn ui_toggle_args_set_name(args: *mut UiToggleArgs, name: *const c_char); - fn ui_toggle_args_set_style_class(args: *mut UiToggleArgs, classname: *const c_char); - fn ui_toggle_args_set_label(args: *mut UiToggleArgs, label: *const c_char); - fn ui_toggle_args_set_icon(args: *mut UiToggleArgs, icon: *const c_char); - fn ui_toggle_args_set_tooltip(args: *mut UiToggleArgs, tooltip: *const c_char); - fn ui_toggle_args_set_labeltype(args: *mut UiToggleArgs, ltype: c_int); - fn ui_toggle_args_set_onchange(args: *mut UiToggleArgs, callback: UiCallback); - fn ui_toggle_args_set_onchangedata(args: *mut UiToggleArgs, data: *mut c_void); - fn ui_toggle_args_set_varname(args: *mut UiToggleArgs, varname: *const c_char); - fn ui_toggle_args_set_value(args: *mut UiToggleArgs, ivalue: *mut UiInteger); - fn ui_toggle_args_set_enablestate(args: *mut UiToggleArgs, state: c_int); - fn ui_toggle_args_set_states(args: *mut UiToggleArgs, states: *const c_int, numstates: c_int); - fn ui_toggle_args_set_visibility_states(args: *mut UiToggleArgs, states: *const c_int, numstates: c_int); - fn ui_toggle_args_free(args: *mut UiToggleArgs); -} - pub struct ButtonBuilder { args: *mut UiButtonArgs, obj: *const UiObject @@ -484,4 +420,69 @@ impl ToggleBuilder { } // TODO: callback, states -} \ No newline at end of file +} + + +extern "C" { + 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_fill(args: *mut UiButtonArgs, fill: c_int); + fn ui_button_args_set_hexpand(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_vexpand(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_hfill(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_vfill(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_override_defaults(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_margin(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_margin_left(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_margin_right(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_margin_top(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_margin_bottom(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_colspan(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_rowspan(args: *mut UiButtonArgs, value: c_int); + fn ui_button_args_set_name(args: *mut UiButtonArgs, name: *const c_char); + fn ui_button_args_set_style_class(args: *mut UiButtonArgs, classname: *const c_char); + fn ui_button_args_set_label(args: *mut UiButtonArgs, label: *const c_char); + fn ui_button_args_set_icon(args: *mut UiButtonArgs, icon: *const c_char); + fn ui_button_args_set_tooltip(args: *mut UiButtonArgs, tooltip: *const c_char); + fn ui_button_args_set_labeltype(args: *mut UiButtonArgs, ltype: c_int); + fn ui_button_args_set_onclick(args: *mut UiButtonArgs, callback: UiCallback); + fn ui_button_args_set_onclickdata(args: *mut UiButtonArgs, data: *mut c_void); + fn ui_button_args_set_states(args: *mut UiButtonArgs, states: *const c_int, numstates: c_int); + fn ui_button_args_set_visibility_states(args: *mut UiButtonArgs, states: *const c_int, numstates: c_int); + fn ui_button_args_free(args: *mut UiButtonArgs); + + fn ui_toggle_args_new() -> *mut UiToggleArgs; + fn ui_toggle_args_set_fill(args: *mut UiToggleArgs, fill: c_int); + fn ui_toggle_args_set_hexpand(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_vexpand(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_hfill(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_vfill(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_override_defaults(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_margin(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_margin_left(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_margin_right(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_margin_top(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_margin_bottom(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_colspan(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_rowspan(args: *mut UiToggleArgs, value: c_int); + fn ui_toggle_args_set_name(args: *mut UiToggleArgs, name: *const c_char); + fn ui_toggle_args_set_style_class(args: *mut UiToggleArgs, classname: *const c_char); + fn ui_toggle_args_set_label(args: *mut UiToggleArgs, label: *const c_char); + fn ui_toggle_args_set_icon(args: *mut UiToggleArgs, icon: *const c_char); + fn ui_toggle_args_set_tooltip(args: *mut UiToggleArgs, tooltip: *const c_char); + fn ui_toggle_args_set_labeltype(args: *mut UiToggleArgs, ltype: c_int); + fn ui_toggle_args_set_onchange(args: *mut UiToggleArgs, callback: UiCallback); + fn ui_toggle_args_set_onchangedata(args: *mut UiToggleArgs, data: *mut c_void); + fn ui_toggle_args_set_varname(args: *mut UiToggleArgs, varname: *const c_char); + fn ui_toggle_args_set_value(args: *mut UiToggleArgs, ivalue: *mut UiInteger); + fn ui_toggle_args_set_enablestate(args: *mut UiToggleArgs, state: c_int); + fn ui_toggle_args_set_states(args: *mut UiToggleArgs, states: *const c_int, numstates: c_int); + fn ui_toggle_args_set_visibility_states(args: *mut UiToggleArgs, states: *const c_int, numstates: c_int); + fn ui_toggle_args_free(args: *mut UiToggleArgs); +} diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index 624291c..55d8b9b 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -100,3 +100,13 @@ pub struct UiLinkButtonArgs { _private: [u8; 0], } +#[repr(C)] +pub struct UiTextAreaArgs { + _private: [u8; 0], +} + +#[repr(C)] +pub struct UiTextFieldArgs { + _private: [u8; 0], +} + diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs index b6b6f5e..583875c 100644 --- a/ui-rs/src/ui/mod.rs +++ b/ui-rs/src/ui/mod.rs @@ -5,6 +5,7 @@ mod window; mod button; mod container; mod widget; +mod text; pub use toolkit::*; pub use application::*; diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs new file mode 100644 index 0000000..8cc5563 --- /dev/null +++ b/ui-rs/src/ui/text.rs @@ -0,0 +1,221 @@ +#![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::*; +use crate::ui::widget::widget_fn; + + +pub struct TextAreaBuilder { + args: *mut UiTextAreaArgs, + obj: *const UiObject +} + +impl toolkit::UiObject { + widget_fn!(textarea, textarea_builder, TextAreaBuilder); + + pub fn textarea_builder(&self) -> TextAreaBuilder { + unsafe { + let args = ui_textarea_args_new(); + TextAreaBuilder { args: args, obj: self.ptr } + } + } +} + +impl Drop for TextAreaBuilder { + fn drop(&mut self) { + unsafe { + ui_textarea_args_free(self.args); + } + } +} + +impl TextAreaBuilder { + pub fn create(&mut self) { + unsafe { + ui_textarea_create(self.obj, self.args); + } + } + + pub fn fill(&mut self, fill: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_fill(self.args, if fill { 1 } else { 0 }); + } + self + } + + pub fn hexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_hexpand(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn vexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_vexpand(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn hfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_hfill(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn vfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_vfill(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn override_defaults(&mut self, value: bool) -> &mut Self { + unsafe { + ui_textarea_args_set_override_defaults(self.args, if value { 1 } else { 0 }); + } + self + } + + pub fn margin(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_margin(self.args, value); + } + self + } + + pub fn margin_left(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_margin_left(self.args, value); + } + self + } + + pub fn margin_right(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_margin_right(self.args, value); + } + self + } + + pub fn margin_top(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_margin_top(self.args, value); + } + self + } + + pub fn margin_bottom(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_margin_bottom(self.args, value); + } + self + } + + pub fn colspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_colspan(self.args, value); + } + self + } + + pub fn rowspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_textarea_args_set_rowspan(self.args, value); + } + self + } + + pub fn name(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_textarea_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_textarea_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_textarea_args_set_varname(self.args, cstr.as_ptr()); + } + self + } + + pub fn value(&mut self, value: &toolkit::UiText) { + unsafe { + ui_textarea_args_set_value(self.args, value.ptr); + } + } + + // TODO: callback, states +} + + + +extern "C" { + fn ui_textarea_create(obj: *const UiObject, args: *const UiTextAreaArgs); + fn ui_textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs); + fn ui_frameless_textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs); + fn ui_passwordfield_create(obj: *const UiObject, args: *const UiTextFieldArgs); + + fn ui_textfield_args_new() -> *mut UiTextFieldArgs; + fn ui_textfield_args_set_fill(args: *mut UiTextFieldArgs, fill: c_int); + fn ui_textfield_args_set_hexpand(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_vexpand(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_hfill(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_vfill(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_override_defaults(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_margin(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_margin_left(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_margin_right(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_margin_top(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_margin_bottom(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_colspan(args: *mut UiTextFieldArgs, value: c_int); + fn ui_textfield_args_set_rowspan(args: *mut UiTextFieldArgs, value: c_int); + 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_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); + fn ui_textfield_args_set_visibility_states(args: *mut UiTextFieldArgs, states: *const c_int, numstates: c_int); + fn ui_textfield_args_free(args: *mut UiTextFieldArgs); + + fn ui_textarea_args_new() -> *mut UiTextAreaArgs; + fn ui_textarea_args_set_fill(args: *mut UiTextAreaArgs, fill: c_int); + fn ui_textarea_args_set_hexpand(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_vexpand(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_hfill(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_vfill(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_override_defaults(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_margin(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_margin_left(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_margin_right(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_margin_top(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_margin_bottom(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_colspan(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_rowspan(args: *mut UiTextAreaArgs, value: c_int); + fn ui_textarea_args_set_name(args: *mut UiTextAreaArgs, name: *const c_char); + fn ui_textarea_args_set_style_class(args: *mut UiTextAreaArgs, classname: *const c_char); + fn ui_textarea_args_set_onchange(args: *mut UiTextAreaArgs, callback: UiCallback); + fn ui_textarea_args_set_onchangedata(args: *mut UiTextAreaArgs, data: *mut c_void); + fn ui_textarea_args_set_varname(args: *mut UiTextAreaArgs, varname: *const c_char); + fn ui_textarea_args_set_value(args: *mut UiTextAreaArgs, ivalue: *mut UiText); + fn ui_textarea_args_set_states(args: *mut UiTextAreaArgs, states: *const c_int, numstates: c_int); + fn ui_textarea_args_set_visibility_states(args: *mut UiTextAreaArgs, states: *const c_int, numstates: c_int); + fn ui_textarea_args_free(args: *mut UiTextAreaArgs); +} \ No newline at end of file -- 2.47.3