Skip to main content

dioxus_web/events/
clipboard.rs

1use dioxus_html::{DataTransfer, FileData, HasClipboardData, HasDataTransferData, HasFileData};
2use web_sys::ClipboardEvent;
3
4use crate::WebDataTransfer;
5
6use super::WebEventExt;
7
8pub(crate) struct WebClipboardData {
9    event: ClipboardEvent,
10}
11
12impl WebClipboardData {
13    pub fn new(event: ClipboardEvent) -> Self {
14        Self { event }
15    }
16}
17
18impl HasClipboardData for WebClipboardData {
19    fn as_any(&self) -> &dyn std::any::Any {
20        &self.event as &dyn std::any::Any
21    }
22}
23
24impl HasDataTransferData for WebClipboardData {
25    fn data_transfer(&self) -> DataTransfer {
26        let data = self
27            .event
28            .clipboard_data()
29            // No `clipboardData` (e.g. `copy`/`cut` until set): fall back to an empty transfer.
30            .unwrap_or_else(|| web_sys::DataTransfer::new().unwrap());
31        DataTransfer::new(WebDataTransfer::new(data))
32    }
33}
34
35impl HasFileData for WebClipboardData {
36    fn files(&self) -> Vec<FileData> {
37        self.data_transfer().files()
38    }
39}
40
41impl WebEventExt for dioxus_html::ClipboardData {
42    type WebEvent = web_sys::ClipboardEvent;
43
44    #[inline(always)]
45    fn try_as_web_event(&self) -> Option<Self::WebEvent> {
46        self.downcast::<web_sys::ClipboardEvent>().cloned()
47    }
48}