all_events.rs 2.3 KB

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