all_terminal_events.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use dioxus::prelude::*;
  2. use std::{fmt::Debug, rc::Rc};
  3. fn main() {
  4. dioxus_tui::launch(app);
  5. }
  6. const MAX_EVENTS: usize = 8;
  7. fn app() -> Element {
  8. let mut events = use_signal(|| Vec::new() as Vec<Rc<dyn Debug>>);
  9. let mut log_event = move |event: Rc<dyn Debug>| events.write().push(event);
  10. rsx! {
  11. div { width: "100%", height: "100%", flex_direction: "column",
  12. div {
  13. width: "80%",
  14. height: "50%",
  15. border_width: "1px",
  16. justify_content: "center",
  17. align_items: "center",
  18. background_color: "hsl(248, 53%, 58%)",
  19. // Mosue
  20. onmousemove: move |event| log_event(event.data()),
  21. onclick: move |event| log_event(event.data()),
  22. ondoubleclick: move |event| log_event(event.data()),
  23. onmousedown: move |event| log_event(event.data()),
  24. onmouseup: move |event| log_event(event.data()),
  25. // Scroll
  26. onwheel: move |event| log_event(event.data()),
  27. // Keyboard
  28. onkeydown: move |event| log_event(event.data()),
  29. onkeyup: move |event| log_event(event.data()),
  30. onkeypress: move |event| log_event(event.data()),
  31. // Focus
  32. onfocusin: move |event| log_event(event.data()),
  33. onfocusout: move |event| log_event(event.data()),
  34. "Hover, click, type or scroll to see the info down below"
  35. }
  36. div { width: "80%", height: "50%", flex_direction: "column",
  37. // A trailing iterator of the last MAX_EVENTS events
  38. // The index actually is a fine key here, since events are append-only and therefore stable
  39. for (index, event) in events.read().iter().enumerate().rev().take(MAX_EVENTS).rev() {
  40. p { key: "{index}",
  41. {
  42. // TUI panics if text overflows (https://github.com/DioxusLabs/dioxus/issues/371)
  43. // temporary hack: just trim the strings (and make sure viewport is big enough)
  44. // todo: remove
  45. let mut trimmed = format!("{event:?}");
  46. trimmed.truncate(200);
  47. trimmed
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }
  54. }