wheel.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. use dioxus_core::Event;
  2. use std::fmt::Formatter;
  3. use crate::geometry::WheelDelta;
  4. pub type WheelEvent = Event<WheelData>;
  5. pub struct WheelData {
  6. inner: Box<dyn HasWheelData>,
  7. }
  8. impl<E: HasWheelData> From<E> for WheelData {
  9. fn from(e: E) -> Self {
  10. Self { inner: Box::new(e) }
  11. }
  12. }
  13. impl std::fmt::Debug for WheelData {
  14. fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
  15. f.debug_struct("WheelData")
  16. .field("delta", &self.delta())
  17. .finish()
  18. }
  19. }
  20. impl PartialEq for WheelData {
  21. fn eq(&self, other: &Self) -> bool {
  22. self.inner.delta() == other.inner.delta()
  23. }
  24. }
  25. impl WheelData {
  26. /// The amount of wheel movement
  27. #[allow(deprecated)]
  28. pub fn delta(&self) -> WheelDelta {
  29. self.inner.delta()
  30. }
  31. /// Downcast this event to a concrete event type
  32. pub fn downcast<T: 'static>(&self) -> Option<&T> {
  33. self.inner.as_any().downcast_ref::<T>()
  34. }
  35. }
  36. #[cfg(feature = "serialize")]
  37. #[derive(serde::Serialize, serde::Deserialize)]
  38. struct SerializedWheelData {
  39. delta: WheelDelta,
  40. }
  41. #[cfg(feature = "serialize")]
  42. impl From<&WheelData> for SerializedWheelData {
  43. fn from(data: &WheelData) -> Self {
  44. Self {
  45. delta: data.inner.delta(),
  46. }
  47. }
  48. }
  49. #[cfg(feature = "serialize")]
  50. impl HasWheelData for SerializedWheelData {
  51. fn delta(&self) -> WheelDelta {
  52. self.delta
  53. }
  54. fn as_any(&self) -> &dyn std::any::Any {
  55. self
  56. }
  57. }
  58. #[cfg(feature = "serialize")]
  59. impl serde::Serialize for WheelData {
  60. fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
  61. SerializedWheelData::from(self).serialize(serializer)
  62. }
  63. }
  64. #[cfg(feature = "serialize")]
  65. impl<'de> serde::Deserialize<'de> for WheelData {
  66. fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  67. let data = SerializedWheelData::deserialize(deserializer)?;
  68. Ok(Self {
  69. inner: Box::new(data),
  70. })
  71. }
  72. }
  73. impl_event![
  74. WheelData;
  75. /// Called when the mouse wheel is rotated over an element.
  76. onwheel
  77. ];
  78. pub trait HasWheelData: std::any::Any {
  79. /// The amount of wheel movement
  80. fn delta(&self) -> WheelDelta;
  81. /// return self as Any
  82. fn as_any(&self) -> &dyn std::any::Any;
  83. }