events.rs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //! Convert a serialized event to an event trigger
  2. use dioxus_html::events::*;
  3. use serde::{Deserialize, Serialize};
  4. use serde_json::from_value;
  5. use std::any::Any;
  6. use std::rc::Rc;
  7. #[derive(Deserialize, Serialize)]
  8. pub(crate) struct IpcMessage {
  9. method: String,
  10. params: serde_json::Value,
  11. }
  12. impl IpcMessage {
  13. pub(crate) fn method(&self) -> &str {
  14. self.method.as_str()
  15. }
  16. pub(crate) fn params(self) -> serde_json::Value {
  17. self.params
  18. }
  19. }
  20. pub(crate) fn parse_ipc_message(payload: &str) -> Option<IpcMessage> {
  21. match serde_json::from_str(payload) {
  22. Ok(message) => Some(message),
  23. Err(e) => {
  24. log::error!("could not parse IPC message, error: {}", e);
  25. None
  26. }
  27. }
  28. }
  29. macro_rules! match_data {
  30. (
  31. $m:ident;
  32. $name:ident;
  33. $(
  34. $tip:ty => $($mname:literal)|* ;
  35. )*
  36. ) => {
  37. match $name {
  38. $( $($mname)|* => {
  39. println!("casting to type {:?}", std::any::TypeId::of::<$tip>());
  40. let val: $tip = from_value::<$tip>($m).ok()?;
  41. Rc::new(val) as Rc<dyn Any>
  42. })*
  43. _ => return None,
  44. }
  45. };
  46. }
  47. #[derive(Deserialize)]
  48. pub struct EventMessage {
  49. pub contents: serde_json::Value,
  50. pub event: String,
  51. pub mounted_dom_id: usize,
  52. }
  53. pub fn decode_event(value: EventMessage) -> Option<Rc<dyn Any>> {
  54. let val = value.contents;
  55. let name = value.event.as_str();
  56. type DragData = MouseData;
  57. let evt = match_data! { val; name;
  58. MouseData => "click" | "contextmenu" | "dblclick" | "doubleclick" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup";
  59. ClipboardData => "copy" | "cut" | "paste";
  60. CompositionData => "compositionend" | "compositionstart" | "compositionupdate";
  61. KeyboardData => "keydown" | "keypress" | "keyup";
  62. FocusData => "blur" | "focus" | "focusin" | "focusout";
  63. FormData => "change" | "input" | "invalid" | "reset" | "submit";
  64. DragData => "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop";
  65. PointerData => "pointerlockchange" | "pointerlockerror" | "pointerdown" | "pointermove" | "pointerup" | "pointerover" | "pointerout" | "pointerenter" | "pointerleave" | "gotpointercapture" | "lostpointercapture";
  66. SelectionData => "selectstart" | "selectionchange" | "select";
  67. TouchData => "touchcancel" | "touchend" | "touchmove" | "touchstart";
  68. ScrollData => "scroll";
  69. WheelData => "wheel";
  70. MediaData => "abort" | "canplay" | "canplaythrough" | "durationchange" | "emptied"
  71. | "encrypted" | "ended" | "interruptbegin" | "interruptend" | "loadeddata"
  72. | "loadedmetadata" | "loadstart" | "pause" | "play" | "playing" | "progress"
  73. | "ratechange" | "seeked" | "seeking" | "stalled" | "suspend" | "timeupdate"
  74. | "volumechange" | "waiting" | "error" | "load" | "loadend" | "timeout";
  75. AnimationData => "animationstart" | "animationend" | "animationiteration";
  76. TransitionData => "transitionend";
  77. ToggleData => "toggle";
  78. // ImageData => "load" | "error";
  79. // OtherData => "abort" | "afterprint" | "beforeprint" | "beforeunload" | "hashchange" | "languagechange" | "message" | "offline" | "online" | "pagehide" | "pageshow" | "popstate" | "rejectionhandled" | "storage" | "unhandledrejection" | "unload" | "userproximity" | "vrdisplayactivate" | "vrdisplayblur" | "vrdisplayconnect" | "vrdisplaydeactivate" | "vrdisplaydisconnect" | "vrdisplayfocus" | "vrdisplaypointerrestricted" | "vrdisplaypointerunrestricted" | "vrdisplaypresentchange";
  80. };
  81. Some(evt)
  82. }