all_events.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use dioxus::prelude::*;
  2. use dioxus_html::on::{FocusData, KeyboardData, MouseData, WheelData};
  3. use std::sync::Arc;
  4. fn main() {
  5. dioxus::desktop::launch(app);
  6. }
  7. #[derive(Debug)]
  8. enum Event {
  9. MouseMove(Arc<MouseData>),
  10. MouseClick(Arc<MouseData>),
  11. MouseDoubleClick(Arc<MouseData>),
  12. MouseDown(Arc<MouseData>),
  13. MouseUp(Arc<MouseData>),
  14. Wheel(Arc<WheelData>),
  15. KeyDown(Arc<KeyboardData>),
  16. KeyUp(Arc<KeyboardData>),
  17. KeyPress(Arc<KeyboardData>),
  18. FocusIn(Arc<FocusData>),
  19. FocusOut(Arc<FocusData>),
  20. }
  21. const MAX_EVENTS: usize = 8;
  22. fn app(cx: Scope) -> Element {
  23. let container_style = r#"
  24. display: flex;
  25. flex-direction: column;
  26. align-items: center;
  27. "#;
  28. let rect_style = r#"
  29. background: deepskyblue;
  30. height: 50vh;
  31. width: 50vw;
  32. color: white;
  33. padding: 20px;
  34. margin: 20px;
  35. text-aligh: center;
  36. "#;
  37. let events = use_ref(&cx, || Vec::new());
  38. let events_lock = events.read();
  39. let first_index = events_lock.len().saturating_sub(MAX_EVENTS);
  40. let events_rendered = events_lock[first_index..]
  41. .iter()
  42. .map(|event| cx.render(rsx!(div {"{event:?}"})));
  43. let log_event = move |event: Event| {
  44. events.write().push(event);
  45. };
  46. cx.render(rsx! (
  47. div {
  48. style: "{container_style}",
  49. div {
  50. style: "{rect_style}",
  51. // focusing is necessary to catch keyboard events
  52. tabindex: "0",
  53. onmousemove: move |event| log_event(Event::MouseMove(event.data)),
  54. onclick: move |event| log_event(Event::MouseClick(event.data)),
  55. ondblclick: move |event| log_event(Event::MouseDoubleClick(event.data)),
  56. onmousedown: move |event| log_event(Event::MouseDown(event.data)),
  57. onmouseup: move |event| log_event(Event::MouseUp(event.data)),
  58. onwheel: move |event| log_event(Event::Wheel(event.data)),
  59. onkeydown: move |event| log_event(Event::KeyDown(event.data)),
  60. onkeyup: move |event| log_event(Event::KeyUp(event.data)),
  61. onkeypress: move |event| log_event(Event::KeyPress(event.data)),
  62. onfocusin: move |event| log_event(Event::FocusIn(event.data)),
  63. onfocusout: move |event| log_event(Event::FocusOut(event.data)),
  64. "Hover, click, type or scroll to see the info down below"
  65. }
  66. div { events_rendered },
  67. },
  68. ))
  69. }