tui_keys.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use dioxus::events::WheelEvent;
  2. use dioxus::prelude::*;
  3. use dioxus_html::geometry::ScreenPoint;
  4. use dioxus_html::input_data::keyboard_types::Code;
  5. use dioxus_html::input_data::MouseButtonSet;
  6. use dioxus_html::on::{KeyboardEvent, MouseEvent};
  7. use dioxus_html::KeyCode;
  8. fn main() {
  9. dioxus::tui::launch(app);
  10. }
  11. fn app(cx: Scope) -> Element {
  12. let key = use_state(&cx, || "".to_string());
  13. let mouse = use_state(&cx, || ScreenPoint::zero());
  14. let count = use_state(&cx, || 0);
  15. let buttons = use_state(&cx, || MouseButtonSet::empty());
  16. let mouse_clicked = use_state(&cx, || false);
  17. let key_down_handler = move |evt: KeyboardEvent| {
  18. match evt.data.code() {
  19. Code::ArrowLeft => count.set(count + 1),
  20. Code::ArrowRight => count.set(count - 1),
  21. Code::ArrowUp => count.set(count + 10),
  22. Code::ArrowDown => count.set(count - 10),
  23. _ => {}
  24. }
  25. key.set(format!(
  26. "{:?} repeating: {:?}",
  27. evt.key(),
  28. evt.is_auto_repeating()
  29. ));
  30. };
  31. cx.render(rsx! {
  32. div {
  33. width: "100%",
  34. height: "10px",
  35. background_color: "red",
  36. justify_content: "center",
  37. align_items: "center",
  38. flex_direction: "column",
  39. onkeydown: key_down_handler,
  40. onwheel: move |evt: WheelEvent| {
  41. count.set(count + evt.data.delta().strip_units().y as i64);
  42. },
  43. ondrag: move |evt: MouseEvent| {
  44. mouse.set(evt.data.screen_coordinates());
  45. },
  46. onmousedown: move |evt: MouseEvent| {
  47. mouse.set(evt.data.screen_coordinates());
  48. buttons.set(evt.data.held_buttons());
  49. mouse_clicked.set(true);
  50. },
  51. onmouseup: move |evt: MouseEvent| {
  52. buttons.set(evt.data.held_buttons());
  53. mouse_clicked.set(false);
  54. },
  55. "count: {count:?}",
  56. "key: {key}",
  57. "mouse buttons: {buttons:?}",
  58. "mouse pos: {mouse:?}",
  59. "mouse button pressed: {mouse_clicked}"
  60. }
  61. })
  62. }