From d298e56602a94b8354013348ec229769350830d5 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Tue, 1 Sep 2026 20:00:44 +0200 Subject: [PATCH] add headerbar Rust wrapper --- ui-rs/src/ui/container.rs | 252 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs index 3ffab19..f2b8cb0 100644 --- a/ui-rs/src/ui/container.rs +++ b/ui-rs/src/ui/container.rs @@ -237,6 +237,12 @@ pub enum TabViewType { Invisible = 5 } +pub enum HeaderbarAlternative { + Default = 0, + Toolbar = 1, + Box = 2 +} + /* -------------------------------- Box/Grid Container -------------------------------- */ @@ -954,6 +960,226 @@ impl<'a, T> Drop for SplitPaneBuilder<'a, T> { } +/* -------------------------------- Headerbar -------------------------------- */ + + +pub struct HeaderbarBuilder<'a, T> { + args: *mut UiHeaderbarArgs, + obj: &'a mut toolkit::UiObject, +} + +pub struct Headerbar<'a, T> { + obj: &'a mut toolkit::UiObject, +} + + +impl toolkit::UiObject { + pub fn headerbar(&mut self) -> HeaderbarBuilder<'_, T> + { + unsafe { + let args = ui_headerbar_args_new(); + HeaderbarBuilder { + args, + obj: self, + } + } + } +} + +impl<'a, T> HeaderbarBuilder<'a, T> { + pub fn create(&mut self, create_ui: F) -> Container + where F: FnOnce(&mut Headerbar) { + unsafe { + let w = ui_headerbar_create(self.obj.ptr, self.args); + let mut headerbar = Headerbar { + obj: self.obj + }; + create_ui(&mut headerbar); + ui_container_begin_close(self.obj.ptr); + ui_container_finish(self.obj.ptr); + Container { + ptr: w + } + } + } + + pub fn fill(&mut self, fill: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_fill(self.args, fill as c_int); + } + self + } + + pub fn hexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_hexpand(self.args, value as c_int); + } + self + } + + pub fn vexpand(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_vexpand(self.args, value as c_int); + } + self + } + + pub fn hfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_hfill(self.args, value as c_int); + } + self + } + + pub fn vfill(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_vfill(self.args, value as c_int); + } + self + } + + pub fn override_defaults(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_override_defaults(self.args, value as c_int); + } + self + } + + pub fn margin(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_margin(self.args, value); + } + self + } + + pub fn margin_left(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_margin_left(self.args, value); + } + self + } + + pub fn margin_right(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_margin_right(self.args, value); + } + self + } + + pub fn margin_top(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_margin_top(self.args, value); + } + self + } + + pub fn margin_bottom(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_margin_bottom(self.args, value); + } + self + } + + pub fn colspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_colspan(self.args, value); + } + self + } + + pub fn rowspan(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_rowspan(self.args, value); + } + self + } + + pub fn name(&mut self, value: &str) -> &mut Self { + let cstr = CString::new(value).unwrap(); + unsafe { + ui_headerbar_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_headerbar_args_set_style_class(self.args, cstr.as_ptr()); + } + self + } + + pub fn show_title(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_showtitle(self.args, value as c_int); + } + self + } + + pub fn show_window_buttons(&mut self, value: bool) -> &mut Self { + unsafe { + ui_headerbar_args_set_showwindowbuttons(self.args, value as c_int); + } + self + } + + pub fn alternative(&mut self, alt: HeaderbarAlternative) -> &mut Self { + unsafe { + ui_headerbar_args_set_alternative(self.args, alt as c_int); + } + self + } + + pub fn alt_spacing(&mut self, value: i32) -> &mut Self { + unsafe { + ui_headerbar_args_set_alt_spacing(self.args, value as c_int); + } + self + } +} + +impl<'a, T> Drop for HeaderbarBuilder<'a, T> { + fn drop(&mut self) { + unsafe { + ui_headerbar_args_free(self.args); + } + } +} + +impl<'a, T> Headerbar<'a, T> { + pub fn start(&mut self, create_ui: F) + where F: FnOnce(&mut toolkit::UiObject) { + unsafe { + ui_headerbar_start_create(self.obj.ptr); + create_ui(&mut self.obj); + ui_container_begin_close(self.obj.ptr); + ui_container_finish(self.obj.ptr); + } + } + + pub fn center(&mut self, create_ui: F) + where F: FnOnce(&mut toolkit::UiObject) { + unsafe { + ui_headerbar_center_create(self.obj.ptr); + create_ui(&mut self.obj); + ui_container_begin_close(self.obj.ptr); + ui_container_finish(self.obj.ptr); + } + } + + pub fn end(&mut self, create_ui: F) + where F: FnOnce(&mut toolkit::UiObject) { + unsafe { + ui_headerbar_end_create(self.obj.ptr); + create_ui(&mut self.obj); + ui_container_begin_close(self.obj.ptr); + ui_container_finish(self.obj.ptr); + } + } +} + + /* -------------------------------- Sidebar -------------------------------- */ @@ -1585,6 +1811,10 @@ unsafe extern "C" { fn ui_scrolledwindow_create(obj: *mut UiObject, args: *const UiFrameArgs) -> *mut c_void; fn ui_hsplitpane_create(obj: *mut UiObject, args: *const UiSplitPaneArgs) -> *mut c_void; fn ui_vsplitpane_create(obj: *mut UiObject, args: *const UiSplitPaneArgs) -> *mut c_void; + fn ui_headerbar_create(obj: *mut UiObject, args: *const UiHeaderbarArgs) -> *mut c_void; + fn ui_headerbar_start_create(obj: *mut UiObject); + fn ui_headerbar_center_create(obj: *mut UiObject); + fn ui_headerbar_end_create(obj: *mut UiObject); fn ui_sidebar_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void; fn ui_left_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void; fn ui_right_panel_create(obj: *mut UiObject, args: *const UiSidebarArgs) -> *mut c_void; @@ -1669,6 +1899,28 @@ unsafe extern "C" { fn ui_splitpane_args_set_visibility_states(args: *mut UiSplitPaneArgs, states: *const c_int, numstates: c_int); fn ui_splitpane_args_free(args: *mut UiSplitPaneArgs); + fn ui_headerbar_args_new() -> *mut UiHeaderbarArgs; + fn ui_headerbar_args_set_fill(args: *mut UiHeaderbarArgs, fill: c_int); + fn ui_headerbar_args_set_hexpand(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_vexpand(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_hfill(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_vfill(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_override_defaults(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_margin(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_margin_left(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_margin_right(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_margin_top(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_margin_bottom(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_colspan(args: *mut UiHeaderbarArgs, colspan: c_int); + fn ui_headerbar_args_set_rowspan(args: *mut UiHeaderbarArgs, rowspan: c_int); + fn ui_headerbar_args_set_name(args: *mut UiHeaderbarArgs, name: *const c_char); + fn ui_headerbar_args_set_style_class(args: *mut UiHeaderbarArgs, classname: *const c_char); + fn ui_headerbar_args_set_showtitle(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_showwindowbuttons(args: *mut UiHeaderbarArgs, value: c_int); + fn ui_headerbar_args_set_alternative(args: *mut UiHeaderbarArgs, alt: c_int); + fn ui_headerbar_args_set_alt_spacing(args: *mut UiHeaderbarArgs, spacing: c_int); + fn ui_headerbar_args_free(args: *mut UiHeaderbarArgs); + fn ui_sidebar_args_new() -> *mut UiSidebarArgs; fn ui_sidebar_args_set_margin(args: *mut UiSidebarArgs, value: c_int); -- 2.52.0