scroll.rs 2.0 KB

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