diff --git a/imgui-sys/Cargo.toml b/imgui-sys/Cargo.toml index bbc0fe1..40488d7 100644 --- a/imgui-sys/Cargo.toml +++ b/imgui-sys/Cargo.toml @@ -13,6 +13,7 @@ build = "build.rs" travis-ci = { repository = "Gekkio/imgui-rs" } [dependencies] +libc = "0.2" bitflags = "1.0" glium = { version = "0.21", default-features = false, optional = true } gfx = { version = "0.17", optional = true } diff --git a/imgui-sys/src/lib.rs b/imgui-sys/src/lib.rs index ca06bbf..146e695 100644 --- a/imgui-sys/src/lib.rs +++ b/imgui-sys/src/lib.rs @@ -3,6 +3,8 @@ #[macro_use] extern crate bitflags; +extern crate libc; + #[cfg(feature = "gfx")] #[macro_use] extern crate gfx; @@ -380,6 +382,46 @@ bitflags!( } ); +bitflags!( + /// Flags for igBeginDragDropSource(), igAcceptDragDropPayload() + #[repr(C)] + pub struct ImGuiDragDropFlags: c_int { + // BeginDragDropSource() flags + /// By default, a successful call to igBeginDragDropSource opens a + /// tooltip so you can display a preview or description of the source + /// contents. This flag disable this behavior. + const SourceNoPreviewTooltip = 1 << 0; + /// By default, when dragging we clear data so that igIsItemHovered() + /// will return true, to avoid subsequent user code submitting tooltips. + /// This flag disable this behavior so you can still call + /// igIsItemHovered() on the source item. + const SourceNoDisableHover = 1 << 1; + /// Disable the behavior that allows to open tree nodes and collapsing + /// header by holding over them while dragging a source item. + const SourceNoHoldToOpenOthers = 1 << 2; + /// Allow items such as igText(), igImage() that have no unique + /// identifier to be used as drag source, by manufacturing a temporary + /// identifier based on their window-relative position. This is + /// extremely unusual within the dear imgui ecosystem and so we made it + /// explicit. + const SourceAllowNullID = 1 << 3; + /// External source (from outside of imgui), won't attempt to read + /// current item/window info. Will always return true. Only one Extern + /// source can be active simultaneously. + const SourceExtern = 1 << 4; + // AcceptDragDropPayload() flags + /// igAcceptDragDropPayload() will returns true even before the mouse + /// button is released. You can then call igIsDelivery() to test if the + /// payload needs to be delivered. + const AcceptBeforeDelivery = 1 << 10; + /// Do not draw the default highlight rectangle when hovering over target. + const AcceptNoDrawDefaultRect = 1 << 11; + /// For peeking ahead and inspecting the payload before delivery. + const AcceptPeekOnly = ImGuiDragDropFlags::AcceptBeforeDelivery.bits + | ImGuiDragDropFlags::AcceptNoDrawDefaultRect.bits; + } +); + bitflags!( /// Flags for indictating which corner of a rectangle should be rounded #[repr(C)] @@ -672,6 +714,28 @@ pub struct ImGuiTextFilter { pub count_grep: c_int, } +/// Data payload for Drag and Drop operations +#[repr(C)] +pub struct ImGuiPayload { + /// Data (copied and owned by dear imgui) + pub data: *const c_void, + /// Data size + pub data_size: c_int, + + /// Source item id + source_id: ImGuiID, + /// Source parent id (if available) + source_parent_id: ImGuiID, + /// Data timestamp + data_frame_count: c_int, + /// Data type tag (short user-supplied string) + data_type: [c_char; 8 + 1], + /// Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) + preview: bool, + /// Set when AcceptDragDropPayload() was called and mouse button is released over the target item. + delivery: bool, +} + #[repr(C)] pub struct ImGuiTextBuffer { pub buf: ImVector, @@ -1687,6 +1751,24 @@ extern "C" { pub fn igLogText(fmt: *const c_char, ...); } +// DragDrop +extern "C" { + /// Call when current ID is active. + /// + /// When this returns true you need to: + /// + /// 1. call [`igSetDragDropPayload`] exactly once, + /// 2. you may render the payload visual/description, + /// 3. pcall [`igEndDragDropSource`] + pub fn igBeginDragDropSource(flags: ImGuiDragDropFlags, mouse_button: c_int) -> bool; + /// Use 'cond' to choose to submit payload on drag start or every frame + pub fn igSetDragDropPayload(type_: *const c_char, data: *const c_void, size: libc::size_t, cond: ImGuiCond) -> bool; + pub fn igEndDragDropSource(); + pub fn igBeginDragDropTarget() -> bool; + pub fn igAcceptDragDropPayload(type_: *const c_char, flags: ImGuiDragDropFlags) -> *const ImGuiPayload; + pub fn igEndDragDropTarget(); +} + // Clipping extern "C" { pub fn igPushClipRect(