]> uap-core.de Git - note.git/commitdiff
add linkbutton
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 4 May 2026 19:30:52 +0000 (21:30 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 4 May 2026 19:30:52 +0000 (21:30 +0200)
ui-rs/src/ui/button.rs

index f7352f239495c4c3838660f931a2ff36d0022951..c4795e14c9a42e21d7af730489cac934513219db 100644 (file)
@@ -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<T>,
+}
+
 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<T> toolkit::UiObject<T> {
@@ -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<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.ctx.reg_box(wrapper);
+        unsafe {
+            ui_linkbutton_args_set_onclick(self.args, Some(event::event_wrapper::<T>));
+            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);
+
 }