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