clipboard.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use dioxus_core::Event;
  2. pub type ClipboardEvent = Event<ClipboardData>;
  3. pub struct ClipboardData {
  4. inner: Box<dyn HasClipboardData>,
  5. }
  6. impl<E: HasClipboardData> From<E> for ClipboardData {
  7. fn from(e: E) -> Self {
  8. Self { inner: Box::new(e) }
  9. }
  10. }
  11. impl std::fmt::Debug for ClipboardData {
  12. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  13. f.debug_struct("ClipboardData").finish()
  14. }
  15. }
  16. impl PartialEq for ClipboardData {
  17. fn eq(&self, _other: &Self) -> bool {
  18. true
  19. }
  20. }
  21. impl ClipboardData {
  22. /// Create a new ClipboardData
  23. pub fn new(inner: impl HasClipboardData) -> Self {
  24. Self {
  25. inner: Box::new(inner),
  26. }
  27. }
  28. /// Downcast this event to a concrete event type
  29. pub fn downcast<T: 'static>(&self) -> Option<&T> {
  30. self.inner.as_ref().as_any().downcast_ref::<T>()
  31. }
  32. }
  33. #[cfg(feature = "serialize")]
  34. /// A serialized version of ClipboardData
  35. #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
  36. pub struct SerializedClipboardData {}
  37. #[cfg(feature = "serialize")]
  38. impl From<&ClipboardData> for SerializedClipboardData {
  39. fn from(_: &ClipboardData) -> Self {
  40. Self {}
  41. }
  42. }
  43. #[cfg(feature = "serialize")]
  44. impl HasClipboardData for SerializedClipboardData {
  45. fn as_any(&self) -> &dyn std::any::Any {
  46. self
  47. }
  48. }
  49. #[cfg(feature = "serialize")]
  50. impl serde::Serialize for ClipboardData {
  51. fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
  52. SerializedClipboardData::from(self).serialize(serializer)
  53. }
  54. }
  55. #[cfg(feature = "serialize")]
  56. impl<'de> serde::Deserialize<'de> for ClipboardData {
  57. fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  58. let data = SerializedClipboardData::deserialize(deserializer)?;
  59. Ok(Self {
  60. inner: Box::new(data),
  61. })
  62. }
  63. }
  64. pub trait HasClipboardData: std::any::Any {
  65. /// return self as Any
  66. fn as_any(&self) -> &dyn std::any::Any;
  67. }
  68. impl_event![
  69. ClipboardData;
  70. /// oncopy
  71. oncopy
  72. /// oncut
  73. oncut
  74. /// onpaste
  75. onpaste
  76. ];