From: Olaf Wintermann Date: Tue, 8 Sep 2026 15:01:16 +0000 (+0200) Subject: add content_togglebutton X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fmain;p=note.git add content_togglebutton --- diff --git a/application/note/src/attachments_window.rs b/application/note/src/attachments_window.rs index 88ca092..1ed5a93 100644 --- a/application/note/src/attachments_window.rs +++ b/application/note/src/attachments_window.rs @@ -28,7 +28,7 @@ use std::path::Path; use backend::backend::BackendHandle; use ui_rs::ui::*; -use ui_rs::{action, button, imageviewer, tabview, togglebutton, ui_actions, webview, UiModel}; +use ui_rs::{action, button, content_togglebutton, imageviewer, tabview, ui_actions, webview, UiModel}; pub fn attachments_window_create(backend: BackendHandle, note_id: i32, selected_attachment: Option) { let mut data = AttachmentsWindow::new(backend, note_id); @@ -44,8 +44,7 @@ pub fn attachments_window_create(backend: BackendHandle, note_id: i32, selected_ button!(obj, icon = UiIconSet::SaveLocal.as_str(), action = "save_as"); }); hb.end(|obj|{ - togglebutton!(obj, icon = UiIconSet::ViewFullscreen.as_str(), action = "view_fullscreen"); - + content_togglebutton!(obj, icon0 = UiIconSet::ViewFullscreen.as_str(), icon1 = UiIconSet::ViewRestore.as_str(), action = "view_fullscreen"); }); }); diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index 5373595..02147da 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -71,6 +71,13 @@ macro_rules! radiobutton { }; } +#[macro_export] +macro_rules! content_togglebutton { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, content_togglebutton, $($tt)*) + }; +} + #[macro_export] macro_rules! linkbutton { ($parent:expr, $($tt:tt)*) => { @@ -121,6 +128,11 @@ pub struct ToggleBuilder<'a, T> { create: ToggleButtonCreate } +pub struct ContentToggleBuilder<'a, T> { + args: *mut UiContentToggleArgs, + obj: &'a mut toolkit::UiObject, +} + pub struct LinkButtonBuilder<'a, T> { args: *mut UiLinkButtonArgs, obj: &'a mut toolkit::UiObject, @@ -178,6 +190,13 @@ impl toolkit::UiObject { } } + pub fn content_togglebutton<'a>(&'a mut self) -> ContentToggleBuilder<'a, T> { + unsafe { + let args = ui_content_toggle_args_new(); + ContentToggleBuilder { args: args, obj: self } + } + } + pub fn linkbutton<'a>(&'a mut self) -> LinkButtonBuilder<'a, T> { unsafe { let args = ui_linkbutton_args_new(); @@ -610,6 +629,226 @@ impl<'a, T> ToggleBuilder<'a, T> { } } +impl<'a, T> ContentToggleBuilder<'a, T> { + pub fn create(&mut self) -> Button { + unsafe { + Button { ptr: ui_content_togglebutton_create(self.obj.ptr, self.args) } + } + } + + pub fn fill(&mut self, fill: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_fill(self.args, fill as c_int); + } + self + } + + pub fn hexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_hexpand(self.args, value as c_int); + } + self + } + + pub fn vexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_vexpand(self.args, value as c_int); + } + self + } + + pub fn hfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_hfill(self.args, value as c_int); + } + self + } + + pub fn vfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_vfill(self.args, value as c_int); + } + self + } + + pub fn override_defaults(&mut self, value: bool) -> &mut Self { + unsafe { + ui_content_toggle_args_set_override_defaults(self.args, value as c_int); + } + self + } + + pub fn margin(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_margin(self.args, value); + } + self + } + + pub fn margin_left(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_margin_left(self.args, value); + } + self + } + + pub fn margin_right(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_margin_right(self.args, value); + } + self + } + + pub fn margin_top(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_margin_top(self.args, value); + } + self + } + + pub fn margin_bottom(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_margin_bottom(self.args, value); + } + self + } + + pub fn colspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_colspan(self.args, value); + } + self + } + + pub fn rowspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_content_toggle_args_set_rowspan(self.args, value); + } + self + } + + pub fn name(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_content_toggle_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_content_toggle_args_set_style_class(self.args, cstr.as_ptr()); + } + self + } + + pub fn label0(&mut self, label: &str) -> &mut Self { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_content_toggle_args_set_label0(self.args, cstr.as_ptr()); + } + self + } + + pub fn icon0(&mut self, icon: &str) -> &mut Self { + let cstr = CString::new(icon).unwrap(); + unsafe { + ui_content_toggle_args_set_icon0(self.args, cstr.as_ptr()); + } + self + } + + pub fn tooltip0(&mut self, tooltip: &str) -> &mut Self { + let cstr = CString::new(tooltip).unwrap(); + unsafe { + ui_content_toggle_args_set_tooltip0(self.args, cstr.as_ptr()); + } + self + } + + pub fn label1(&mut self, label: &str) -> &mut Self { + let cstr = CString::new(label).unwrap(); + unsafe { + ui_content_toggle_args_set_label1(self.args, cstr.as_ptr()); + } + self + } + + pub fn icon1(&mut self, icon: &str) -> &mut Self { + let cstr = CString::new(icon).unwrap(); + unsafe { + ui_content_toggle_args_set_icon1(self.args, cstr.as_ptr()); + } + self + } + + pub fn tooltip1(&mut self, tooltip: &str) -> &mut Self { + let cstr = CString::new(tooltip).unwrap(); + unsafe { + ui_content_toggle_args_set_tooltip1(self.args, cstr.as_ptr()); + } + self + } + + pub fn labeltype(&mut self, ltype: LabelType) -> &mut Self { + let lt = ltype as i32; + unsafe { + ui_content_toggle_args_set_labeltype(self.args, lt); + } + self + } + + pub fn varname(&mut self, varname: &str) -> &mut Self { + let cstr = CString::new(varname).unwrap(); + unsafe { + ui_content_toggle_args_set_varname(self.args, cstr.as_ptr()); + } + self + } + + pub fn value(&mut self, value: &toolkit::UiInteger) { + unsafe { + ui_content_toggle_args_set_value(self.args, value.ptr); + } + } + + pub fn onchange(&mut self, f: F) -> &mut Self + where F: FnMut(&mut event::Event) + 'static { + let wrapper = Box::new(EventWrapper::new(f) ); + let ptr = self.obj.ctx.reg_box(wrapper); + unsafe { + ui_content_toggle_args_set_onchange(self.args, Some(event::event_wrapper::)); + ui_content_toggle_args_set_onchangedata(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_content_toggle_args_set_action(self.args, cstr.as_ptr()); + } + self + } + + pub fn visibility_states>(&mut self, states: &[S]) -> &mut Self { + let states: Vec = states.iter().copied().map(Into::into).collect(); + unsafe { + ui_content_toggle_args_set_visibility_states(self.args, states.as_ptr(), states.len() as c_int); + } + self + } + + pub fn states>(&mut self, states: &[S]) -> &mut Self { + let states: Vec = states.iter().copied().map(Into::into).collect(); + unsafe { + ui_content_toggle_args_set_states(self.args, states.as_ptr(), states.len() as c_int); + } + self + } +} + impl<'a, T> LinkButtonBuilder<'a, T> { pub fn create(&mut self) -> LinkButton { unsafe { @@ -878,6 +1117,7 @@ unsafe extern "C" { fn ui_switch_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void; fn ui_radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void; fn ui_linkbutton_create(obj: *const UiObject, args: *const UiLinkButtonArgs) -> *mut c_void; + fn ui_content_togglebutton_create(obj: *const UiObject, args: *const UiContentToggleArgs) -> *mut c_void; fn ui_button_args_new() -> *mut UiButtonArgs; fn ui_button_args_set_fill(args: *mut UiButtonArgs, fill: c_int); @@ -936,6 +1176,39 @@ unsafe extern "C" { 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_content_toggle_args_new() -> *mut UiContentToggleArgs; + fn ui_content_toggle_args_set_fill(args: *mut UiContentToggleArgs, fill: c_int); + fn ui_content_toggle_args_set_hexpand(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_vexpand(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_hfill(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_vfill(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_override_defaults(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_margin(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_margin_left(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_margin_right(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_margin_top(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_margin_bottom(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_colspan(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_rowspan(args: *mut UiContentToggleArgs, value: c_int); + fn ui_content_toggle_args_set_name(args: *mut UiContentToggleArgs, name: *const c_char); + fn ui_content_toggle_args_set_style_class(args: *mut UiContentToggleArgs, classname: *const c_char); + fn ui_content_toggle_args_set_label0(args: *mut UiContentToggleArgs, label: *const c_char); + fn ui_content_toggle_args_set_icon0(args: *mut UiContentToggleArgs, icon: *const c_char); + fn ui_content_toggle_args_set_tooltip0(args: *mut UiContentToggleArgs, tooltip: *const c_char); + fn ui_content_toggle_args_set_label1(args: *mut UiContentToggleArgs, label: *const c_char); + fn ui_content_toggle_args_set_icon1(args: *mut UiContentToggleArgs, icon: *const c_char); + fn ui_content_toggle_args_set_tooltip1(args: *mut UiContentToggleArgs, tooltip: *const c_char); + fn ui_content_toggle_args_set_labeltype(args: *mut UiContentToggleArgs, ltype: c_int); + fn ui_content_toggle_args_set_onchange(args: *mut UiContentToggleArgs, callback: UiCallback); + fn ui_content_toggle_args_set_onchangedata(args: *mut UiContentToggleArgs, data: *mut c_void); + fn ui_content_toggle_args_set_action(args: *mut UiContentToggleArgs, action: *const c_char); + fn ui_content_toggle_args_set_varname(args: *mut UiContentToggleArgs, varname: *const c_char); + fn ui_content_toggle_args_set_value(args: *mut UiContentToggleArgs, ivalue: *mut UiInteger); + fn ui_content_toggle_args_set_enablestate(args: *mut UiContentToggleArgs, state: c_int); + fn ui_content_toggle_args_set_states(args: *mut UiContentToggleArgs, states: *const c_int, numstates: c_int); + fn ui_content_toggle_args_set_visibility_states(args: *mut UiContentToggleArgs, states: *const c_int, numstates: c_int); + fn ui_content_toggle_args_free(args: *mut UiContentToggleArgs); + 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); diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index d97c15d..522c056 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -167,6 +167,10 @@ pub struct UiToggleArgs { _private: [u8; 0], } +#[repr(C)] +pub struct UiContentToggleArgs { + _private: [u8; 0], +} #[repr(C)] pub struct UiLinkButtonArgs { _private: [u8; 0],