]> uap-core.de Git - note.git/commitdiff
add content_togglebutton main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 8 Sep 2026 15:01:16 +0000 (17:01 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 8 Sep 2026 15:01:16 +0000 (17:01 +0200)
application/note/src/attachments_window.rs
ui-rs/src/ui/button.rs
ui-rs/src/ui/ffi.rs

index 88ca092748ff9c4bfc0799df6bb505ebf4238811..1ed5a93912625096f36cb62bb4c3624758c715d3 100644 (file)
@@ -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<i32>) {
     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");
             });
         });
 
index 5373595cb17ea3e3db1572dddcc6e49e6a573ece..02147da8877214c37251b55c3b5f38dc6417a6fa 100644 (file)
@@ -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<T>,
+}
+
 pub struct LinkButtonBuilder<'a, T> {
     args: *mut UiLinkButtonArgs,
     obj: &'a mut toolkit::UiObject<T>,
@@ -178,6 +190,13 @@ impl<T> toolkit::UiObject<T> {
         }
     }
 
+    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<F>(&mut self, f: F) -> &mut Self
+    where F: FnMut(&mut event::Event<T>) + '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::<T>));
+            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<S: Copy + Into<i32>>(&mut self, states: &[S]) -> &mut Self {
+        let states: Vec<i32> = 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<S: Copy + Into<i32>>(&mut self, states: &[S]) -> &mut Self {
+        let states: Vec<i32> = 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);
index d97c15db5646342df28bf9149015a38fdcbf9646..522c056227b499f6b638a1958ae3913e398b1afa 100644 (file)
@@ -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],