media.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. use dioxus_core::Event;
  2. pub type MediaEvent = Event<MediaData>;
  3. pub struct MediaData {
  4. inner: Box<dyn HasMediaData>,
  5. }
  6. impl<E: HasMediaData> From<E> for MediaData {
  7. fn from(e: E) -> Self {
  8. Self { inner: Box::new(e) }
  9. }
  10. }
  11. impl std::fmt::Debug for MediaData {
  12. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  13. f.debug_struct("MediaData").finish()
  14. }
  15. }
  16. impl PartialEq for MediaData {
  17. fn eq(&self, _: &Self) -> bool {
  18. true
  19. }
  20. }
  21. impl MediaData {
  22. /// Downcast this event to a concrete event type
  23. pub fn downcast<T: 'static>(&self) -> Option<&T> {
  24. self.inner.as_any().downcast_ref::<T>()
  25. }
  26. }
  27. #[cfg(feature = "serialize")]
  28. #[derive(serde::Serialize, serde::Deserialize)]
  29. struct SerializedMediaData {}
  30. #[cfg(feature = "serialize")]
  31. impl From<&MediaData> for SerializedMediaData {
  32. fn from(_: &MediaData) -> Self {
  33. Self {}
  34. }
  35. }
  36. #[cfg(feature = "serialize")]
  37. impl HasMediaData for SerializedMediaData {
  38. fn as_any(&self) -> &dyn std::any::Any {
  39. self
  40. }
  41. }
  42. #[cfg(feature = "serialize")]
  43. impl serde::Serialize for MediaData {
  44. fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
  45. SerializedMediaData::from(self).serialize(serializer)
  46. }
  47. }
  48. #[cfg(feature = "serialize")]
  49. impl<'de> serde::Deserialize<'de> for MediaData {
  50. fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  51. let data = SerializedMediaData::deserialize(deserializer)?;
  52. Ok(Self {
  53. inner: Box::new(data),
  54. })
  55. }
  56. }
  57. pub trait HasMediaData: std::any::Any {
  58. /// return self as Any
  59. fn as_any(&self) -> &dyn std::any::Any;
  60. }
  61. impl_event! [
  62. MediaData;
  63. ///abort
  64. onabort
  65. ///canplay
  66. oncanplay
  67. ///canplaythrough
  68. oncanplaythrough
  69. ///durationchange
  70. ondurationchange
  71. ///emptied
  72. onemptied
  73. ///encrypted
  74. onencrypted
  75. ///ended
  76. onended
  77. // todo: this conflicts with Media events
  78. // neither have data, so it's okay
  79. // ///error
  80. // onerror
  81. ///loadeddata
  82. onloadeddata
  83. ///loadedmetadata
  84. onloadedmetadata
  85. ///loadstart
  86. onloadstart
  87. ///pause
  88. onpause
  89. ///play
  90. onplay
  91. ///playing
  92. onplaying
  93. ///progress
  94. onprogress
  95. ///ratechange
  96. onratechange
  97. ///seeked
  98. onseeked
  99. ///seeking
  100. onseeking
  101. ///stalled
  102. onstalled
  103. ///suspend
  104. onsuspend
  105. ///timeupdate
  106. ontimeupdate
  107. ///volumechange
  108. onvolumechange
  109. ///waiting
  110. onwaiting
  111. ];