Skip to content

Commit

Permalink
use DragEvent not MouseEvent for drag events
Browse files Browse the repository at this point in the history
  • Loading branch information
rogusdev committed Oct 29, 2024
1 parent 9ebcbc6 commit 3b64b08
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions packages/web/src/events/drag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,71 +4,78 @@ use dioxus_html::{
},
HasDragData, HasFileData, HasMouseData,
};
use web_sys::MouseEvent;
use wasm_bindgen::JsCast;
use web_sys::{DragEvent, MouseEvent};

use super::{Synthetic, WebEventExt};

pub(crate) struct WebDragData {
raw: Synthetic<MouseEvent>,
drag: Synthetic<DragEvent>,
mouse: Synthetic<MouseEvent>,
}

impl WebDragData {
pub fn new(raw: MouseEvent) -> Self {
pub fn new(raw: DragEvent) -> Self {
let mouse = raw
.clone()
.dyn_into::<MouseEvent>()
.expect("Inconceivable! DragEvent is not MouseEvent?");
Self {
raw: Synthetic::new(raw),
drag: Synthetic::new(raw),
mouse: Synthetic::new(mouse),
}
}
}

impl HasDragData for WebDragData {
fn as_any(&self) -> &dyn std::any::Any {
&self.raw as &dyn std::any::Any
&self.drag as &dyn std::any::Any
}
}

impl HasMouseData for WebDragData {
fn as_any(&self) -> &dyn std::any::Any {
&self.raw as &dyn std::any::Any
&self.mouse as &dyn std::any::Any
}
}

impl PointerInteraction for WebDragData {
fn trigger_button(&self) -> Option<dioxus_html::input_data::MouseButton> {
self.raw.trigger_button()
self.mouse.trigger_button()
}

fn held_buttons(&self) -> dioxus_html::input_data::MouseButtonSet {
self.raw.held_buttons()
self.mouse.held_buttons()
}
}

impl ModifiersInteraction for WebDragData {
fn modifiers(&self) -> dioxus_html::prelude::Modifiers {
self.raw.modifiers()
self.mouse.modifiers()
}
}

impl InteractionElementOffset for WebDragData {
fn coordinates(&self) -> dioxus_html::geometry::Coordinates {
self.raw.coordinates()
self.mouse.coordinates()
}

fn element_coordinates(&self) -> dioxus_html::geometry::ElementPoint {
self.raw.element_coordinates()
self.mouse.element_coordinates()
}
}

impl InteractionLocation for WebDragData {
fn client_coordinates(&self) -> dioxus_html::geometry::ClientPoint {
self.raw.client_coordinates()
self.mouse.client_coordinates()
}

fn screen_coordinates(&self) -> dioxus_html::geometry::ScreenPoint {
self.raw.screen_coordinates()
self.mouse.screen_coordinates()
}

fn page_coordinates(&self) -> dioxus_html::geometry::PagePoint {
self.raw.page_coordinates()
self.mouse.page_coordinates()
}
}

Expand All @@ -78,7 +85,7 @@ impl HasFileData for WebDragData {
use wasm_bindgen::JsCast;

let files = self
.raw
.drag
.event
.dyn_ref::<web_sys::DragEvent>()
.and_then(|drag_event| {
Expand All @@ -97,12 +104,12 @@ impl HasFileData for WebDragData {
}

impl WebEventExt for dioxus_html::DragData {
type WebEvent = web_sys::MouseEvent;
type WebEvent = web_sys::DragEvent;

#[inline(always)]
fn try_as_web_event(&self) -> Option<web_sys::MouseEvent> {
fn try_as_web_event(&self) -> Option<web_sys::DragEvent> {
self.downcast::<WebDragData>()
.map(|data| &data.raw.event)
.map(|data| &data.drag.event)
.cloned()
}
}

0 comments on commit 3b64b08

Please sign in to comment.