use dioxus_core::Event; pub type CompositionEvent = Event; pub struct CompositionData { inner: Box, } impl std::fmt::Debug for CompositionData { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("CompositionData") .field("data", &self.data()) .finish() } } impl From for CompositionData { fn from(e: E) -> Self { Self { inner: Box::new(e) } } } impl PartialEq for CompositionData { fn eq(&self, other: &Self) -> bool { self.data() == other.data() } } impl CompositionData { /// Create a new CompositionData pub fn new(inner: impl HasCompositionData + 'static) -> Self { Self { inner: Box::new(inner), } } /// The characters generated by the input method that raised the event pub fn data(&self) -> String { self.inner.data() } pub fn downcast(&self) -> Option<&T> { self.inner.as_any().downcast_ref() } } #[cfg(feature = "serialize")] /// A serialized version of CompositionData #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)] pub struct SerializedCompositionData { data: String, } #[cfg(feature = "serialize")] impl From<&CompositionData> for SerializedCompositionData { fn from(data: &CompositionData) -> Self { Self { data: data.data() } } } #[cfg(feature = "serialize")] impl HasCompositionData for SerializedCompositionData { fn data(&self) -> String { self.data.clone() } fn as_any(&self) -> &dyn std::any::Any { self } } #[cfg(feature = "serialize")] impl serde::Serialize for CompositionData { fn serialize(&self, serializer: S) -> Result { SerializedCompositionData::from(self).serialize(serializer) } } #[cfg(feature = "serialize")] impl<'de> serde::Deserialize<'de> for CompositionData { fn deserialize>(deserializer: D) -> Result { let data = SerializedCompositionData::deserialize(deserializer)?; Ok(Self { inner: Box::new(data), }) } } /// A trait for any object that has the data for a composition event pub trait HasCompositionData: std::any::Any { /// The characters generated by the input method that raised the event fn data(&self) -> String; /// return self as Any fn as_any(&self) -> &dyn std::any::Any; } impl_event! [ CompositionData; /// oncompositionstart oncompositionstart /// oncompositionend oncompositionend /// oncompositionupdate oncompositionupdate ];