mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-19 09:28:27 +00:00
clarified some doc comments and made the unsafe variant simpler to understand
This commit is contained in:
parent
35c0cf0e6f
commit
b03e7d7a16
@ -52,6 +52,9 @@ pub struct DragDropSource<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> DragDropSource<'a> {
|
impl<'a> DragDropSource<'a> {
|
||||||
|
/// Creates a new [DragDropSource] with no flags and the `Condition::Always` with the given name.
|
||||||
|
/// ImGui refers to this `name` field as a `type`, but really it's just an identifier to match up
|
||||||
|
/// Source/Target for DragDrop.
|
||||||
pub fn new(name: &'a ImStr) -> Self {
|
pub fn new(name: &'a ImStr) -> Self {
|
||||||
Self {
|
Self {
|
||||||
name,
|
name,
|
||||||
@ -62,6 +65,24 @@ impl<'a> DragDropSource<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new [DragDropSource] with no flags and the `Condition::Always` with the given name.
|
||||||
|
/// ImGui refers to this `name` field as a `type`, but really it's just an identifier to match up
|
||||||
|
/// Source/Target for DragDrop.
|
||||||
|
///
|
||||||
|
/// This payload will be passed to ImGui, which will provide it to
|
||||||
|
/// a target when it runs [accept_drag_drop_payload](DragDropTarget::accept_drag_drop_payload).
|
||||||
|
///
|
||||||
|
/// ## Safety
|
||||||
|
/// This function is not inherently unsafe, and won't panic itself, but using it opts you into
|
||||||
|
/// managing the lifetime yourself. When you dereference the pointer given in [accept_drag_drop_payload](DragDropTarget::accept_drag_drop_payload),
|
||||||
|
/// you can easily create memory safety problems.
|
||||||
|
pub unsafe fn payload<T>(name: &'a ImStr, payload: *const T) -> Self {
|
||||||
|
let mut output = Self::new(name);
|
||||||
|
output.payload = payload as *const ffi::c_void;
|
||||||
|
output.size = std::mem::size_of::<T>();
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the flags on the [DragDropSource]. Only the flags `SOURCE_NO_PREVIEW_TOOLTIP`,
|
/// Sets the flags on the [DragDropSource]. Only the flags `SOURCE_NO_PREVIEW_TOOLTIP`,
|
||||||
/// `SOURCE_NO_DISABLE_HOVER`, `SOURCE_NO_HOLD_TO_OPEN_OTHERS`, `SOURCE_ALLOW_NULL_ID`,
|
/// `SOURCE_NO_DISABLE_HOVER`, `SOURCE_NO_HOLD_TO_OPEN_OTHERS`, `SOURCE_ALLOW_NULL_ID`,
|
||||||
/// `SOURCE_EXTERN`, `SOURCE_AUTO_EXPIRE_PAYLOAD` make semantic sense, but any other flags will
|
/// `SOURCE_EXTERN`, `SOURCE_AUTO_EXPIRE_PAYLOAD` make semantic sense, but any other flags will
|
||||||
@ -77,19 +98,6 @@ impl<'a> DragDropSource<'a> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets a payload. This payload will be passed to ImGui, which will provide it to
|
|
||||||
/// a target when it runs [accept_drag_drop_payload](DragDropTarget::accept_drag_drop_payload).
|
|
||||||
///
|
|
||||||
/// ## Safety
|
|
||||||
/// This function is not inherently unsafe, and won't panic itself, but using it opts you into
|
|
||||||
/// managing the lifetime yourself. When you dereference the pointer given in [accept_drag_drop_payload](DragDropTarget::accept_drag_drop_payload),
|
|
||||||
/// you can easily create memory safety problems.
|
|
||||||
pub unsafe fn payload<T>(mut self, payload: *const T) -> Self {
|
|
||||||
self.payload = payload as *const ffi::c_void;
|
|
||||||
self.size = std::mem::size_of::<T>();
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource()
|
/// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource()
|
||||||
pub fn begin<'ui>(self, _ui: &'ui Ui) -> Option<DragDropSourceToolTip<'ui>> {
|
pub fn begin<'ui>(self, _ui: &'ui Ui) -> Option<DragDropSourceToolTip<'ui>> {
|
||||||
let should_begin = unsafe { sys::igBeginDragDropSource(self.flags.bits() as i32) };
|
let should_begin = unsafe { sys::igBeginDragDropSource(self.flags.bits() as i32) };
|
||||||
@ -133,13 +141,20 @@ pub struct DragDropPayload {
|
|||||||
/// Data which is copied and owned by ImGui. If you have accepted the payload, you can
|
/// Data which is copied and owned by ImGui. If you have accepted the payload, you can
|
||||||
/// take ownership of the data; otherwise, view it immutably. Interacting with `data` is
|
/// take ownership of the data; otherwise, view it immutably. Interacting with `data` is
|
||||||
/// very unsafe.
|
/// very unsafe.
|
||||||
|
/// @fixme: this doesn't make a ton of sense.
|
||||||
pub data: *const ffi::c_void,
|
pub data: *const ffi::c_void,
|
||||||
/// Set when [`accept_drag_drop_payload`](Self::accept_drag_drop_payload) was called
|
/// Set when [`accept_drag_drop_payload`](Self::accept_drag_drop_payload) was called
|
||||||
/// and mouse has been hovering the target item (nb: handle overlapping drag targets).
|
/// and mouse has been hovering the target item (nb: handle overlapping drag targets).
|
||||||
/// @fixme: literally what does this mean
|
/// @fixme: literally what does this mean -- I believe this is false on the first
|
||||||
|
/// frame when source hovers over target and then is subsequently true? but I'm not sure
|
||||||
|
/// when this matters. If DragDropFlags::ACCEPT_NO_PREVIEW is set, it doesn't make a difference
|
||||||
|
/// to this flag.
|
||||||
pub preview: bool,
|
pub preview: bool,
|
||||||
|
|
||||||
/// Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
|
/// Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
|
||||||
|
/// If this is set to false, then you set DragDropFlags::ACCEPT_BEFORE_DELIVERY and shouldn't
|
||||||
|
/// mess with `data`
|
||||||
|
/// @fixme: obviously this isn't an impressive implementation of ffi data mutability.
|
||||||
pub delivery: bool,
|
pub delivery: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +173,7 @@ impl<'ui> DragDropTarget<'ui> {
|
|||||||
|
|
||||||
/// Accepts, popping the drag_drop payload, if it exists. If `DragDropFlags::ACCEPT_BEFORE_DELIVERY` is
|
/// Accepts, popping the drag_drop payload, if it exists. If `DragDropFlags::ACCEPT_BEFORE_DELIVERY` is
|
||||||
/// set, this function will return `Some` even if the type is wrong as long as there is a payload to accept.
|
/// set, this function will return `Some` even if the type is wrong as long as there is a payload to accept.
|
||||||
|
/// How do we possibly handle communicating that this data is somewhat immutable?
|
||||||
pub fn accept_drag_drop_payload(&self, name: &ImStr, flags: DragDropFlags) -> Option<DragDropPayload> {
|
pub fn accept_drag_drop_payload(&self, name: &ImStr, flags: DragDropFlags) -> Option<DragDropPayload> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let inner = sys::igAcceptDragDropPayload(name.as_ptr(), flags.bits() as i32);
|
let inner = sys::igAcceptDragDropPayload(name.as_ptr(), flags.bits() as i32);
|
||||||
@ -166,6 +182,9 @@ impl<'ui> DragDropTarget<'ui> {
|
|||||||
} else {
|
} else {
|
||||||
let inner = *inner;
|
let inner = *inner;
|
||||||
|
|
||||||
|
// @fixme: there are actually other fields on `inner` which I have shorn -- they're
|
||||||
|
// considered internal to imgui (such as id of who sent this), so i've left it for
|
||||||
|
// now this way.
|
||||||
Some(DragDropPayload {
|
Some(DragDropPayload {
|
||||||
data: inner.Data,
|
data: inner.Data,
|
||||||
preview: inner.Preview,
|
preview: inner.Preview,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user