egui/data/
user_data.rs

1use std::{any::Any, sync::Arc};
2
3/// A wrapper around `dyn Any`, used for passing custom user data
4/// to [`crate::ViewportCommand::Screenshot`].
5#[derive(Clone, Debug, Default)]
6pub struct UserData {
7    /// A user value given to the screenshot command,
8    /// that will be returned in [`crate::Event::Screenshot`].
9    pub data: Option<Arc<dyn Any + Send + Sync>>,
10}
11
12impl UserData {
13    /// You can also use [`Self::default`].
14    pub fn new(user_info: impl Any + Send + Sync) -> Self {
15        Self {
16            data: Some(Arc::new(user_info)),
17        }
18    }
19}
20
21impl PartialEq for UserData {
22    fn eq(&self, other: &Self) -> bool {
23        match (&self.data, &other.data) {
24            (Some(a), Some(b)) => Arc::ptr_eq(a, b),
25            (None, None) => true,
26            _ => false,
27        }
28    }
29}
30
31impl Eq for UserData {}
32
33impl std::hash::Hash for UserData {
34    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
35        self.data.as_ref().map(Arc::as_ptr).hash(state);
36    }
37}
38
39#[cfg(feature = "serde")]
40impl serde::Serialize for UserData {
41    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
42    where
43        S: serde::Serializer,
44    {
45        serializer.serialize_none() // can't serialize an `Any`
46    }
47}
48
49#[cfg(feature = "serde")]
50impl<'de> serde::Deserialize<'de> for UserData {
51    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52    where
53        D: serde::Deserializer<'de>,
54    {
55        struct UserDataVisitor;
56
57        impl serde::de::Visitor<'_> for UserDataVisitor {
58            type Value = UserData;
59
60            fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61                formatter.write_str("a None value")
62            }
63
64            fn visit_none<E>(self) -> Result<UserData, E>
65            where
66                E: serde::de::Error,
67            {
68                Ok(UserData::default())
69            }
70        }
71
72        deserializer.deserialize_option(UserDataVisitor)
73    }
74}