From: Olaf Wintermann Date: Mon, 4 May 2026 19:30:52 +0000 (+0200) Subject: add linkbutton X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=17857c937607565e4735d646c931e61c50b51818;p=note.git add linkbutton --- diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index f7352f2..c4795e1 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -44,6 +44,10 @@ pub struct ToggleButton { ptr: *mut c_void } +pub struct LinkButton { + ptr: *mut c_void +} + impl Widget for Button { fn get_widget(&self) -> *mut c_void { self.ptr @@ -56,6 +60,12 @@ impl Widget for ToggleButton { } } +impl Widget for LinkButton { + fn get_widget(&self) -> *mut c_void { + self.ptr + } +} + pub struct ButtonBuilder<'a, T> { args: *mut UiButtonArgs, @@ -68,6 +78,11 @@ pub struct ToggleBuilder<'a, T> { create: ToggleButtonCreate } +pub struct LinkButtonBuilder<'a, T> { + args: *mut UiLinkButtonArgs, + obj: &'a mut toolkit::UiObject, +} + pub enum LabelType { Default = 0, Text = 1, @@ -75,6 +90,11 @@ pub enum LabelType { TextIcon = 3, } +pub enum LinkButtonType { + Text = 0, + Button = 1 +} + pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs) -> *mut c_void; impl toolkit::UiObject { @@ -162,6 +182,14 @@ impl<'a, T> Drop for ToggleBuilder<'a, T> { } } +impl<'a, T> Drop for LinkButtonBuilder<'a, T> { + fn drop(&mut self) { + unsafe { + ui_linkbutton_args_free(self.args); + } + } +} + impl<'a, T> ButtonBuilder<'a, T> { pub fn create(&mut self) -> Button { unsafe { @@ -534,6 +562,210 @@ impl<'a, T> ToggleBuilder<'a, T> { } } +impl<'a, T> LinkButtonBuilder<'a, T> { + pub fn create(&mut self) -> LinkButton { + unsafe { + LinkButton { ptr: ui_linkbutton_create(self.obj.ptr, self.args) } + } + } + + pub fn fill(&mut self, fill: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_fill(self.args, if fill { 1 } else { 0 }); + } + self + } + + pub fn hexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_hexpand(self.args, value as c_int); + } + self + } + + pub fn vexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_vexpand(self.args, value as c_int); + } + self + } + + pub fn hfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_hfill(self.args, value as c_int); + } + self + } + + pub fn vfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_vfill(self.args, value as c_int); + } + self + } + + pub fn override_defaults(&mut self, value: bool) -> &mut Self { + unsafe { + ui_linkbutton_args_set_override_defaults(self.args, value as c_int); + } + self + } + + pub fn margin(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_margin(self.args, value); + } + self + } + + pub fn margin_left(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_margin_left(self.args, value); + } + self + } + + pub fn margin_right(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_margin_right(self.args, value); + } + self + } + + pub fn margin_top(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_margin_top(self.args, value); + } + self + } + + pub fn margin_bottom(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_margin_bottom(self.args, value); + } + self + } + + pub fn colspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_colspan(self.args, value); + } + self + } + + pub fn rowspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_linkbutton_args_set_rowspan(self.args, value); + } + self + } + + pub fn name(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_linkbutton_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_linkbutton_args_set_style_class(self.args, cstr.as_ptr()); + } + self + } + + pub fn label(&mut self, label: &str) -> &mut Self { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_linkbutton_args_set_label(self.args, cstr.as_ptr()); + } + self + } + + pub fn uri(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_linkbutton_args_set_uri(self.args, cstr.as_ptr()); + } + self + } + + pub fn button_type(&mut self, t: LinkButtonType) -> &mut Self { + unsafe { + ui_linkbutton_args_set_type(self.args, t as c_int); + } + self + } + + pub fn varname(&mut self, varname: &str) -> &mut Self { + let cstr = CString::new(varname).unwrap(); + unsafe { + ui_linkbutton_args_set_varname(self.args, cstr.as_ptr()); + } + self + } + + pub fn value(&mut self, value: &toolkit::UiString) { + unsafe { + ui_linkbutton_args_set_value(self.args, value.ptr); + } + } + + pub fn onclick(&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.ctx.reg_box(wrapper); + unsafe { + ui_linkbutton_args_set_onclick(self.args, Some(event::event_wrapper::)); + ui_linkbutton_args_set_onclickdata(self.args, ptr as *mut c_void); + } + self + } + + pub fn action(&mut self, action: &str) -> &mut Self { + let cstr = CString::new(action).unwrap(); + unsafe { + ui_linkbutton_args_set_action(self.args, cstr.as_ptr()); + } + self + } + + pub fn visibility_states(&mut self, states: &[i32]) -> &mut Self { + unsafe { + ui_linkbutton_args_set_visibility_states(self.args, states.as_ptr(), states.len() as c_int); + } + self + } + + pub fn states(&mut self, states: &[i32]) -> &mut Self { + unsafe { + ui_linkbutton_args_set_states(self.args, states.as_ptr(), states.len() as c_int); + } + self + } +} + +pub fn link_set_label(value: &toolkit::UiString, label: &str) { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_linkbutton_value_set_label(value.ptr, cstr.as_ptr()); + } +} + +pub fn link_set_uri(value: &toolkit::UiString, label: &str) { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_linkbutton_value_set_uri(value.ptr, cstr.as_ptr()); + } +} + +pub fn link_set_visited(value: &toolkit::UiString, visited: bool) { + unsafe { + ui_linkbutton_value_set_visited(value.ptr, visited as c_int); + } +} extern "C" { fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs) -> *mut c_void; @@ -599,4 +831,40 @@ extern "C" { 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); + + fn ui_linkbutton_args_new() -> *mut UiLinkButtonArgs; + fn ui_linkbutton_args_set_fill(args: *mut UiLinkButtonArgs, fill: c_int); + fn ui_linkbutton_args_set_hexpand(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_vexpand(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_hfill(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_vfill(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_override_defaults(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_margin(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_margin_left(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_margin_right(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_margin_top(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_margin_bottom(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_colspan(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_rowspan(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_name(args: *mut UiLinkButtonArgs, name: *const c_char); + fn ui_linkbutton_args_set_style_class(args: *mut UiLinkButtonArgs, classname: *const c_char); + fn ui_linkbutton_args_set_onclick(args: *mut UiLinkButtonArgs, callback: UiCallback); + fn ui_linkbutton_args_set_onclickdata(args: *mut UiLinkButtonArgs, data: *mut c_void); + fn ui_linkbutton_args_set_action(args: *mut UiLinkButtonArgs, action: *const c_char); + fn ui_linkbutton_args_set_varname(args: *mut UiLinkButtonArgs, varname: *const c_char); + fn ui_linkbutton_args_set_value(args: *mut UiLinkButtonArgs, ivalue: *mut UiString); + fn ui_linkbutton_args_set_label(args: *mut UiLinkButtonArgs, label: *const c_char); + fn ui_linkbutton_args_set_uri(args: *mut UiLinkButtonArgs, uri: *const c_char); + fn ui_linkbutton_args_set_type(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_nofollow(args: *mut UiLinkButtonArgs, value: c_int); + fn ui_linkbutton_args_set_enablestate(args: *mut UiLinkButtonArgs, state: c_int); + fn ui_linkbutton_args_set_states(args: *mut UiLinkButtonArgs, states: *const c_int, numstates: c_int); + fn ui_linkbutton_args_set_visibility_states(args: *mut UiLinkButtonArgs, states: *const c_int, numstates: c_int); + fn ui_linkbutton_args_free(args: *mut UiLinkButtonArgs); + + fn ui_linkbutton_value_set(str: *mut UiString, label: *const c_char, uri: *const c_char); + fn ui_linkbutton_value_set_label(str: *mut UiString, label: *const c_char); + fn ui_linkbutton_value_set_uri(str: *mut UiString, uri: *const c_char); + fn ui_linkbutton_value_set_visited(str: *mut UiString, visited: c_int); + }