mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-27 16:29:02 +08:00
As long as the item has an ID (for ID-less items will add new functionalities later.
Amend 2c3c5125
This commit is contained in:
parent
e842b196df
commit
954b06afe2
@ -49,7 +49,7 @@ Other Changes:
|
||||
- Window: Shrink close button hit-testing region when it covers an abnormally high portion of the window visible
|
||||
area (e.g. when window is collapsed + moved in a corner) to facilitate moving the window away. (#3825)
|
||||
- Window, Nav: Fixed crash when calling SetWindowFocus(NULL) as the time a new window appears. (#3865) [@nem0]
|
||||
- DragScalar: Fixed crash when using DragScalar() directly (not via common wrapper like DragFloat() etc.)
|
||||
- Drags: Fixed crash when using DragScalar() directly (not via common wrapper like DragFloat() etc.)
|
||||
with ImGuiSliderFlags_AlwaysClamp + only one of either p_min or p_max set. (#3824) [@harry75369]
|
||||
- Drags, Sliders: Fixed a bug where editing value would use wrong number if there were digits right after
|
||||
format specifier (e.g. using "%f123" as a format string). [@rokups]
|
||||
@ -59,6 +59,8 @@ Other Changes:
|
||||
- IsItemHovered(): fixed return value false positive when used after EndChild(), EndGroup() or widgets using
|
||||
either of them, when the hovered location is located within a child window, e.g. InputTextMultiline().
|
||||
This is intended to have no side effects, but brace yourself for the possible comeback.. (#3851, #1370)
|
||||
- Drag and Drop: can use BeginDragDropSource() for other than the left mouse button as long as the item
|
||||
has an ID (for ID-less items will add new functionalities later). (#1637, #3885)
|
||||
- Added GetAllocatorFunctions() to facilitate sharing allocators accross DLL boundaries. (#3836)
|
||||
- ImFontAtlas: Added 'bool TexPixelsUseColors' output to help backend decide of underlying texture format. (#3369)
|
||||
This can currently only ever be set by the Freetype renderer.
|
||||
|
41
imgui.cpp
41
imgui.cpp
@ -3024,6 +3024,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
||||
g.ActiveIdTimer = 0.0f;
|
||||
g.ActiveIdHasBeenPressedBefore = false;
|
||||
g.ActiveIdHasBeenEditedBefore = false;
|
||||
g.ActiveIdMouseButton = -1;
|
||||
if (id != 0)
|
||||
{
|
||||
g.LastActiveId = id;
|
||||
@ -9643,27 +9644,45 @@ void ImGui::ClearDragDrop()
|
||||
memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal));
|
||||
}
|
||||
|
||||
// Call when current ID is active.
|
||||
// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource()
|
||||
// If the item has an identifier:
|
||||
// - This assume/require the item to be activated (typically via ButtonBehavior).
|
||||
// - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button.
|
||||
// - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag.
|
||||
// If the item has no identifier:
|
||||
// - Currently always assume left mouse button.
|
||||
bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
ImGuiWindow* window = g.CurrentWindow;
|
||||
|
||||
// FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button,
|
||||
// in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic).
|
||||
ImGuiMouseButton mouse_button = ImGuiMouseButton_Left;
|
||||
|
||||
bool source_drag_active = false;
|
||||
ImGuiID source_id = 0;
|
||||
ImGuiID source_parent_id = 0;
|
||||
ImGuiMouseButton mouse_button = ImGuiMouseButton_Left;
|
||||
if (!(flags & ImGuiDragDropFlags_SourceExtern))
|
||||
{
|
||||
source_id = window->DC.LastItemId;
|
||||
if (source_id != 0 && g.ActiveId != source_id) // Early out for most common case
|
||||
return false;
|
||||
if (g.IO.MouseDown[mouse_button] == false)
|
||||
return false;
|
||||
|
||||
if (source_id == 0)
|
||||
if (source_id != 0)
|
||||
{
|
||||
// Common path: items with ID
|
||||
if (g.ActiveId != source_id)
|
||||
return false;
|
||||
if (g.ActiveIdMouseButton != -1)
|
||||
mouse_button = g.ActiveIdMouseButton;
|
||||
if (g.IO.MouseDown[mouse_button] == false)
|
||||
return false;
|
||||
g.ActiveIdAllowOverlap = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Uncommon path: items without ID
|
||||
if (g.IO.MouseDown[mouse_button] == false)
|
||||
return false;
|
||||
|
||||
// If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to:
|
||||
// A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride.
|
||||
if (!(flags & ImGuiDragDropFlags_SourceAllowNullID))
|
||||
@ -9690,10 +9709,6 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
|
||||
if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker.
|
||||
g.ActiveIdAllowOverlap = is_hovered;
|
||||
}
|
||||
else
|
||||
{
|
||||
g.ActiveIdAllowOverlap = false;
|
||||
}
|
||||
if (g.ActiveId != source_id)
|
||||
return false;
|
||||
source_parent_id = window->IDStack.back();
|
||||
@ -9896,7 +9911,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
|
||||
flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame)
|
||||
if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview)
|
||||
{
|
||||
// FIXME-DRAG: Settle on a proper default visuals for drop target.
|
||||
// FIXME-DRAGDROP: Settle on a proper default visuals for drop target.
|
||||
r.Expand(3.5f);
|
||||
bool push_clip_rect = !window->ClipRect.Contains(r);
|
||||
if (push_clip_rect) window->DrawList->PushClipRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1));
|
||||
|
7
imgui.h
7
imgui.h
@ -755,8 +755,11 @@ namespace ImGui
|
||||
IMGUI_API void LogTextV(const char* fmt, va_list args) IM_FMTLIST(1);
|
||||
|
||||
// Drag and Drop
|
||||
// - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip as replacement)
|
||||
IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource()
|
||||
// - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource().
|
||||
// - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget().
|
||||
// - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725)
|
||||
// - An item can be both drag source and drop target.
|
||||
IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource()
|
||||
IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui.
|
||||
IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true!
|
||||
IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget()
|
||||
|
@ -1568,7 +1568,7 @@ struct ImGuiContext
|
||||
ActiveIdClickOffset = ImVec2(-1, -1);
|
||||
ActiveIdWindow = NULL;
|
||||
ActiveIdSource = ImGuiInputSource_None;
|
||||
ActiveIdMouseButton = 0;
|
||||
ActiveIdMouseButton = -1;
|
||||
ActiveIdPreviousFrame = 0;
|
||||
ActiveIdPreviousFrameIsAlive = false;
|
||||
ActiveIdPreviousFrameHasBeenEditedBefore = false;
|
||||
|
Loading…
Reference in New Issue
Block a user