mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-27 21:38:34 +00:00
drag drop changes
This commit is contained in:
parent
da5c75d509
commit
c36f30ea94
@ -24,7 +24,9 @@
|
|||||||
|
|
||||||
- Added `add_polyline` method to `DrawListMut`, which binds to Dear ImGui's `AddPolyline` and `AddConvexPolyFilled`
|
- Added `add_polyline` method to `DrawListMut`, which binds to Dear ImGui's `AddPolyline` and `AddConvexPolyFilled`
|
||||||
|
|
||||||
- BREAKING: `MenuItem::new` now takes `&ui`, but has been deprecated. Instead, use `ui.menu_item`. Additionally, a `ui.menu_item_config` has been created to access the builder pattern on `MenuItem`.
|
- BREAKING: The following structs have had their `new` method changed and deprecated; they now also take `ui` in their `new`, but you should create them on the `Ui` struct instead. These each now have a simple and a `_config` version:
|
||||||
|
- `MenuItem` should be made with `ui.menu_item` and `ui.menu_item_config`.
|
||||||
|
- `DragDropSource` and `DragDropTarget` should be made with `ui.drag_drop_source_config` and `ui.drag_drop_target`. Both of these methods, and the DragDrop API in general, are likely to change.
|
||||||
|
|
||||||
## [0.8.0] - 2021-09-17
|
## [0.8.0] - 2021-09-17
|
||||||
|
|
||||||
|
|||||||
@ -70,6 +70,18 @@ bitflags!(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
impl Ui {
|
||||||
|
/// Creates a new [DragDropSource] with the given name.
|
||||||
|
pub fn drag_drop_source_config<T: AsRef<str>>(&self, name: T) -> DragDropSource<'_, T> {
|
||||||
|
DragDropSource {
|
||||||
|
name,
|
||||||
|
flags: DragDropFlags::empty(),
|
||||||
|
cond: Condition::Always,
|
||||||
|
ui: self,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a source for drag drop data out of the last ID created.
|
/// Creates a source for drag drop data out of the last ID created.
|
||||||
///
|
///
|
||||||
/// ```no_run
|
/// ```no_run
|
||||||
@ -92,21 +104,22 @@ bitflags!(
|
|||||||
/// will manage, and then give to a [DragDropTarget], which will received the payload. The
|
/// will manage, and then give to a [DragDropTarget], which will received the payload. The
|
||||||
/// simplest and safest Payload is the empty payload, created with [begin](Self::begin).
|
/// simplest and safest Payload is the empty payload, created with [begin](Self::begin).
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct DragDropSource<T> {
|
pub struct DragDropSource<'ui, T> {
|
||||||
name: T,
|
name: T,
|
||||||
flags: DragDropFlags,
|
flags: DragDropFlags,
|
||||||
cond: Condition,
|
cond: Condition,
|
||||||
|
ui: &'ui Ui,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: AsRef<str>> DragDropSource<T> {
|
impl<'ui, T: AsRef<str>> DragDropSource<'ui, T> {
|
||||||
/// Creates a new [DragDropSource] with no flags and the `Condition::Always` with the given name.
|
/// Creates a new [DragDropSource] with the given name.
|
||||||
/// ImGui refers to this `name` field as a `type`, but really it's just an identifier to match up
|
#[deprecated(since = "0.9.0", note = "use `ui.drag_drop_source_config` instead")]
|
||||||
/// Source/Target for DragDrop.
|
pub fn new(name: T, ui: &'ui Ui) -> Self {
|
||||||
pub fn new(name: T) -> Self {
|
|
||||||
Self {
|
Self {
|
||||||
name,
|
name,
|
||||||
flags: DragDropFlags::empty(),
|
flags: DragDropFlags::empty(),
|
||||||
cond: Condition::Always,
|
cond: Condition::Always,
|
||||||
|
ui,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,8 +188,8 @@ impl<T: AsRef<str>> DragDropSource<T> {
|
|||||||
/// If you want to pass a simple integer or other "plain old data", take a look at
|
/// If you want to pass a simple integer or other "plain old data", take a look at
|
||||||
/// [begin_payload](Self::begin_payload).
|
/// [begin_payload](Self::begin_payload).
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn begin<'ui>(self, ui: &Ui) -> Option<DragDropSourceToolTip<'ui>> {
|
pub fn begin(self) -> Option<DragDropSourceToolTip<'ui>> {
|
||||||
self.begin_payload(ui, ())
|
self.begin_payload(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates the source of a drag and returns a handle on the tooltip.
|
/// Creates the source of a drag and returns a handle on the tooltip.
|
||||||
@ -222,15 +235,13 @@ impl<T: AsRef<str>> DragDropSource<T> {
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn begin_payload<'ui, P: Copy + 'static>(
|
pub fn begin_payload<P: Copy + 'static>(
|
||||||
self,
|
self,
|
||||||
ui: &Ui,
|
|
||||||
payload: P,
|
payload: P,
|
||||||
) -> Option<DragDropSourceToolTip<'ui>> {
|
) -> Option<DragDropSourceToolTip<'ui>> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let payload = TypedPayload::new(payload);
|
let payload = TypedPayload::new(payload);
|
||||||
self.begin_payload_unchecked(
|
self.begin_payload_unchecked(
|
||||||
ui,
|
|
||||||
&payload as *const _ as *const ffi::c_void,
|
&payload as *const _ as *const ffi::c_void,
|
||||||
std::mem::size_of::<TypedPayload<P>>(),
|
std::mem::size_of::<TypedPayload<P>>(),
|
||||||
)
|
)
|
||||||
@ -264,16 +275,15 @@ impl<T: AsRef<str>> DragDropSource<T> {
|
|||||||
/// Overall, users should be very sure that this function is needed before they reach for it, and instead
|
/// Overall, users should be very sure that this function is needed before they reach for it, and instead
|
||||||
/// should consider either [begin](Self::begin) or [begin_payload](Self::begin_payload).
|
/// should consider either [begin](Self::begin) or [begin_payload](Self::begin_payload).
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn begin_payload_unchecked<'ui>(
|
pub unsafe fn begin_payload_unchecked(
|
||||||
&self,
|
&self,
|
||||||
ui: &Ui,
|
|
||||||
ptr: *const ffi::c_void,
|
ptr: *const ffi::c_void,
|
||||||
size: usize,
|
size: usize,
|
||||||
) -> Option<DragDropSourceToolTip<'ui>> {
|
) -> Option<DragDropSourceToolTip<'ui>> {
|
||||||
let should_begin = sys::igBeginDragDropSource(self.flags.bits() as i32);
|
let should_begin = sys::igBeginDragDropSource(self.flags.bits() as i32);
|
||||||
|
|
||||||
if should_begin {
|
if should_begin {
|
||||||
sys::igSetDragDropPayload(ui.scratch_txt(&self.name), ptr, size, self.cond as i32);
|
sys::igSetDragDropPayload(self.ui.scratch_txt(&self.name), ptr, size, self.cond as i32);
|
||||||
|
|
||||||
Some(DragDropSourceToolTip::push())
|
Some(DragDropSourceToolTip::push())
|
||||||
} else {
|
} else {
|
||||||
@ -306,6 +316,20 @@ impl Drop for DragDropSourceToolTip<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Ui {
|
||||||
|
/// Creates a new DragDropTarget, which gives methods for handling
|
||||||
|
/// accepting payloads.
|
||||||
|
#[doc(alias = "BeginDragDropTarget")]
|
||||||
|
pub fn drag_drop_target(&self) -> Option<DragDropTarget<'_>> {
|
||||||
|
let should_begin = unsafe { sys::igBeginDragDropTarget() };
|
||||||
|
if should_begin {
|
||||||
|
Some(DragDropTarget(self))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a target for drag drop data out of the last ID created.
|
/// Creates a target for drag drop data out of the last ID created.
|
||||||
///
|
///
|
||||||
/// ```no_run
|
/// ```no_run
|
||||||
@ -342,17 +366,12 @@ impl Drop for DragDropSourceToolTip<'_> {
|
|||||||
pub struct DragDropTarget<'ui>(&'ui Ui);
|
pub struct DragDropTarget<'ui>(&'ui Ui);
|
||||||
|
|
||||||
impl<'ui> DragDropTarget<'ui> {
|
impl<'ui> DragDropTarget<'ui> {
|
||||||
/// Creates a new DragDropTarget, holding the [Ui]'s lifetime for the duration
|
/// Creates a new DragDropTarget, which gives methods for handling
|
||||||
/// of its existence. This is required since this struct runs some code on its Drop
|
/// accepting payloads.
|
||||||
/// to end the DragDropTarget code.
|
|
||||||
#[doc(alias = "BeginDragDropTarget")]
|
#[doc(alias = "BeginDragDropTarget")]
|
||||||
|
#[deprecated(since = "0.9.0", note = "Use `ui.drag_drop_taget() instead")]
|
||||||
pub fn new(ui: &'ui Ui) -> Option<Self> {
|
pub fn new(ui: &'ui Ui) -> Option<Self> {
|
||||||
let should_begin = unsafe { sys::igBeginDragDropTarget() };
|
ui.drag_drop_target()
|
||||||
if should_begin {
|
|
||||||
Some(Self(ui))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Accepts an empty payload. This is the safest option for raising named events
|
/// Accepts an empty payload. This is the safest option for raising named events
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user