mirror of
https://github.com/ocornut/imgui.git
synced 2025-09-20 10:18:26 +00:00
Merge branch 'master' into docking
# Conflicts: # imgui.cpp
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
## Dear ImGui artifacts
|
## Dear ImGui artifacts
|
||||||
imgui.ini
|
imgui.ini
|
||||||
|
imgui*.ini
|
||||||
|
|
||||||
## General build artifacts
|
## General build artifacts
|
||||||
*.o
|
*.o
|
||||||
|
@@ -881,7 +881,7 @@ void ImGui_ImplSDL2_NewFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Our io.AddMouseViewportEvent() calls will only be valid when not capturing.
|
// Our io.AddMouseViewportEvent() calls will only be valid when not capturing.
|
||||||
// Technically speaking testing for 'bd->MouseButtonsDown == 0' would be more rygorous, but testing for payload reduces noise and potential side-effects.
|
// Technically speaking testing for 'bd->MouseButtonsDown == 0' would be more rigorous, but testing for payload reduces noise and potential side-effects.
|
||||||
if (bd->MouseCanReportHoveredViewport && ImGui::GetDragDropPayload() == nullptr)
|
if (bd->MouseCanReportHoveredViewport && ImGui::GetDragDropPayload() == nullptr)
|
||||||
io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
|
||||||
else
|
else
|
||||||
|
@@ -825,7 +825,7 @@ void ImGui_ImplSDL3_NewFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Our io.AddMouseViewportEvent() calls will only be valid when not capturing.
|
// Our io.AddMouseViewportEvent() calls will only be valid when not capturing.
|
||||||
// Technically speaking testing for 'bd->MouseButtonsDown == 0' would be more rygorous, but testing for payload reduces noise and potential side-effects.
|
// Technically speaking testing for 'bd->MouseButtonsDown == 0' would be more rigorous, but testing for payload reduces noise and potential side-effects.
|
||||||
if (bd->MouseCanReportHoveredViewport && ImGui::GetDragDropPayload() == nullptr)
|
if (bd->MouseCanReportHoveredViewport && ImGui::GetDragDropPayload() == nullptr)
|
||||||
io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
|
||||||
else
|
else
|
||||||
|
@@ -48,6 +48,8 @@ Breaking changes:
|
|||||||
- ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed
|
- ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed
|
||||||
- ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected
|
- ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected
|
||||||
Kept inline redirecting enums (will obsolete).
|
Kept inline redirecting enums (will obsolete).
|
||||||
|
- Drag and Drop: renamed ImGuiDragDropFlags_SourceAutoExpirePayload to
|
||||||
|
ImGuiDragDropFlags_PayloadAutoExpire. Kept inline redirecting enum (will obsolete). (#1725, #143).
|
||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
|
|
||||||
@@ -60,6 +62,16 @@ Other changes:
|
|||||||
- TabBar, Style: added ImGuiTabBarFlags_DrawSelectedOverline option to draw an horizontal
|
- TabBar, Style: added ImGuiTabBarFlags_DrawSelectedOverline option to draw an horizontal
|
||||||
line over selected tabs to increase visibility. This is used by docking.
|
line over selected tabs to increase visibility. This is used by docking.
|
||||||
Added corresponding ImGuiCol_TabSelectedOverline and ImGuiCol_TabDimmedSelectedOverline colors.
|
Added corresponding ImGuiCol_TabSelectedOverline and ImGuiCol_TabDimmedSelectedOverline colors.
|
||||||
|
- Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceExtern sets
|
||||||
|
active id so a multi-frame extern source doesn't interfere with hovered widgets. (#143)
|
||||||
|
- Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceExtern does not assume
|
||||||
|
a mouse button being pressed. Facilitate implementing cross-context drag and drop. (#143)
|
||||||
|
- Drag and Drop: Added ImGuiDragDropFlags_PayloadNoCrossContext/_PayloadNoCrossProcess flags
|
||||||
|
as metadata to specify that a payload may not be copied outside the context/process by
|
||||||
|
some logic aiming to copy payloads around.
|
||||||
|
- Drag and Drop: Fixes an issue when elapsing payload would be based on last payload
|
||||||
|
frame instead of last drag source frame, which makes a difference if not resubmitting
|
||||||
|
payload every frame. (#143)
|
||||||
- Examples: GLFW+Vulkan, SDL+Vulkan: handle swap chain resize even without Vulkan
|
- Examples: GLFW+Vulkan, SDL+Vulkan: handle swap chain resize even without Vulkan
|
||||||
returning VK_SUBOPTIMAL_KHR, which doesn't seem to happen on Wayland. (#7671)
|
returning VK_SUBOPTIMAL_KHR, which doesn't seem to happen on Wayland. (#7671)
|
||||||
[@AndreiNego, @ocornut]
|
[@AndreiNego, @ocornut]
|
||||||
|
36
imgui.cpp
36
imgui.cpp
@@ -438,6 +438,7 @@ CODE
|
|||||||
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
||||||
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
||||||
|
|
||||||
|
- 2024/06/20 (1.90.9) - renamed ImGuiDragDropFlags_SourceAutoExpirePayload to ImGuiDragDropFlags_PayloadAutoExpire.
|
||||||
- 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
|
- 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
|
||||||
- 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
|
- 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
|
||||||
- 2024/06/06 (1.90.8) - reordered ImGuiInputTextFlags values. This should not be breaking unless you are using generated headers that have values not matching the main library.
|
- 2024/06/06 (1.90.8) - reordered ImGuiInputTextFlags values. This should not be breaking unless you are using generated headers that have values not matching the main library.
|
||||||
@@ -5389,12 +5390,16 @@ void ImGui::EndFrame()
|
|||||||
if (g.DragDropActive)
|
if (g.DragDropActive)
|
||||||
{
|
{
|
||||||
bool is_delivered = g.DragDropPayload.Delivery;
|
bool is_delivered = g.DragDropPayload.Delivery;
|
||||||
bool is_elapsed = (g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceAutoExpirePayload) || !IsMouseDown(g.DragDropMouseButton));
|
bool is_elapsed = (g.DragDropSourceFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_PayloadAutoExpire) || g.DragDropMouseButton == -1 || !IsMouseDown(g.DragDropMouseButton));
|
||||||
if (is_delivered || is_elapsed)
|
if (is_delivered || is_elapsed)
|
||||||
ClearDragDrop();
|
ClearDragDrop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing.
|
// Drag and Drop: Fallback for missing source tooltip. This is not ideal but better than nothing.
|
||||||
|
// If you want to handle source item disappearing: instead of submitting your description tooltip
|
||||||
|
// in the BeginDragDropSource() block of the dragged item, you can submit them from a safe single spot
|
||||||
|
// (e.g. end of your item loop, or before EndFrame) by reading payload data.
|
||||||
|
// In the typical case, the contents of drag tooltip should be possible to infer solely from payload data.
|
||||||
if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
|
if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
|
||||||
{
|
{
|
||||||
g.DragDropWithinSource = true;
|
g.DragDropWithinSource = true;
|
||||||
@@ -13932,9 +13937,13 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// When ImGuiDragDropFlags_SourceExtern is set:
|
||||||
window = NULL;
|
window = NULL;
|
||||||
source_id = ImHashStr("#SourceExtern");
|
source_id = ImHashStr("#SourceExtern");
|
||||||
source_drag_active = true;
|
source_drag_active = true;
|
||||||
|
mouse_button = g.IO.MouseDown[0] ? 0 : -1;
|
||||||
|
KeepAliveID(source_id);
|
||||||
|
SetActiveID(source_id, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
IM_ASSERT(g.DragDropWithinTarget == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget()
|
IM_ASSERT(g.DragDropWithinTarget == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget()
|
||||||
@@ -13946,7 +13955,8 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
|
|||||||
{
|
{
|
||||||
IM_ASSERT(source_id != 0);
|
IM_ASSERT(source_id != 0);
|
||||||
ClearDragDrop();
|
ClearDragDrop();
|
||||||
IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] BeginDragDropSource() DragDropActive = true, source_id = %08X\n", source_id);
|
IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] BeginDragDropSource() DragDropActive = true, source_id = 0x%08X%s\n",
|
||||||
|
source_id, (flags & ImGuiDragDropFlags_SourceExtern) ? " (EXTERN)" : "");
|
||||||
ImGuiPayload& payload = g.DragDropPayload;
|
ImGuiPayload& payload = g.DragDropPayload;
|
||||||
payload.SourceId = source_id;
|
payload.SourceId = source_id;
|
||||||
payload.SourceParentId = source_parent_id;
|
payload.SourceParentId = source_parent_id;
|
||||||
@@ -14005,7 +14015,7 @@ bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_s
|
|||||||
IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long");
|
IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long");
|
||||||
IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0));
|
IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0));
|
||||||
IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once);
|
IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once);
|
||||||
IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource()
|
IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource()
|
||||||
|
|
||||||
if (cond == ImGuiCond_Always || payload.DataFrameCount == -1)
|
if (cond == ImGuiCond_Always || payload.DataFrameCount == -1)
|
||||||
{
|
{
|
||||||
@@ -14132,11 +14142,15 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
|
|||||||
RenderDragDropTargetRect(r, g.DragDropTargetClipRect);
|
RenderDragDropTargetRect(r, g.DragDropTargetClipRect);
|
||||||
|
|
||||||
g.DragDropAcceptFrameCount = g.FrameCount;
|
g.DragDropAcceptFrameCount = g.FrameCount;
|
||||||
payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased()
|
if ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) && g.DragDropMouseButton == -1)
|
||||||
|
payload.Delivery = was_accepted_previously && (g.DragDropSourceFrameCount < g.FrameCount);
|
||||||
|
else
|
||||||
|
payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased()
|
||||||
if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery))
|
if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
//IMGUI_DEBUG_LOG("AcceptDragDropPayload(): %08X: return payload\n", g.DragDropTargetId);
|
if (payload.Delivery)
|
||||||
|
IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] AcceptDragDropPayload(): 0x%08X: payload delivery\n", g.DragDropTargetId);
|
||||||
return &payload;
|
return &payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20197,6 +20211,11 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
|
|
||||||
// Basic info
|
// Basic info
|
||||||
Text("Dear ImGui %s", GetVersion());
|
Text("Dear ImGui %s", GetVersion());
|
||||||
|
if (g.ContextName[0] != 0)
|
||||||
|
{
|
||||||
|
SameLine();
|
||||||
|
Text("(Context Name: \"%s\")", g.ContextName);
|
||||||
|
}
|
||||||
Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
|
Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
|
||||||
Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
|
Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
|
||||||
Text("%d visible windows, %d current allocations", io.MetricsRenderWindows, g.DebugAllocInfo.TotalAllocCount - g.DebugAllocInfo.TotalFreeCount);
|
Text("%d visible windows, %d current allocations", io.MetricsRenderWindows, g.DebugAllocInfo.TotalAllocCount - g.DebugAllocInfo.TotalFreeCount);
|
||||||
@@ -21451,7 +21470,10 @@ void ImGui::DebugLogV(const char* fmt, va_list args)
|
|||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
const int old_size = g.DebugLogBuf.size();
|
const int old_size = g.DebugLogBuf.size();
|
||||||
g.DebugLogBuf.appendf("[%05d] ", g.FrameCount);
|
if (g.ContextName[0] != 0)
|
||||||
|
g.DebugLogBuf.appendf("[%s] [%05d] ", g.ContextName, g.FrameCount);
|
||||||
|
else
|
||||||
|
g.DebugLogBuf.appendf("[%05d] ", g.FrameCount);
|
||||||
g.DebugLogBuf.appendfv(fmt, args);
|
g.DebugLogBuf.appendfv(fmt, args);
|
||||||
g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size());
|
g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size());
|
||||||
if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY)
|
if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY)
|
||||||
|
8
imgui.h
8
imgui.h
@@ -1360,12 +1360,18 @@ enum ImGuiDragDropFlags_
|
|||||||
ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
|
ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
|
||||||
ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() 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.
|
ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() 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.
|
||||||
ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
|
ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
|
||||||
ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
|
ImGuiDragDropFlags_PayloadAutoExpire = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
|
||||||
|
ImGuiDragDropFlags_PayloadNoCrossContext = 1 << 6, // Hint to specify that the payload may not be copied outside current dear imgui context.
|
||||||
|
ImGuiDragDropFlags_PayloadNoCrossProcess = 1 << 7, // Hint to specify that the payload may not be copied outside current process.
|
||||||
// AcceptDragDropPayload() flags
|
// AcceptDragDropPayload() flags
|
||||||
ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
|
ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
|
||||||
ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target.
|
ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target.
|
||||||
ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site.
|
ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site.
|
||||||
ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect, // For peeking ahead and inspecting the payload before delivery.
|
ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect, // For peeking ahead and inspecting the payload before delivery.
|
||||||
|
|
||||||
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
|
ImGuiDragDropFlags_SourceAutoExpirePayload = ImGuiDragDropFlags_PayloadAutoExpire, // Renamed in 1.90.9
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui.
|
// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui.
|
||||||
|
@@ -2135,6 +2135,7 @@ struct ImGuiContext
|
|||||||
bool GcCompactAll; // Request full GC
|
bool GcCompactAll; // Request full GC
|
||||||
bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
|
bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
|
||||||
void* TestEngine; // Test engine user data
|
void* TestEngine; // Test engine user data
|
||||||
|
char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)
|
||||||
|
|
||||||
// Inputs
|
// Inputs
|
||||||
ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
|
ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
|
||||||
@@ -2479,6 +2480,7 @@ struct ImGuiContext
|
|||||||
GcCompactAll = false;
|
GcCompactAll = false;
|
||||||
TestEngineHookItems = false;
|
TestEngineHookItems = false;
|
||||||
TestEngine = NULL;
|
TestEngine = NULL;
|
||||||
|
memset(ContextName, 0, sizeof(ContextName));
|
||||||
|
|
||||||
InputEventsNextMouseSource = ImGuiMouseSource_Mouse;
|
InputEventsNextMouseSource = ImGuiMouseSource_Mouse;
|
||||||
InputEventsNextEventId = 1;
|
InputEventsNextEventId = 1;
|
||||||
|
Reference in New Issue
Block a user