1use crate::{ffi, Buildable, SizeGroupMode, Widget};
6use glib::{
7 prelude::*,
8 signal::{connect_raw, SignalHandlerId},
9 translate::*,
10};
11use std::boxed::Box as Box_;
12
13glib::wrapper! {
14 #[doc(alias = "GtkSizeGroup")]
15 pub struct SizeGroup(Object<ffi::GtkSizeGroup>) @implements Buildable;
16
17 match fn {
18 type_ => || ffi::gtk_size_group_get_type(),
19 }
20}
21
22impl SizeGroup {
23 #[doc(alias = "gtk_size_group_new")]
24 pub fn new(mode: SizeGroupMode) -> SizeGroup {
25 assert_initialized_main_thread!();
26 unsafe { from_glib_full(ffi::gtk_size_group_new(mode.into_glib())) }
27 }
28
29 #[doc(alias = "gtk_size_group_add_widget")]
30 pub fn add_widget(&self, widget: &impl IsA<Widget>) {
31 unsafe {
32 ffi::gtk_size_group_add_widget(self.to_glib_none().0, widget.as_ref().to_glib_none().0);
33 }
34 }
35
36 #[doc(alias = "gtk_size_group_get_mode")]
37 #[doc(alias = "get_mode")]
38 pub fn mode(&self) -> SizeGroupMode {
39 unsafe { from_glib(ffi::gtk_size_group_get_mode(self.to_glib_none().0)) }
40 }
41
42 #[doc(alias = "gtk_size_group_get_widgets")]
43 #[doc(alias = "get_widgets")]
44 pub fn widgets(&self) -> Vec<Widget> {
45 unsafe {
46 FromGlibPtrContainer::from_glib_none(ffi::gtk_size_group_get_widgets(
47 self.to_glib_none().0,
48 ))
49 }
50 }
51
52 #[doc(alias = "gtk_size_group_remove_widget")]
53 pub fn remove_widget(&self, widget: &impl IsA<Widget>) {
54 unsafe {
55 ffi::gtk_size_group_remove_widget(
56 self.to_glib_none().0,
57 widget.as_ref().to_glib_none().0,
58 );
59 }
60 }
61
62 #[doc(alias = "gtk_size_group_set_mode")]
63 #[doc(alias = "mode")]
64 pub fn set_mode(&self, mode: SizeGroupMode) {
65 unsafe {
66 ffi::gtk_size_group_set_mode(self.to_glib_none().0, mode.into_glib());
67 }
68 }
69
70 #[doc(alias = "mode")]
71 pub fn connect_mode_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
72 unsafe extern "C" fn notify_mode_trampoline<F: Fn(&SizeGroup) + 'static>(
73 this: *mut ffi::GtkSizeGroup,
74 _param_spec: glib::ffi::gpointer,
75 f: glib::ffi::gpointer,
76 ) {
77 let f: &F = &*(f as *const F);
78 f(&from_glib_borrow(this))
79 }
80 unsafe {
81 let f: Box_<F> = Box_::new(f);
82 connect_raw(
83 self.as_ptr() as *mut _,
84 c"notify::mode".as_ptr() as *const _,
85 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
86 notify_mode_trampoline::<F> as *const (),
87 )),
88 Box_::into_raw(f),
89 )
90 }
91 }
92}