gtk4/subclass/
color_chooser.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for implementing the [`ColorChooser`] interface.
5
6use 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}