all_terminal_events.rs 2.6 KB

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