use std::{any::Any, path::PathBuf, rc::Rc};
pub type DragPayload = Rc<dyn Any>;
pub fn drag_payload<T: 'static>(value: T) -> DragPayload {
Rc::new(value)
}
pub fn downcast_drag_payload<T: 'static>(payload: &DragPayload) -> Option<&T> {
payload.as_ref().downcast_ref::<T>()
}
pub fn drag_and_drop_source<T, F>(mut modifier: crate::Modifier, on_start: F) -> crate::Modifier
where
T: 'static,
F: Fn(DragStart) -> Option<T> + 'static,
{
modifier = modifier.on_drag_start(move |start| on_start(start).map(drag_payload::<T>));
modifier
}
pub fn drag_and_drop_target<T, F>(mut modifier: crate::Modifier, on_drop: F) -> crate::Modifier
where
T: 'static,
F: Fn(&DropEvent, &T) -> bool + 'static,
{
modifier = modifier.on_drop(move |ev| {
match downcast_drag_payload::<T>(&ev.payload) {
Some(v) => on_drop(&ev, v),
None => false,
}
});
modifier
}
#[derive(Clone, Debug)]
pub struct DragStart {
pub source_id: u64,
pub position: crate::Vec2,
pub modifiers: crate::Modifiers,
}
#[derive(Clone, Debug)]
pub struct DragOver {
pub source_id: u64,
pub target_id: u64,
pub position: crate::Vec2,
pub modifiers: crate::Modifiers,
pub payload: DragPayload,
}
#[derive(Clone, Debug)]
pub struct DropEvent {
pub source_id: u64,
pub target_id: u64,
pub position: crate::Vec2,
pub modifiers: crate::Modifiers,
pub payload: DragPayload,
}
#[derive(Clone, Copy, Debug)]
pub struct DragEnd {
pub accepted: bool,
}
#[derive(Clone, Debug)]
pub struct DroppedFile {
pub name: String,
pub path: Option<PathBuf>,
}
#[derive(Clone, Debug)]
pub struct DroppedFiles {
pub files: Vec<DroppedFile>,
}