Skip to main content

gtk/
response_type.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use crate::ffi;
4use glib::translate::{FromGlib, IntoGlib, ToGlibPtr, ToGlibPtrMut, from_glib};
5use glib::value::{FromValue, ToValue, ValueType};
6use glib::{Type, types::StaticType};
7use std::fmt;
8
9/// Predefined values for use as response ids in [`DialogExt::add_button()`][crate::prelude::DialogExt::add_button()].
10/// All predefined values are negative; GTK+ leaves values of 0 or greater for
11/// application-defined response ids.
12#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13#[doc(alias = "GtkResponseType")]
14pub enum ResponseType {
15    /// Returned if an action widget has no response id,
16    ///  or if the dialog gets programmatically hidden or destroyed
17    #[doc(alias = "GTK_RESPONSE_NONE")]
18    None,
19    /// Generic response id, not used by GTK+ dialogs
20    #[doc(alias = "GTK_RESPONSE_REJECT")]
21    Reject,
22    /// Generic response id, not used by GTK+ dialogs
23    #[doc(alias = "GTK_RESPONSE_ACCEPT")]
24    Accept,
25    /// Returned if the dialog is deleted
26    #[doc(alias = "GTK_RESPONSE_DELETE_EVENT")]
27    DeleteEvent,
28    /// Returned by OK buttons in GTK+ dialogs
29    #[doc(alias = "GTK_RESPONSE_OK")]
30    Ok,
31    /// Returned by Cancel buttons in GTK+ dialogs
32    #[doc(alias = "GTK_RESPONSE_CANCEL")]
33    Cancel,
34    /// Returned by Close buttons in GTK+ dialogs
35    #[doc(alias = "GTK_RESPONSE_CLOSE")]
36    Close,
37    /// Returned by Yes buttons in GTK+ dialogs
38    #[doc(alias = "GTK_RESPONSE_YES")]
39    Yes,
40    /// Returned by No buttons in GTK+ dialogs
41    #[doc(alias = "GTK_RESPONSE_NO")]
42    No,
43    /// Returned by Apply buttons in GTK+ dialogs
44    #[doc(alias = "GTK_RESPONSE_APPLY")]
45    Apply,
46    /// Returned by Help buttons in GTK+ dialogs
47    #[doc(alias = "GTK_RESPONSE_HELP")]
48    Help,
49    Other(u16),
50    #[doc(hidden)]
51    __Unknown(i32),
52}
53
54#[doc(hidden)]
55impl IntoGlib for ResponseType {
56    type GlibType = ffi::GtkResponseType;
57
58    fn into_glib(self) -> ffi::GtkResponseType {
59        match self {
60            Self::None => ffi::GTK_RESPONSE_NONE,
61            Self::Reject => ffi::GTK_RESPONSE_REJECT,
62            Self::Accept => ffi::GTK_RESPONSE_ACCEPT,
63            Self::DeleteEvent => ffi::GTK_RESPONSE_DELETE_EVENT,
64            Self::Ok => ffi::GTK_RESPONSE_OK,
65            Self::Cancel => ffi::GTK_RESPONSE_CANCEL,
66            Self::Close => ffi::GTK_RESPONSE_CLOSE,
67            Self::Yes => ffi::GTK_RESPONSE_YES,
68            Self::No => ffi::GTK_RESPONSE_NO,
69            Self::Apply => ffi::GTK_RESPONSE_APPLY,
70            Self::Help => ffi::GTK_RESPONSE_HELP,
71            Self::Other(value) => value as ffi::GtkResponseType,
72            Self::__Unknown(value) => value,
73        }
74    }
75}
76
77#[doc(hidden)]
78impl FromGlib<ffi::GtkResponseType> for ResponseType {
79    unsafe fn from_glib(value: ffi::GtkResponseType) -> Self {
80        skip_assert_initialized!();
81        match value {
82            ffi::GTK_RESPONSE_NONE => Self::None,
83            ffi::GTK_RESPONSE_REJECT => Self::Reject,
84            ffi::GTK_RESPONSE_ACCEPT => Self::Accept,
85            ffi::GTK_RESPONSE_DELETE_EVENT => Self::DeleteEvent,
86            ffi::GTK_RESPONSE_OK => Self::Ok,
87            ffi::GTK_RESPONSE_CANCEL => Self::Cancel,
88            ffi::GTK_RESPONSE_CLOSE => Self::Close,
89            ffi::GTK_RESPONSE_YES => Self::Yes,
90            ffi::GTK_RESPONSE_NO => Self::No,
91            ffi::GTK_RESPONSE_APPLY => Self::Apply,
92            ffi::GTK_RESPONSE_HELP => Self::Help,
93            value if value >= 0 && value <= u16::MAX as i32 => Self::Other(value as u16),
94            value => Self::__Unknown(value),
95        }
96    }
97}
98
99impl fmt::Display for ResponseType {
100    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
101        write!(
102            f,
103            "Self::{}",
104            match *self {
105                Self::None => "None",
106                Self::Reject => "Reject",
107                Self::Accept => "Accept",
108                Self::DeleteEvent => "DeleteEvent",
109                Self::Ok => "Ok",
110                Self::Cancel => "Cancel",
111                Self::Close => "Close",
112                Self::Yes => "Yes",
113                Self::No => "No",
114                Self::Apply => "Apply",
115                Self::Help => "Help",
116                Self::Other(_) => "Other",
117                Self::__Unknown(_) => "Unknown",
118            }
119        )
120    }
121}
122
123impl StaticType for ResponseType {
124    fn static_type() -> Type {
125        unsafe { from_glib(ffi::gtk_response_type_get_type()) }
126    }
127}
128
129impl ValueType for ResponseType {
130    type Type = Self;
131}
132
133unsafe impl<'a> FromValue<'a> for ResponseType {
134    type Checker = glib::value::GenericValueTypeChecker<Self>;
135
136    unsafe fn from_value(value: &'a glib::Value) -> Self {
137        unsafe {
138            skip_assert_initialized!();
139
140            from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
141        }
142    }
143}
144
145impl ToValue for ResponseType {
146    fn to_value(&self) -> glib::Value {
147        let mut value = glib::Value::for_value_type::<Self>();
148        unsafe {
149            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
150        }
151        value
152    }
153
154    fn value_type(&self) -> glib::Type {
155        Self::static_type()
156    }
157}
158
159impl From<ResponseType> for glib::Value {
160    fn from(t: ResponseType) -> Self {
161        skip_assert_initialized!();
162        t.to_value()
163    }
164}