gtk4/subclass/
color_chooser.rs
1use gdk::RGBA;
7use glib::translate::*;
8
9use crate::{ffi, prelude::*, subclass::prelude::*, ColorChooser, Orientation};
10
11#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
12#[allow(deprecated)]
13pub trait ColorChooserImpl: ObjectImpl + ObjectSubclass<Type: IsA<ColorChooser>> {
14 fn add_palette(&self, orientation: Orientation, colors_per_line: i32, colors: &[RGBA]) {
15 self.parent_add_palette(orientation, colors_per_line, colors);
16 }
17
18 fn color_activated(&self, rgba: RGBA) {
19 self.parent_color_activated(rgba);
20 }
21
22 #[doc(alias = "get_rgba")]
23 fn rgba(&self) -> RGBA;
24 fn set_rgba(&self, rgba: RGBA);
25}
26
27#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
28#[allow(deprecated)]
29pub trait ColorChooserImplExt: ColorChooserImpl {
30 fn parent_add_palette(&self, orientation: Orientation, colors_per_line: i32, colors: &[RGBA]) {
31 unsafe {
32 let type_data = Self::type_data();
33 let parent_iface = type_data.as_ref().parent_interface::<ColorChooser>()
34 as *const ffi::GtkColorChooserInterface;
35
36 if let Some(func) = (*parent_iface).add_palette {
37 let colors_ptr: Vec<gdk::ffi::GdkRGBA> =
38 colors.iter().map(|c| *c.to_glib_none().0).collect();
39
40 func(
41 self.obj()
42 .unsafe_cast_ref::<ColorChooser>()
43 .to_glib_none()
44 .0,
45 orientation.into_glib(),
46 colors_per_line,
47 colors.len() as i32,
48 mut_override(colors_ptr.as_ptr()),
49 )
50 }
51 }
52 }
53
54 fn parent_color_activated(&self, rgba: RGBA) {
55 unsafe {
56 let type_data = Self::type_data();
57 let parent_iface = type_data.as_ref().parent_interface::<ColorChooser>()
58 as *const ffi::GtkColorChooserInterface;
59
60 if let Some(func) = (*parent_iface).color_activated {
61 func(
62 self.obj()
63 .unsafe_cast_ref::<ColorChooser>()
64 .to_glib_none()
65 .0,
66 rgba.to_glib_none().0,
67 )
68 }
69 }
70 }
71
72 fn parent_rgba(&self) -> RGBA {
73 unsafe {
74 let type_data = Self::type_data();
75 let parent_iface = type_data.as_ref().parent_interface::<ColorChooser>()
76 as *const ffi::GtkColorChooserInterface;
77
78 let func = (*parent_iface)
79 .get_rgba
80 .expect("no parent \"get_rgba\" implementation");
81 let rgba = std::ptr::null_mut();
82 func(
83 self.obj()
84 .unsafe_cast_ref::<ColorChooser>()
85 .to_glib_none()
86 .0,
87 rgba,
88 );
89 from_glib_none(rgba)
90 }
91 }
92
93 fn parent_set_rgba(&self, rgba: RGBA) {
94 unsafe {
95 let type_data = Self::type_data();
96 let parent_iface = type_data.as_ref().parent_interface::<ColorChooser>()
97 as *const ffi::GtkColorChooserInterface;
98
99 if let Some(func) = (*parent_iface).set_rgba {
100 func(
101 self.obj()
102 .unsafe_cast_ref::<ColorChooser>()
103 .to_glib_none()
104 .0,
105 rgba.to_glib_none().0,
106 )
107 }
108 }
109 }
110}
111
112impl<T: ColorChooserImpl> ColorChooserImplExt for T {}
113
114unsafe impl<T: ColorChooserImpl> IsImplementable<T> for ColorChooser {
115 fn interface_init(iface: &mut glib::Interface<Self>) {
116 let iface = iface.as_mut();
117
118 assert_initialized_main_thread!();
119
120 iface.add_palette = Some(color_chooser_add_palette::<T>);
121 iface.color_activated = Some(color_chooser_color_activated::<T>);
122 iface.get_rgba = Some(color_chooser_get_rgba::<T>);
123 iface.set_rgba = Some(color_chooser_set_rgba::<T>);
124 }
125}
126
127unsafe extern "C" fn color_chooser_add_palette<T: ColorChooserImpl>(
128 color_chooser: *mut ffi::GtkColorChooser,
129 orientation: ffi::GtkOrientation,
130 colors_per_line: i32,
131 total: i32,
132 colorsptr: *mut gdk::ffi::GdkRGBA,
133) {
134 let instance = &*(color_chooser as *mut T::Instance);
135 let imp = instance.imp();
136
137 let colors = if total == 0 {
138 &[]
139 } else {
140 std::slice::from_raw_parts(colorsptr as *const RGBA, total as usize)
141 };
142 imp.add_palette(from_glib(orientation), colors_per_line, colors);
143}
144
145unsafe extern "C" fn color_chooser_color_activated<T: ColorChooserImpl>(
146 color_chooser: *mut ffi::GtkColorChooser,
147 rgba: *const gdk::ffi::GdkRGBA,
148) {
149 let instance = &*(color_chooser as *mut T::Instance);
150 let imp = instance.imp();
151
152 imp.color_activated(from_glib_none(rgba))
153}
154
155unsafe extern "C" fn color_chooser_get_rgba<T: ColorChooserImpl>(
156 color_chooser: *mut ffi::GtkColorChooser,
157 rgbaptr: *const gdk::ffi::GdkRGBA,
158) {
159 let instance = &*(color_chooser as *mut T::Instance);
160 let imp = instance.imp();
161
162 let rgba = imp.rgba();
163 *(rgbaptr as *mut gdk::ffi::GdkRGBA) = *rgba.to_glib_none().0;
164}
165
166unsafe extern "C" fn color_chooser_set_rgba<T: ColorChooserImpl>(
167 color_chooser: *mut ffi::GtkColorChooser,
168 rgba: *const gdk::ffi::GdkRGBA,
169) {
170 let instance = &*(color_chooser as *mut T::Instance);
171 let imp = instance.imp();
172
173 imp.set_rgba(from_glib_none(rgba))
174}