use super::flags::{DragDropTargetFlags, validate_drag_drop_target_flags};
use super::payload::{
DragDropPayload, DragDropPayloadEmpty, DragDropPayloadPod, PayloadIsWrongType,
decode_typed_payload,
};
use super::validation::validate_payload_type_name;
use crate::{Ui, sys};
#[derive(Debug)]
pub struct DragDropTarget<'ui>(pub(super) &'ui Ui);
impl<'ui> DragDropTarget<'ui> {
pub fn accept_payload_empty(
&self,
name: impl AsRef<str>,
flags: DragDropTargetFlags,
) -> Option<DragDropPayloadEmpty> {
self.accept_payload(name, flags)?
.ok()
.map(|payload_pod: DragDropPayloadPod<()>| DragDropPayloadEmpty {
preview: payload_pod.preview,
delivery: payload_pod.delivery,
})
}
pub fn accept_payload<T: 'static + Copy, Name: AsRef<str>>(
&self,
name: Name,
flags: DragDropTargetFlags,
) -> Option<Result<DragDropPayloadPod<T>, PayloadIsWrongType>> {
let output = unsafe { self.accept_payload_unchecked(name, flags) };
output.map(decode_typed_payload)
}
pub unsafe fn accept_payload_unchecked(
&self,
name: impl AsRef<str>,
flags: DragDropTargetFlags,
) -> Option<DragDropPayload> {
validate_payload_type_name(name.as_ref(), "DragDropTarget::accept_payload_unchecked()");
validate_drag_drop_target_flags("DragDropTarget::accept_payload_unchecked()", flags);
let inner =
unsafe { sys::igAcceptDragDropPayload(self.0.scratch_txt(name), flags.bits() as i32) };
if inner.is_null() {
None
} else {
Some(DragDropPayload::from_raw(unsafe { *inner }))
}
}
pub fn pop(self) {
}
}
impl Drop for DragDropTarget<'_> {
fn drop(&mut self) {
unsafe {
sys::igEndDragDropTarget();
}
}
}