123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- use dioxus::html::geometry::euclid::Vector3D;
- use dioxus::prelude::*;
- use dioxus_core::prelude::consume_context;
- use dioxus_desktop::DesktopContext;
- pub(crate) fn check_app_exits(app: fn() -> Element) {
- use dioxus_desktop::tao::window::WindowBuilder;
- use dioxus_desktop::Config;
- // This is a deadman's switch to ensure that the app exits
- let should_panic = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(true));
- let should_panic_clone = should_panic.clone();
- std::thread::spawn(move || {
- std::thread::sleep(std::time::Duration::from_secs(100));
- if should_panic_clone.load(std::sync::atomic::Ordering::SeqCst) {
- std::process::exit(exitcode::SOFTWARE);
- }
- });
- LaunchBuilder::desktop()
- .with_cfg(Config::new().with_window(WindowBuilder::new().with_visible(true)))
- .launch(app);
- // Stop deadman's switch
- should_panic.store(false, std::sync::atomic::Ordering::SeqCst);
- }
- pub fn main() {
- check_app_exits(app);
- }
- fn mock_event(id: &'static str, value: &'static str) {
- use_effect(move || {
- spawn(async move {
- tokio::time::sleep(std::time::Duration::from_millis(100)).await;
- let js = format!(
- r#"
- //console.log("ran");
- // Dispatch a synthetic event
- let event = {};
- let element = document.getElementById('{}');
- console.log(element, event);
- element.dispatchEvent(event);
- "#,
- value, id
- );
- dioxus::eval(js);
- });
- })
- }
- #[allow(deprecated)]
- fn app() -> Element {
- let desktop_context: DesktopContext = consume_context();
- let mut received_events = use_signal(|| 0);
- // button
- mock_event(
- "button",
- r#"new MouseEvent("click", {
- view: window,
- bubbles: true,
- cancelable: true,
- button: 0,
- })"#,
- );
- // mouse_move_div
- mock_event(
- "mouse_move_div",
- r#"new MouseEvent("mousemove", {
- view: window,
- bubbles: true,
- cancelable: true,
- buttons: 2,
- })"#,
- );
- // mouse_click_div
- mock_event(
- "mouse_click_div",
- r#"new MouseEvent("click", {
- view: window,
- bubbles: true,
- cancelable: true,
- buttons: 2,
- button: 2,
- })"#,
- );
- // mouse_dblclick_div
- mock_event(
- "mouse_dblclick_div",
- r#"new MouseEvent("dblclick", {
- view: window,
- bubbles: true,
- cancelable: true,
- buttons: 1|2,
- button: 2,
- })"#,
- );
- // mouse_down_div
- mock_event(
- "mouse_down_div",
- r#"new MouseEvent("mousedown", {
- view: window,
- bubbles: true,
- cancelable: true,
- buttons: 2,
- button: 2,
- })"#,
- );
- // mouse_up_div
- mock_event(
- "mouse_up_div",
- r#"new MouseEvent("mouseup", {
- view: window,
- bubbles: true,
- cancelable: true,
- buttons: 0,
- button: 0,
- })"#,
- );
- // wheel_div
- mock_event(
- "wheel_div",
- r#"new WheelEvent("wheel", {
- view: window,
- deltaX: 1.0,
- deltaY: 2.0,
- deltaZ: 3.0,
- deltaMode: 0x00,
- bubbles: true,
- })"#,
- );
- // key_down_div
- mock_event(
- "key_down_div",
- r#"new KeyboardEvent("keydown", {
- key: "a",
- code: "KeyA",
- location: 0,
- repeat: true,
- keyCode: 65,
- charCode: 97,
- char: "a",
- charCode: 0,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- shiftKey: false,
- isComposing: true,
- which: 65,
- bubbles: true,
- })"#,
- );
- // key_up_div
- mock_event(
- "key_up_div",
- r#"new KeyboardEvent("keyup", {
- key: "a",
- code: "KeyA",
- location: 0,
- repeat: false,
- keyCode: 65,
- charCode: 97,
- char: "a",
- charCode: 0,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- shiftKey: false,
- isComposing: false,
- which: 65,
- bubbles: true,
- })"#,
- );
- // key_press_div
- mock_event(
- "key_press_div",
- r#"new KeyboardEvent("keypress", {
- key: "a",
- code: "KeyA",
- location: 0,
- repeat: false,
- keyCode: 65,
- charCode: 97,
- char: "a",
- charCode: 0,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- shiftKey: false,
- isComposing: false,
- which: 65,
- bubbles: true,
- })"#,
- );
- // focus_in_div
- mock_event(
- "focus_in_div",
- r#"new FocusEvent("focusin", {bubbles: true})"#,
- );
- // focus_out_div
- mock_event(
- "focus_out_div",
- r#"new FocusEvent("focusout",{bubbles: true})"#,
- );
- if received_events() == 13 {
- println!("all events recieved");
- desktop_context.close();
- }
- rsx! {
- div {
- div {
- width: "100px",
- height: "100px",
- onmounted: move |evt| async move {
- todo!();
- // let rect = evt.get_client_rect().await.unwrap();
- // println!("rect: {:?}", rect);
- // assert_eq!(rect.width(), 100.0);
- // assert_eq!(rect.height(), 100.0);
- // received_events.with_mut(|x| *x + 1)
- }
- }
- button {
- id: "button",
- onclick: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(event.data.held_buttons().is_empty());
- assert_eq!(
- event.data.trigger_button(),
- Some(dioxus_html::input_data::MouseButton::Primary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "mouse_move_div",
- onmousemove: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(
- event
- .data
- .held_buttons()
- .contains(dioxus_html::input_data::MouseButton::Secondary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "mouse_click_div",
- onclick: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(
- event
- .data
- .held_buttons()
- .contains(dioxus_html::input_data::MouseButton::Secondary),
- );
- assert_eq!(
- event.data.trigger_button(),
- Some(dioxus_html::input_data::MouseButton::Secondary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "mouse_dblclick_div",
- ondoubleclick: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(
- event.data.held_buttons().contains(dioxus_html::input_data::MouseButton::Primary),
- );
- assert!(
- event
- .data
- .held_buttons()
- .contains(dioxus_html::input_data::MouseButton::Secondary),
- );
- assert_eq!(
- event.data.trigger_button(),
- Some(dioxus_html::input_data::MouseButton::Secondary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "mouse_down_div",
- onmousedown: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(
- event
- .data
- .held_buttons()
- .contains(dioxus_html::input_data::MouseButton::Secondary),
- );
- assert_eq!(
- event.data.trigger_button(),
- Some(dioxus_html::input_data::MouseButton::Secondary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "mouse_up_div",
- onmouseup: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert!(event.data.held_buttons().is_empty());
- assert_eq!(
- event.data.trigger_button(),
- Some(dioxus_html::input_data::MouseButton::Primary),
- );
- received_events.with_mut(|x| *x + 1);
- }
- }
- div {
- id: "wheel_div",
- width: "100px",
- height: "100px",
- background_color: "red",
- onwheel: move |event| {
- println!("{:?}", event.data);
- let dioxus_html::geometry::WheelDelta::Pixels(delta) = event.data.delta() else {
- panic!("Expected delta to be in pixels") };
- assert_eq!(delta, Vector3D::new(1.0, 2.0, 3.0));
- received_events.with_mut(|x| *x + 1);
- }
- }
- input {
- id: "key_down_div",
- onkeydown: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert_eq!(event.data.key().to_string(), "a");
- assert_eq!(event.data.code().to_string(), "KeyA");
- assert_eq!(event.data.location(), Location::Standard);
- assert!(event.data.is_auto_repeating());
- assert!(event.data.is_composing());
- received_events.with_mut(|x| *x + 1)
- }
- }
- input {
- id: "key_up_div",
- onkeyup: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert_eq!(event.data.key().to_string(), "a");
- assert_eq!(event.data.code().to_string(), "KeyA");
- assert_eq!(event.data.location(), Location::Standard);
- assert!(!event.data.is_auto_repeating());
- assert!(!event.data.is_composing());
- received_events.with_mut(|x| *x + 1)
- }
- }
- input {
- id: "key_press_div",
- onkeypress: move |event| {
- println!("{:?}", event.data);
- assert!(event.data.modifiers().is_empty());
- assert_eq!(event.data.key().to_string(), "a");
- assert_eq!(event.data.code().to_string(), "KeyA");
- assert_eq!(event.data.location(), Location::Standard);
- assert!(!event.data.is_auto_repeating());
- assert!(!event.data.is_composing());
- received_events.with_mut(|x| *x + 1)
- }
- }
- input {
- id: "focus_in_div",
- onfocusin: move |event| {
- println!("{:?}", event.data);
- received_events.with_mut(|x| *x + 1);
- }
- }
- input {
- id: "focus_out_div",
- onfocusout: move |event| {
- println!("{:?}", event.data);
- received_events.with_mut(|x| *x + 1);
- }
- }
- }
- }
- }
|