use std::any::Any;
use std::fmt::Debug;
use std::sync::Arc;
use crate::style::Length;
pub trait DragPayload: Any + Debug + 'static {
fn as_any(&self) -> &dyn Any;
fn into_arc(self: Box<Self>) -> Arc<dyn DragPayload>;
}
impl<T> DragPayload for T
where
T: Any + Debug + 'static,
{
fn as_any(&self) -> &dyn Any {
self
}
fn into_arc(self: Box<Self>) -> Arc<dyn DragPayload> {
let payload: Arc<Self> = Arc::from(self);
payload
}
}
impl dyn DragPayload {
pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
self.as_any().downcast_ref::<T>().or_else(|| {
self.as_any()
.downcast_ref::<Box<dyn DragPayload>>()
.and_then(|boxed| boxed.as_ref().as_any().downcast_ref::<T>())
})
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DragStartEvent {
pub x: u16,
pub y: u16,
}
#[derive(Clone)]
pub struct DragOverEvent {
pub x: u16,
pub y: u16,
pub local_y: u16,
pub local_height: u16,
pub payload: Arc<dyn DragPayload>,
}
#[derive(Clone)]
pub struct DragLeaveEvent {
pub payload: Arc<dyn DragPayload>,
}
#[derive(Clone)]
pub struct DropEvent {
pub x: u16,
pub y: u16,
pub local_y: u16,
pub local_height: u16,
pub payload: Arc<dyn DragPayload>,
}
#[derive(Clone)]
pub struct DragStartedEvent {
pub x: u16,
pub y: u16,
pub payload: Arc<dyn DragPayload>,
}
#[derive(Clone)]
pub struct DragCancelEvent {
pub payload: Arc<dyn DragPayload>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub enum DragPreview {
Label(Arc<str>),
SourceSnapshot,
#[default]
None,
}
pub const DEFAULT_PREVIEW_MAX_WIDTH: u16 = 60;
pub const DEFAULT_PREVIEW_MAX_HEIGHT: u16 = 20;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum DragSlotAxis {
#[default]
Vertical,
Horizontal,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum DragSlot {
#[default]
Collapse,
Specified(Length),
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum DropSlot {
#[default]
Child,
SourcePreview,
}