mirror of
https://github.com/ocornut/imgui.git
synced 2025-10-08 19:16:29 +00:00
Merge branch 'master' into docking
# Conflicts: # imgui.cpp
This commit is contained in:
@@ -62,6 +62,9 @@ Breaking changes:
|
|||||||
- Backends: Vulkan: Added 'uint32_t api_version' argument to ImGui_ImplVulkan_LoadFunctions().
|
- Backends: Vulkan: Added 'uint32_t api_version' argument to ImGui_ImplVulkan_LoadFunctions().
|
||||||
Note that it was also added to ImGui_ImplVulkan_InitInfo but for the later it is optional.
|
Note that it was also added to ImGui_ImplVulkan_InitInfo but for the later it is optional.
|
||||||
(#8326, #8365, #8400)
|
(#8326, #8365, #8400)
|
||||||
|
- Internals: Menus: reworked mangling of menu windows to use "###Menu_00" etc. instead
|
||||||
|
of "##Menu_00", allowing them to also store the menu name before it. This shouldn't
|
||||||
|
affect code unless directly accessing menu window from their mangled name.
|
||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
|
|
||||||
@@ -103,16 +106,21 @@ Other changes:
|
|||||||
(#8451, #7660) [@achabense]
|
(#8451, #7660) [@achabense]
|
||||||
- TextLinkOpenURL(): fixed default Win32 io.PlatformOpenInShellFn handler to
|
- TextLinkOpenURL(): fixed default Win32 io.PlatformOpenInShellFn handler to
|
||||||
handle UTF-8 regardless of system regional settings. (#7660) [@achabense]
|
handle UTF-8 regardless of system regional settings. (#7660) [@achabense]
|
||||||
|
- Disabled: Fixed an issue restoring Alpha in EndDisabled() when using nested
|
||||||
|
BeginDisabled() calls with PushStyleVar(ImGuiStyleVar_DisabledAlpha) within. (#8454, #7640)
|
||||||
- Clipper: Fixed an issue where passing an out of bound index to IncludeItemByIndex()
|
- Clipper: Fixed an issue where passing an out of bound index to IncludeItemByIndex()
|
||||||
could incorrectly offset the final cursor, even if that index was not iterated through.
|
could incorrectly offset the final cursor, even if that index was not iterated through.
|
||||||
One case where it would manifest was calling Combo() with an out of range index. (#8450)
|
One case where it would manifest was calling Combo() with an out of range index. (#8450)
|
||||||
- Debug Tools: Added io.ConfigDebugHighlightIdConflictsShowItemPicker (defaults to true)
|
- Debug Tools: Added io.ConfigDebugHighlightIdConflictsShowItemPicker (defaults to true)
|
||||||
to allow disabled Item Picker suggestion in user facing builds. (#7961, #7669)
|
to allow disabled Item Picker suggestion in user facing builds. (#7961, #7669)
|
||||||
|
- Debug Tools: Tweaked layout of ID Stack Tool and always display full path. (#4631)
|
||||||
- Misc: Added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress mouse cursors
|
- Misc: Added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress mouse cursors
|
||||||
(busy/wait/hourglass shape, with or without an arrow cursor).
|
(busy/wait/hourglass shape, with or without an arrow cursor).
|
||||||
- Demo: Reorganized "Widgets" section to be alphabetically ordered and split in more functions.
|
- Demo: Reorganized "Widgets" section to be alphabetically ordered and split in more functions.
|
||||||
- Demo: Combos: demonstrate a very simple way to add a filter to a combo,
|
- Demo: Combos: demonstrate a very simple way to add a filter to a combo,
|
||||||
by showing the filter inside the combo contents. (#718)
|
by showing the filter inside the combo contents. (#718)
|
||||||
|
- Examples: SDL3: Added comments to clarify setup for users of the unfortunate
|
||||||
|
SDL_MAIN_USE_CALLBACKS feature. (#8455)
|
||||||
- Backends: GLFW: Fixed clipboard handler assertion when using GLFW <= 3.2.1 compiled
|
- Backends: GLFW: Fixed clipboard handler assertion when using GLFW <= 3.2.1 compiled
|
||||||
with asserts enabled. (#8452)
|
with asserts enabled. (#8452)
|
||||||
- Backends: SDL2, SDL3: Using SDL_OpenURL() in platform_io.Platform_OpenInShellFn
|
- Backends: SDL2, SDL3: Using SDL_OpenURL() in platform_io.Platform_OpenInShellFn
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below until the main loop starts would likely be your SDL_AppInit() function]
|
||||||
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
||||||
{
|
{
|
||||||
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
||||||
@@ -151,6 +152,7 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: call ImGui_ImplSDL3_ProcessEvent() from your SDL_AppEvent() function]
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
@@ -160,6 +162,8 @@ int main(int, char**)
|
|||||||
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppIterate() function]
|
||||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
||||||
{
|
{
|
||||||
SDL_Delay(10);
|
SDL_Delay(10);
|
||||||
@@ -234,6 +238,7 @@ int main(int, char**)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppQuit() function]
|
||||||
ImGui_ImplOpenGL3_Shutdown();
|
ImGui_ImplOpenGL3_Shutdown();
|
||||||
ImGui_ImplSDL3_Shutdown();
|
ImGui_ImplSDL3_Shutdown();
|
||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
@@ -26,7 +26,8 @@
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD) != 0)
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below until the main loop starts would likely be your SDL_AppInit() function]
|
||||||
|
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
||||||
{
|
{
|
||||||
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
||||||
return -1;
|
return -1;
|
||||||
@@ -105,6 +106,7 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: call ImGui_ImplSDL3_ProcessEvent() from your SDL_AppEvent() function]
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
@@ -114,6 +116,8 @@ int main(int, char**)
|
|||||||
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppIterate() function]
|
||||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
||||||
{
|
{
|
||||||
SDL_Delay(10);
|
SDL_Delay(10);
|
||||||
@@ -199,6 +203,7 @@ int main(int, char**)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppQuit() function]
|
||||||
SDL_WaitForGPUIdle(gpu_device);
|
SDL_WaitForGPUIdle(gpu_device);
|
||||||
ImGui_ImplSDL3_Shutdown();
|
ImGui_ImplSDL3_Shutdown();
|
||||||
ImGui_ImplSDLGPU3_Shutdown();
|
ImGui_ImplSDLGPU3_Shutdown();
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below until the main loop starts would likely be your SDL_AppInit() function]
|
||||||
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
||||||
{
|
{
|
||||||
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
||||||
@@ -102,6 +103,7 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: call ImGui_ImplSDL3_ProcessEvent() from your SDL_AppEvent() function]
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
@@ -111,6 +113,8 @@ int main(int, char**)
|
|||||||
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppIterate() function]
|
||||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
||||||
{
|
{
|
||||||
SDL_Delay(10);
|
SDL_Delay(10);
|
||||||
@@ -172,6 +176,7 @@ int main(int, char**)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppQuit() function]
|
||||||
ImGui_ImplSDLRenderer3_Shutdown();
|
ImGui_ImplSDLRenderer3_Shutdown();
|
||||||
ImGui_ImplSDL3_Shutdown();
|
ImGui_ImplSDL3_Shutdown();
|
||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
@@ -345,7 +345,8 @@ static void FramePresent(ImGui_ImplVulkanH_Window* wd)
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD) != 0)
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below until the main loop starts would likely be your SDL_AppInit() function]
|
||||||
|
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD))
|
||||||
{
|
{
|
||||||
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
printf("Error: SDL_Init(): %s\n", SDL_GetError());
|
||||||
return -1;
|
return -1;
|
||||||
@@ -459,6 +460,7 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: call ImGui_ImplSDL3_ProcessEvent() from your SDL_AppEvent() function]
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
@@ -468,6 +470,8 @@ int main(int, char**)
|
|||||||
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window))
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppIterate() function]
|
||||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)
|
||||||
{
|
{
|
||||||
SDL_Delay(10);
|
SDL_Delay(10);
|
||||||
@@ -551,6 +555,7 @@ int main(int, char**)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
// [If using SDL_MAIN_USE_CALLBACKS: all code below would likely be your SDL_AppQuit() function]
|
||||||
err = vkDeviceWaitIdle(g_Device);
|
err = vkDeviceWaitIdle(g_Device);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
ImGui_ImplVulkan_Shutdown();
|
ImGui_ImplVulkan_Shutdown();
|
||||||
|
84
imgui.cpp
84
imgui.cpp
@@ -439,6 +439,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.
|
||||||
|
|
||||||
|
- 2025/03/05 (1.91.9) - BeginMenu(): Internals: reworked mangling of menu windows to use "###Menu_00" etc. instead of "##Menu_00", allowing them to also store the menu name before it. This shouldn't affect code unless directly accessing menu window from their mangled name.
|
||||||
- 2025/02/27 (1.91.9) - Image(): removed 'tint_col' and 'border_col' parameter from Image() function. Added ImageWithBg() replacement. (#8131, #8238)
|
- 2025/02/27 (1.91.9) - Image(): removed 'tint_col' and 'border_col' parameter from Image() function. Added ImageWithBg() replacement. (#8131, #8238)
|
||||||
- old: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 tint_col = (1,1,1,1), ImVec4 border_col = (0,0,0,0));
|
- old: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 tint_col = (1,1,1,1), ImVec4 border_col = (0,0,0,0));
|
||||||
- new: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1));
|
- new: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1));
|
||||||
@@ -7500,6 +7501,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
window_stack_data.Window = window;
|
window_stack_data.Window = window;
|
||||||
window_stack_data.ParentLastItemDataBackup = g.LastItemData;
|
window_stack_data.ParentLastItemDataBackup = g.LastItemData;
|
||||||
window_stack_data.DisabledOverrideReenable = (flags & ImGuiWindowFlags_Tooltip) && (g.CurrentItemFlags & ImGuiItemFlags_Disabled);
|
window_stack_data.DisabledOverrideReenable = (flags & ImGuiWindowFlags_Tooltip) && (g.CurrentItemFlags & ImGuiItemFlags_Disabled);
|
||||||
|
window_stack_data.DisabledOverrideReenableAlphaBackup = 0.0f;
|
||||||
ErrorRecoveryStoreState(&window_stack_data.StackSizesInBegin);
|
ErrorRecoveryStoreState(&window_stack_data.StackSizesInBegin);
|
||||||
g.StackSizesInBeginForCurrentWindow = &window_stack_data.StackSizesInBegin;
|
g.StackSizesInBeginForCurrentWindow = &window_stack_data.StackSizesInBegin;
|
||||||
if (flags & ImGuiWindowFlags_ChildMenu)
|
if (flags & ImGuiWindowFlags_ChildMenu)
|
||||||
@@ -7637,7 +7639,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
bool window_title_visible_elsewhere = false;
|
bool window_title_visible_elsewhere = false;
|
||||||
if ((window->Viewport && window->Viewport->Window == window) || (window->DockIsActive))
|
if ((window->Viewport && window->Viewport->Window == window) || (window->DockIsActive))
|
||||||
window_title_visible_elsewhere = true;
|
window_title_visible_elsewhere = true;
|
||||||
else if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB
|
else if (g.NavWindowingListWindow != NULL && (flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB
|
||||||
|
window_title_visible_elsewhere = true;
|
||||||
|
else if (flags & ImGuiWindowFlags_ChildMenu)
|
||||||
window_title_visible_elsewhere = true;
|
window_title_visible_elsewhere = true;
|
||||||
if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0)
|
if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0)
|
||||||
{
|
{
|
||||||
@@ -8513,6 +8517,7 @@ void ImGui::BeginDisabledOverrideReenable()
|
|||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
IM_ASSERT(g.CurrentItemFlags & ImGuiItemFlags_Disabled);
|
IM_ASSERT(g.CurrentItemFlags & ImGuiItemFlags_Disabled);
|
||||||
|
g.CurrentWindowStack.back().DisabledOverrideReenableAlphaBackup = g.Style.Alpha;
|
||||||
g.Style.Alpha = g.DisabledAlphaBackup;
|
g.Style.Alpha = g.DisabledAlphaBackup;
|
||||||
g.CurrentItemFlags &= ~ImGuiItemFlags_Disabled;
|
g.CurrentItemFlags &= ~ImGuiItemFlags_Disabled;
|
||||||
g.ItemFlagsStack.push_back(g.CurrentItemFlags);
|
g.ItemFlagsStack.push_back(g.CurrentItemFlags);
|
||||||
@@ -8526,7 +8531,7 @@ void ImGui::EndDisabledOverrideReenable()
|
|||||||
IM_ASSERT(g.DisabledStackSize > 0);
|
IM_ASSERT(g.DisabledStackSize > 0);
|
||||||
g.ItemFlagsStack.pop_back();
|
g.ItemFlagsStack.pop_back();
|
||||||
g.CurrentItemFlags = g.ItemFlagsStack.back();
|
g.CurrentItemFlags = g.ItemFlagsStack.back();
|
||||||
g.Style.Alpha = g.DisabledAlphaBackup * g.Style.DisabledAlpha;
|
g.Style.Alpha = g.CurrentWindowStack.back().DisabledOverrideReenableAlphaBackup;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::PushTextWrapPos(float wrap_pos_x)
|
void ImGui::PushTextWrapPos(float wrap_pos_x)
|
||||||
@@ -12379,17 +12384,32 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char name[20];
|
char name[20];
|
||||||
if (extra_window_flags & ImGuiWindowFlags_ChildMenu)
|
IM_ASSERT((extra_window_flags & ImGuiWindowFlags_ChildMenu) == 0); // Use BeginPopupMenuEx()
|
||||||
ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuDepth); // Recycle windows based on depth
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // No recycling, so we can close/open during the same frame
|
||||||
else
|
|
||||||
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
|
|
||||||
|
|
||||||
bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoDocking);
|
bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoDocking);
|
||||||
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
|
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
|
||||||
EndPopup();
|
EndPopup();
|
||||||
|
|
||||||
//g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack;
|
//g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack;
|
||||||
|
return is_open;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui::BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (!IsPopupOpen(id, ImGuiPopupFlags_None))
|
||||||
|
{
|
||||||
|
g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char name[128];
|
||||||
|
IM_ASSERT(extra_window_flags & ImGuiWindowFlags_ChildMenu);
|
||||||
|
ImFormatString(name, IM_ARRAYSIZE(name), "%s###Menu_%02d", label, g.BeginMenuDepth); // Recycle windows based on depth
|
||||||
|
bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup);
|
||||||
|
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
|
||||||
|
EndPopup();
|
||||||
|
//g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack;
|
||||||
return is_open;
|
return is_open;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22788,42 +22808,44 @@ void ImGui::ShowIDStackToolWindow(bool* p_open)
|
|||||||
|
|
||||||
// Display hovered/active status
|
// Display hovered/active status
|
||||||
ImGuiIDStackTool* tool = &g.DebugIDStackTool;
|
ImGuiIDStackTool* tool = &g.DebugIDStackTool;
|
||||||
const ImGuiID hovered_id = g.HoveredIdPreviousFrame;
|
|
||||||
const ImGuiID active_id = g.ActiveId;
|
// Build and display path
|
||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
tool->ResultPathBuf.resize(0);
|
||||||
Text("HoveredId: 0x%08X (\"%s\"), ActiveId: 0x%08X (\"%s\")", hovered_id, hovered_id ? ImGuiTestEngine_FindItemDebugLabel(&g, hovered_id) : "", active_id, active_id ? ImGuiTestEngine_FindItemDebugLabel(&g, active_id) : "");
|
for (int stack_n = 0; stack_n < tool->Results.Size; stack_n++)
|
||||||
#else
|
{
|
||||||
Text("HoveredId: 0x%08X, ActiveId: 0x%08X", hovered_id, active_id);
|
char level_desc[256];
|
||||||
#endif
|
StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc));
|
||||||
|
tool->ResultPathBuf.append(stack_n == 0 ? "//" : "/");
|
||||||
|
for (int n = 0; level_desc[n]; n++)
|
||||||
|
{
|
||||||
|
if (level_desc[n] == '/')
|
||||||
|
tool->ResultPathBuf.append("\\");
|
||||||
|
tool->ResultPathBuf.append(level_desc + n, level_desc + n + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Text("0x%08X", tool->QueryId);
|
||||||
SameLine();
|
SameLine();
|
||||||
MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details.");
|
MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details.");
|
||||||
|
|
||||||
// CTRL+C to copy path
|
// CTRL+C to copy path
|
||||||
const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime;
|
const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime;
|
||||||
Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC);
|
SameLine();
|
||||||
|
PushStyleVarY(ImGuiStyleVar_FramePadding, 0.0f); Checkbox("Ctrl+C: copy path", &tool->CopyToClipboardOnCtrlC); PopStyleVar();
|
||||||
SameLine();
|
SameLine();
|
||||||
TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*");
|
TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*");
|
||||||
if (tool->CopyToClipboardOnCtrlC && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused))
|
if (tool->CopyToClipboardOnCtrlC && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused))
|
||||||
{
|
{
|
||||||
tool->CopyToClipboardLastTime = (float)g.Time;
|
tool->CopyToClipboardLastTime = (float)g.Time;
|
||||||
char* p = g.TempBuffer.Data;
|
SetClipboardText(tool->ResultPathBuf.c_str());
|
||||||
char* p_end = p + g.TempBuffer.Size;
|
|
||||||
for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++)
|
|
||||||
{
|
|
||||||
*p++ = '/';
|
|
||||||
char level_desc[256];
|
|
||||||
StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc));
|
|
||||||
for (int n = 0; level_desc[n] && p + 2 < p_end; n++)
|
|
||||||
{
|
|
||||||
if (level_desc[n] == '/')
|
|
||||||
*p++ = '\\';
|
|
||||||
*p++ = level_desc[n];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*p = '\0';
|
|
||||||
SetClipboardText(g.TempBuffer.Data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Text("- Path \"%s\"", tool->ResultPathBuf.c_str());
|
||||||
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
|
Text("- Label \"%s\"", tool->QueryId ? ImGuiTestEngine_FindItemDebugLabel(&g, tool->QueryId) : "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Separator();
|
||||||
|
|
||||||
// Display decorated stack
|
// Display decorated stack
|
||||||
tool->LastActiveFrame = g.FrameCount;
|
tool->LastActiveFrame = g.FrameCount;
|
||||||
if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders))
|
if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders))
|
||||||
|
5
imgui.h
5
imgui.h
@@ -29,7 +29,7 @@
|
|||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
||||||
#define IMGUI_VERSION "1.91.9 WIP"
|
#define IMGUI_VERSION "1.91.9 WIP"
|
||||||
#define IMGUI_VERSION_NUM 19186
|
#define IMGUI_VERSION_NUM 19187
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
||||||
#define IMGUI_HAS_DOCK // Docking WIP branch
|
#define IMGUI_HAS_DOCK // Docking WIP branch
|
||||||
@@ -2715,10 +2715,11 @@ struct ImGuiTextBuffer
|
|||||||
ImGuiTextBuffer() { }
|
ImGuiTextBuffer() { }
|
||||||
inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
|
inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
|
||||||
const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; }
|
const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; }
|
||||||
const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator
|
const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator
|
||||||
int size() const { return Buf.Size ? Buf.Size - 1 : 0; }
|
int size() const { return Buf.Size ? Buf.Size - 1 : 0; }
|
||||||
bool empty() const { return Buf.Size <= 1; }
|
bool empty() const { return Buf.Size <= 1; }
|
||||||
void clear() { Buf.clear(); }
|
void clear() { Buf.clear(); }
|
||||||
|
void resize(int size) { if (Buf.Size > size) Buf.Data[size] = 0; Buf.resize(size ? size + 1 : 0, 0); } // Similar to resize(0) on ImVector: empty string but don't free buffer.
|
||||||
void reserve(int capacity) { Buf.reserve(capacity); }
|
void reserve(int capacity) { Buf.reserve(capacity); }
|
||||||
const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; }
|
const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; }
|
||||||
IMGUI_API void append(const char* str, const char* str_end = NULL);
|
IMGUI_API void append(const char* str, const char* str_end = NULL);
|
||||||
|
293
imgui_demo.cpp
293
imgui_demo.cpp
@@ -70,10 +70,9 @@ Index of this file:
|
|||||||
|
|
||||||
// [SECTION] Forward Declarations
|
// [SECTION] Forward Declarations
|
||||||
// [SECTION] Helpers
|
// [SECTION] Helpers
|
||||||
// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor & Multi-Select demos)
|
|
||||||
// [SECTION] Demo Window / ShowDemoWindow()
|
// [SECTION] Demo Window / ShowDemoWindow()
|
||||||
// [SECTION] DemoWindowMenuBar()
|
// [SECTION] DemoWindowMenuBar()
|
||||||
// [SECTION] DemoWindowWidgets()
|
// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor & Multi-Select demos)
|
||||||
// [SECTION] DemoWindowWidgetsBasic()
|
// [SECTION] DemoWindowWidgetsBasic()
|
||||||
// [SECTION] DemoWindowWidgetsBullets()
|
// [SECTION] DemoWindowWidgetsBullets()
|
||||||
// [SECTION] DemoWindowWidgetsCollapsingHeaders()
|
// [SECTION] DemoWindowWidgetsCollapsingHeaders()
|
||||||
@@ -98,6 +97,7 @@ Index of this file:
|
|||||||
// [SECTION] DemoWindowWidgetsTooltips()
|
// [SECTION] DemoWindowWidgetsTooltips()
|
||||||
// [SECTION] DemoWindowWidgetsTreeNodes()
|
// [SECTION] DemoWindowWidgetsTreeNodes()
|
||||||
// [SECTION] DemoWindowWidgetsVerticalSliders()
|
// [SECTION] DemoWindowWidgetsVerticalSliders()
|
||||||
|
// [SECTION] DemoWindowWidgets()
|
||||||
// [SECTION] DemoWindowLayout()
|
// [SECTION] DemoWindowLayout()
|
||||||
// [SECTION] DemoWindowPopups()
|
// [SECTION] DemoWindowPopups()
|
||||||
// [SECTION] DemoWindowTables()
|
// [SECTION] DemoWindowTables()
|
||||||
@@ -252,36 +252,17 @@ static void ShowExampleMenuFile();
|
|||||||
// (because the link time of very large functions tends to grow non-linearly)
|
// (because the link time of very large functions tends to grow non-linearly)
|
||||||
static void DemoWindowMenuBar(ImGuiDemoWindowData* demo_data);
|
static void DemoWindowMenuBar(ImGuiDemoWindowData* demo_data);
|
||||||
static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data);
|
static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data);
|
||||||
static void DemoWindowWidgetsBasic();
|
|
||||||
static void DemoWindowWidgetsBullets();
|
|
||||||
static void DemoWindowWidgetsCollapsingHeaders();
|
|
||||||
static void DemoWindowWidgetsComboBoxes();
|
|
||||||
static void DemoWindowWidgetsColorAndPickers();
|
|
||||||
static void DemoWindowWidgetsDataTypes();
|
|
||||||
static void DemoWindowWidgetsDisableBlocks(ImGuiDemoWindowData* demo_data);
|
|
||||||
static void DemoWindowWidgetsDragAndDrop();
|
|
||||||
static void DemoWindowWidgetsDragsAndSliders();
|
|
||||||
static void DemoWindowWidgetsImages();
|
|
||||||
static void DemoWindowWidgetsListBoxes();
|
|
||||||
static void DemoWindowWidgetsPlotting();
|
|
||||||
static void DemoWindowWidgetsMultiComponents();
|
|
||||||
static void DemoWindowWidgetsProgressBars();
|
|
||||||
static void DemoWindowWidgetsQueryingStatuses();
|
|
||||||
static void DemoWindowWidgetsSelectables();
|
|
||||||
static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_data);
|
|
||||||
static void DemoWindowWidgetsTabs();
|
|
||||||
static void DemoWindowWidgetsText();
|
|
||||||
static void DemoWindowWidgetsTextFilter();
|
|
||||||
static void DemoWindowWidgetsTextInput();
|
|
||||||
static void DemoWindowWidgetsTooltips();
|
|
||||||
static void DemoWindowWidgetsTreeNodes();
|
|
||||||
static void DemoWindowWidgetsVerticalSliders();
|
|
||||||
static void DemoWindowLayout();
|
static void DemoWindowLayout();
|
||||||
static void DemoWindowPopups();
|
static void DemoWindowPopups();
|
||||||
static void DemoWindowTables();
|
static void DemoWindowTables();
|
||||||
static void DemoWindowColumns();
|
static void DemoWindowColumns();
|
||||||
static void DemoWindowInputs();
|
static void DemoWindowInputs();
|
||||||
|
|
||||||
|
// Helper tree functions used by Property Editor & Multi-Select demos
|
||||||
|
struct ExampleTreeNode;
|
||||||
|
static ExampleTreeNode* ExampleTree_CreateNode(const char* name, int uid, ExampleTreeNode* parent);
|
||||||
|
static void ExampleTree_DestroyNode(ExampleTreeNode* node);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Helpers
|
// [SECTION] Helpers
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -318,97 +299,6 @@ ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback = NULL;
|
|||||||
void* GImGuiDemoMarkerCallbackUserData = NULL;
|
void* GImGuiDemoMarkerCallbackUserData = NULL;
|
||||||
#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0)
|
#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0)
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor etc.)
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Simple representation for a tree
|
|
||||||
// (this is designed to be simple to understand for our demos, not to be fancy or efficient etc.)
|
|
||||||
struct ExampleTreeNode
|
|
||||||
{
|
|
||||||
// Tree structure
|
|
||||||
char Name[28] = "";
|
|
||||||
int UID = 0;
|
|
||||||
ExampleTreeNode* Parent = NULL;
|
|
||||||
ImVector<ExampleTreeNode*> Childs;
|
|
||||||
unsigned short IndexInParent = 0; // Maintaining this allows us to implement linear traversal more easily
|
|
||||||
|
|
||||||
// Leaf Data
|
|
||||||
bool HasData = false; // All leaves have data
|
|
||||||
bool DataMyBool = true;
|
|
||||||
int DataMyInt = 128;
|
|
||||||
ImVec2 DataMyVec2 = ImVec2(0.0f, 3.141592f);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Simple representation of struct metadata/serialization data.
|
|
||||||
// (this is a minimal version of what a typical advanced application may provide)
|
|
||||||
struct ExampleMemberInfo
|
|
||||||
{
|
|
||||||
const char* Name; // Member name
|
|
||||||
ImGuiDataType DataType; // Member type
|
|
||||||
int DataCount; // Member count (1 when scalar)
|
|
||||||
int Offset; // Offset inside parent structure
|
|
||||||
};
|
|
||||||
|
|
||||||
// Metadata description of ExampleTreeNode struct.
|
|
||||||
static const ExampleMemberInfo ExampleTreeNodeMemberInfos[]
|
|
||||||
{
|
|
||||||
{ "MyName", ImGuiDataType_String, 1, offsetof(ExampleTreeNode, Name) },
|
|
||||||
{ "MyBool", ImGuiDataType_Bool, 1, offsetof(ExampleTreeNode, DataMyBool) },
|
|
||||||
{ "MyInt", ImGuiDataType_S32, 1, offsetof(ExampleTreeNode, DataMyInt) },
|
|
||||||
{ "MyVec2", ImGuiDataType_Float, 2, offsetof(ExampleTreeNode, DataMyVec2) },
|
|
||||||
};
|
|
||||||
|
|
||||||
static ExampleTreeNode* ExampleTree_CreateNode(const char* name, int uid, ExampleTreeNode* parent)
|
|
||||||
{
|
|
||||||
ExampleTreeNode* node = IM_NEW(ExampleTreeNode);
|
|
||||||
snprintf(node->Name, IM_ARRAYSIZE(node->Name), "%s", name);
|
|
||||||
node->UID = uid;
|
|
||||||
node->Parent = parent;
|
|
||||||
node->IndexInParent = parent ? (unsigned short)parent->Childs.Size : 0;
|
|
||||||
if (parent)
|
|
||||||
parent->Childs.push_back(node);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ExampleTree_DestroyNode(ExampleTreeNode* node)
|
|
||||||
{
|
|
||||||
for (ExampleTreeNode* child_node : node->Childs)
|
|
||||||
ExampleTree_DestroyNode(child_node);
|
|
||||||
IM_DELETE(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create example tree data
|
|
||||||
// (this allocates _many_ more times than most other code in either Dear ImGui or others demo)
|
|
||||||
static ExampleTreeNode* ExampleTree_CreateDemoTree()
|
|
||||||
{
|
|
||||||
static const char* root_names[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pear", "Pineapple", "Strawberry", "Watermelon" };
|
|
||||||
const size_t NAME_MAX_LEN = sizeof(ExampleTreeNode::Name);
|
|
||||||
char name_buf[NAME_MAX_LEN];
|
|
||||||
int uid = 0;
|
|
||||||
ExampleTreeNode* node_L0 = ExampleTree_CreateNode("<ROOT>", ++uid, NULL);
|
|
||||||
const int root_items_multiplier = 2;
|
|
||||||
for (int idx_L0 = 0; idx_L0 < IM_ARRAYSIZE(root_names) * root_items_multiplier; idx_L0++)
|
|
||||||
{
|
|
||||||
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "%s %d", root_names[idx_L0 / root_items_multiplier], idx_L0 % root_items_multiplier);
|
|
||||||
ExampleTreeNode* node_L1 = ExampleTree_CreateNode(name_buf, ++uid, node_L0);
|
|
||||||
const int number_of_childs = (int)strlen(node_L1->Name);
|
|
||||||
for (int idx_L1 = 0; idx_L1 < number_of_childs; idx_L1++)
|
|
||||||
{
|
|
||||||
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Child %d", idx_L1);
|
|
||||||
ExampleTreeNode* node_L2 = ExampleTree_CreateNode(name_buf, ++uid, node_L1);
|
|
||||||
node_L2->HasData = true;
|
|
||||||
if (idx_L1 == 0)
|
|
||||||
{
|
|
||||||
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Sub-child %d", 0);
|
|
||||||
ExampleTreeNode* node_L3 = ExampleTree_CreateNode(name_buf, ++uid, node_L2);
|
|
||||||
node_L3->HasData = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return node_L0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Demo Window / ShowDemoWindow()
|
// [SECTION] Demo Window / ShowDemoWindow()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -877,53 +767,94 @@ static void DemoWindowMenuBar(ImGuiDemoWindowData* demo_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] DemoWindowWidgets()
|
// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor & Multi-Select demos)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data)
|
// Simple representation for a tree
|
||||||
|
// (this is designed to be simple to understand for our demos, not to be fancy or efficient etc.)
|
||||||
|
struct ExampleTreeNode
|
||||||
{
|
{
|
||||||
IMGUI_DEMO_MARKER("Widgets");
|
// Tree structure
|
||||||
//ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
char Name[28] = "";
|
||||||
if (!ImGui::CollapsingHeader("Widgets"))
|
int UID = 0;
|
||||||
return;
|
ExampleTreeNode* Parent = NULL;
|
||||||
|
ImVector<ExampleTreeNode*> Childs;
|
||||||
|
unsigned short IndexInParent = 0; // Maintaining this allows us to implement linear traversal more easily
|
||||||
|
|
||||||
const bool disable_all = demo_data->DisableSections; // The Checkbox for that is inside the "Disabled" section at the bottom
|
// Leaf Data
|
||||||
if (disable_all)
|
bool HasData = false; // All leaves have data
|
||||||
ImGui::BeginDisabled();
|
bool DataMyBool = true;
|
||||||
|
int DataMyInt = 128;
|
||||||
|
ImVec2 DataMyVec2 = ImVec2(0.0f, 3.141592f);
|
||||||
|
};
|
||||||
|
|
||||||
DemoWindowWidgetsBasic();
|
// Simple representation of struct metadata/serialization data.
|
||||||
DemoWindowWidgetsBullets();
|
// (this is a minimal version of what a typical advanced application may provide)
|
||||||
DemoWindowWidgetsCollapsingHeaders();
|
struct ExampleMemberInfo
|
||||||
DemoWindowWidgetsComboBoxes();
|
{
|
||||||
DemoWindowWidgetsColorAndPickers();
|
const char* Name; // Member name
|
||||||
DemoWindowWidgetsDataTypes();
|
ImGuiDataType DataType; // Member type
|
||||||
|
int DataCount; // Member count (1 when scalar)
|
||||||
|
int Offset; // Offset inside parent structure
|
||||||
|
};
|
||||||
|
|
||||||
if (disable_all)
|
// Metadata description of ExampleTreeNode struct.
|
||||||
ImGui::EndDisabled();
|
static const ExampleMemberInfo ExampleTreeNodeMemberInfos[]
|
||||||
DemoWindowWidgetsDisableBlocks(demo_data);
|
{
|
||||||
if (disable_all)
|
{ "MyName", ImGuiDataType_String, 1, offsetof(ExampleTreeNode, Name) },
|
||||||
ImGui::BeginDisabled();
|
{ "MyBool", ImGuiDataType_Bool, 1, offsetof(ExampleTreeNode, DataMyBool) },
|
||||||
|
{ "MyInt", ImGuiDataType_S32, 1, offsetof(ExampleTreeNode, DataMyInt) },
|
||||||
|
{ "MyVec2", ImGuiDataType_Float, 2, offsetof(ExampleTreeNode, DataMyVec2) },
|
||||||
|
};
|
||||||
|
|
||||||
DemoWindowWidgetsDragAndDrop();
|
static ExampleTreeNode* ExampleTree_CreateNode(const char* name, int uid, ExampleTreeNode* parent)
|
||||||
DemoWindowWidgetsDragsAndSliders();
|
{
|
||||||
DemoWindowWidgetsImages();
|
ExampleTreeNode* node = IM_NEW(ExampleTreeNode);
|
||||||
DemoWindowWidgetsListBoxes();
|
snprintf(node->Name, IM_ARRAYSIZE(node->Name), "%s", name);
|
||||||
DemoWindowWidgetsMultiComponents();
|
node->UID = uid;
|
||||||
DemoWindowWidgetsPlotting();
|
node->Parent = parent;
|
||||||
DemoWindowWidgetsProgressBars();
|
node->IndexInParent = parent ? (unsigned short)parent->Childs.Size : 0;
|
||||||
DemoWindowWidgetsQueryingStatuses();
|
if (parent)
|
||||||
DemoWindowWidgetsSelectables();
|
parent->Childs.push_back(node);
|
||||||
DemoWindowWidgetsSelectionAndMultiSelect(demo_data);
|
return node;
|
||||||
DemoWindowWidgetsTabs();
|
}
|
||||||
DemoWindowWidgetsText();
|
|
||||||
DemoWindowWidgetsTextFilter();
|
|
||||||
DemoWindowWidgetsTextInput();
|
|
||||||
DemoWindowWidgetsTooltips();
|
|
||||||
DemoWindowWidgetsTreeNodes();
|
|
||||||
DemoWindowWidgetsVerticalSliders();
|
|
||||||
|
|
||||||
if (disable_all)
|
static void ExampleTree_DestroyNode(ExampleTreeNode* node)
|
||||||
ImGui::EndDisabled();
|
{
|
||||||
|
for (ExampleTreeNode* child_node : node->Childs)
|
||||||
|
ExampleTree_DestroyNode(child_node);
|
||||||
|
IM_DELETE(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create example tree data
|
||||||
|
// (this allocates _many_ more times than most other code in either Dear ImGui or others demo)
|
||||||
|
static ExampleTreeNode* ExampleTree_CreateDemoTree()
|
||||||
|
{
|
||||||
|
static const char* root_names[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pear", "Pineapple", "Strawberry", "Watermelon" };
|
||||||
|
const size_t NAME_MAX_LEN = sizeof(ExampleTreeNode::Name);
|
||||||
|
char name_buf[NAME_MAX_LEN];
|
||||||
|
int uid = 0;
|
||||||
|
ExampleTreeNode* node_L0 = ExampleTree_CreateNode("<ROOT>", ++uid, NULL);
|
||||||
|
const int root_items_multiplier = 2;
|
||||||
|
for (int idx_L0 = 0; idx_L0 < IM_ARRAYSIZE(root_names) * root_items_multiplier; idx_L0++)
|
||||||
|
{
|
||||||
|
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "%s %d", root_names[idx_L0 / root_items_multiplier], idx_L0 % root_items_multiplier);
|
||||||
|
ExampleTreeNode* node_L1 = ExampleTree_CreateNode(name_buf, ++uid, node_L0);
|
||||||
|
const int number_of_childs = (int)strlen(node_L1->Name);
|
||||||
|
for (int idx_L1 = 0; idx_L1 < number_of_childs; idx_L1++)
|
||||||
|
{
|
||||||
|
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Child %d", idx_L1);
|
||||||
|
ExampleTreeNode* node_L2 = ExampleTree_CreateNode(name_buf, ++uid, node_L1);
|
||||||
|
node_L2->HasData = true;
|
||||||
|
if (idx_L1 == 0)
|
||||||
|
{
|
||||||
|
snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Sub-child %d", 0);
|
||||||
|
ExampleTreeNode* node_L3 = ExampleTree_CreateNode(name_buf, ++uid, node_L2);
|
||||||
|
node_L3->HasData = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return node_L0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -4258,6 +4189,56 @@ static void DemoWindowWidgetsVerticalSliders()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] DemoWindowWidgets()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data)
|
||||||
|
{
|
||||||
|
IMGUI_DEMO_MARKER("Widgets");
|
||||||
|
//ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
||||||
|
if (!ImGui::CollapsingHeader("Widgets"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const bool disable_all = demo_data->DisableSections; // The Checkbox for that is inside the "Disabled" section at the bottom
|
||||||
|
if (disable_all)
|
||||||
|
ImGui::BeginDisabled();
|
||||||
|
|
||||||
|
DemoWindowWidgetsBasic();
|
||||||
|
DemoWindowWidgetsBullets();
|
||||||
|
DemoWindowWidgetsCollapsingHeaders();
|
||||||
|
DemoWindowWidgetsComboBoxes();
|
||||||
|
DemoWindowWidgetsColorAndPickers();
|
||||||
|
DemoWindowWidgetsDataTypes();
|
||||||
|
|
||||||
|
if (disable_all)
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
DemoWindowWidgetsDisableBlocks(demo_data);
|
||||||
|
if (disable_all)
|
||||||
|
ImGui::BeginDisabled();
|
||||||
|
|
||||||
|
DemoWindowWidgetsDragAndDrop();
|
||||||
|
DemoWindowWidgetsDragsAndSliders();
|
||||||
|
DemoWindowWidgetsImages();
|
||||||
|
DemoWindowWidgetsListBoxes();
|
||||||
|
DemoWindowWidgetsMultiComponents();
|
||||||
|
DemoWindowWidgetsPlotting();
|
||||||
|
DemoWindowWidgetsProgressBars();
|
||||||
|
DemoWindowWidgetsQueryingStatuses();
|
||||||
|
DemoWindowWidgetsSelectables();
|
||||||
|
DemoWindowWidgetsSelectionAndMultiSelect(demo_data);
|
||||||
|
DemoWindowWidgetsTabs();
|
||||||
|
DemoWindowWidgetsText();
|
||||||
|
DemoWindowWidgetsTextFilter();
|
||||||
|
DemoWindowWidgetsTextInput();
|
||||||
|
DemoWindowWidgetsTooltips();
|
||||||
|
DemoWindowWidgetsTreeNodes();
|
||||||
|
DemoWindowWidgetsVerticalSliders();
|
||||||
|
|
||||||
|
if (disable_all)
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] DemoWindowLayout()
|
// [SECTION] DemoWindowLayout()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@@ -1335,6 +1335,7 @@ struct ImGuiWindowStackData
|
|||||||
ImGuiLastItemData ParentLastItemDataBackup;
|
ImGuiLastItemData ParentLastItemDataBackup;
|
||||||
ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
|
ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
|
||||||
bool DisabledOverrideReenable; // Non-child window override disabled flag
|
bool DisabledOverrideReenable; // Non-child window override disabled flag
|
||||||
|
float DisabledOverrideReenableAlphaBackup;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImGuiShrinkWidthItem
|
struct ImGuiShrinkWidthItem
|
||||||
@@ -2222,6 +2223,7 @@ struct ImGuiIDStackTool
|
|||||||
ImVector<ImGuiStackLevelInfo> Results;
|
ImVector<ImGuiStackLevelInfo> Results;
|
||||||
bool CopyToClipboardOnCtrlC;
|
bool CopyToClipboardOnCtrlC;
|
||||||
float CopyToClipboardLastTime;
|
float CopyToClipboardLastTime;
|
||||||
|
ImGuiTextBuffer ResultPathBuf;
|
||||||
|
|
||||||
ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
|
ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
|
||||||
};
|
};
|
||||||
@@ -3376,6 +3378,7 @@ namespace ImGui
|
|||||||
|
|
||||||
// Popups, Modals
|
// Popups, Modals
|
||||||
IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
|
IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
|
||||||
|
IMGUI_API bool BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags);
|
||||||
IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
|
IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
|
||||||
IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
|
IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
|
||||||
IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
|
IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
|
||||||
|
@@ -8879,7 +8879,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
if (g.MenusIdSubmittedThisFrame.contains(id))
|
if (g.MenusIdSubmittedThisFrame.contains(id))
|
||||||
{
|
{
|
||||||
if (menu_is_open)
|
if (menu_is_open)
|
||||||
menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
|
menu_is_open = BeginPopupMenuEx(id, label, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
|
||||||
else
|
else
|
||||||
g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values
|
g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values
|
||||||
return menu_is_open;
|
return menu_is_open;
|
||||||
@@ -9041,7 +9041,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
ImGuiLastItemData last_item_in_parent = g.LastItemData;
|
ImGuiLastItemData last_item_in_parent = g.LastItemData;
|
||||||
SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: misleading: the value will serve as reference for FindBestWindowPosForPopup(), not actual pos.
|
SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: misleading: the value will serve as reference for FindBestWindowPosForPopup(), not actual pos.
|
||||||
PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding
|
PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding
|
||||||
menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
|
menu_is_open = BeginPopupMenuEx(id, label, window_flags); // menu_is_open may be 'false' when the popup is completely clipped (e.g. zero size display)
|
||||||
PopStyleVar();
|
PopStyleVar();
|
||||||
if (menu_is_open)
|
if (menu_is_open)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user