mirror of
https://github.com/Drezil/imgui.git
synced 2024-12-22 15:46:35 +00:00
Merge branch 'master' into viewport
# Conflicts: # examples/opengl3_example/imgui_impl_glfw_gl3.cpp # examples/sdl_opengl3_example/imgui_impl_sdl_gl3.cpp # imgui.cpp # imgui.h
This commit is contained in:
commit
01429e7d16
2
.github/issue_template.md
vendored
2
.github/issue_template.md
vendored
@ -13,7 +13,7 @@ SELECT "PREVIEW CHANGES" TO TURN THE URL ABOVE INTO A CLICKABLE LINK.
|
|||||||
|
|
||||||
XXX
|
XXX
|
||||||
|
|
||||||
**Back-end/Renderer/OS:** _(if the question is related to inputs or rendering, otherwise delete this section)_
|
**Back-end file/Renderer/OS:** _(if the question is related to inputs/rendering/build, otherwise delete this section)_
|
||||||
|
|
||||||
XXX
|
XXX
|
||||||
|
|
||||||
|
@ -37,6 +37,17 @@ HOW TO UPDATE?
|
|||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
VERSION 1.62 WIP (IN PROGRESS)
|
||||||
|
|
||||||
|
Breaking Changes:
|
||||||
|
|
||||||
|
Other Changes:
|
||||||
|
|
||||||
|
- Nav: To keep the navigated item in view we also attempt to scroll the parent window as well as the current window. (#787)
|
||||||
|
- TreeNode: Fixed nodes with ImGuiTreeNodeFlags_Leaf flag always returning true which was meaningless.
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
VERSION 1.61 (Released 2018-05-14)
|
VERSION 1.61 (Released 2018-05-14)
|
||||||
|
|
||||||
Breaking Changes:
|
Breaking Changes:
|
||||||
|
2
TODO.txt
2
TODO.txt
@ -25,6 +25,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
|
|||||||
- window: increase minimum size of a window with menus or fix the menu rendering so that it doesn't look odd.
|
- window: increase minimum size of a window with menus or fix the menu rendering so that it doesn't look odd.
|
||||||
- window: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon?
|
- window: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon?
|
||||||
- window: expose contents size. (#1045)
|
- window: expose contents size. (#1045)
|
||||||
|
- window: using SetWindowPos() inside Begin() and moving the window with the mouse reacts a very ugly glitch. We should just defer the SetWindowPos() call.
|
||||||
- window: GetWindowSize() returns (0,0) when not calculated? (#1045)
|
- window: GetWindowSize() returns (0,0) when not calculated? (#1045)
|
||||||
- window: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate.
|
- window: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate.
|
||||||
!- scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet.
|
!- scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet.
|
||||||
@ -39,6 +40,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
|
|||||||
- drawlist: would be good to be able to deep copy of ImDrawData (we have a deep copy of ImDrawList now).
|
- drawlist: would be good to be able to deep copy of ImDrawData (we have a deep copy of ImDrawList now).
|
||||||
- drawlist/opt: AddRect() axis aligned pixel aligned (no-aa) could use 8 triangles instead of 16 and no normal calculation.
|
- drawlist/opt: AddRect() axis aligned pixel aligned (no-aa) could use 8 triangles instead of 16 and no normal calculation.
|
||||||
- drawlist: rendering: provide a way for imgui to output to a single/global vertex buffer, re-order indices only at the end of the frame (ref: https://gist.github.com/floooh/10388a0afbe08fce9e617d8aefa7d302)
|
- drawlist: rendering: provide a way for imgui to output to a single/global vertex buffer, re-order indices only at the end of the frame (ref: https://gist.github.com/floooh/10388a0afbe08fce9e617d8aefa7d302)
|
||||||
|
- drawlist: callback: add an extra void* in ImDrawCallback to allow passing render-local data to the callback (would break API).
|
||||||
|
|
||||||
- main: considering adding an Init() function? some constructs are awkward in the implementation because of the lack of them.
|
- main: considering adding an Init() function? some constructs are awkward in the implementation because of the lack of them.
|
||||||
- main: find a way to preserve relative orders of multiple reappearing windows (so an app toggling between "modes" e.g. fullscreen vs all tools) won't lose relative ordering.
|
- main: find a way to preserve relative orders of multiple reappearing windows (so an app toggling between "modes" e.g. fullscreen vs all tools) won't lose relative ordering.
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
// (minor and older changes stripped away, please see git history for details)
|
// (minor and older changes stripped away, please see git history for details)
|
||||||
// 2018-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
// 2018-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
||||||
// 2018-XX-XX: OpenGL: Offset projection matrix and clipping rectangle by draw_data->DisplayPos (which will be non-zero for multi-viewport applications).
|
// 2018-XX-XX: OpenGL: Offset projection matrix and clipping rectangle by draw_data->DisplayPos (which will be non-zero for multi-viewport applications).
|
||||||
|
// 2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a NULL pointer.
|
||||||
// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150".
|
// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150".
|
||||||
// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
|
// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
|
||||||
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
|
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
|
||||||
@ -132,7 +133,7 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|||||||
glUseProgram(g_ShaderHandle);
|
glUseProgram(g_ShaderHandle);
|
||||||
glUniform1i(g_AttribLocationTex, 0);
|
glUniform1i(g_AttribLocationTex, 0);
|
||||||
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
||||||
glBindSampler(0, 0); // Rely on combined texture/sampler state.
|
if (glBindSampler) glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
||||||
|
|
||||||
// Recreate the VAO every time
|
// Recreate the VAO every time
|
||||||
// (This is to easily allow multiple GL contexts. VAO are not shared among GL contexts, and we don't track creation/deletion of windows so we don't have an obvious key to use to cache them.)
|
// (This is to easily allow multiple GL contexts. VAO are not shared among GL contexts, and we don't track creation/deletion of windows so we don't have an obvious key to use to cache them.)
|
||||||
@ -189,7 +190,7 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|||||||
// Restore modified GL state
|
// Restore modified GL state
|
||||||
glUseProgram(last_program);
|
glUseProgram(last_program);
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
glBindSampler(0, last_sampler);
|
if (glBindSampler) glBindSampler(0, last_sampler);
|
||||||
glActiveTexture(last_active_texture);
|
glActiveTexture(last_active_texture);
|
||||||
glBindVertexArray(last_vertex_array);
|
glBindVertexArray(last_vertex_array);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||||
|
124
imgui.cpp
124
imgui.cpp
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.61
|
// dear imgui, v1.62 WIP
|
||||||
// (main code and documentation)
|
// (main code and documentation)
|
||||||
|
|
||||||
// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
|
// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
|
||||||
@ -711,6 +711,7 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
||||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
|
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
|
||||||
#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
|
#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
|
||||||
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: ‘memset/memcpy’ clearing/writing an object of type ‘xxxx’ with no trivial copy-assignment; use assignment or value-initialization instead
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
|
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
|
||||||
@ -2267,7 +2268,7 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
|
|||||||
|
|
||||||
// We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items)
|
// We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items)
|
||||||
// For example, this ensure that items in one column are not reached when moving vertically from items in another column.
|
// For example, this ensure that items in one column are not reached when moving vertically from items in another column.
|
||||||
NavClampRectToVisibleAreaForMoveDir(g.NavMoveDir, cand, window->ClipRect);
|
NavClampRectToVisibleAreaForMoveDir(g.NavMoveClipDir, cand, window->ClipRect);
|
||||||
|
|
||||||
// Compute distance between boxes
|
// Compute distance between boxes
|
||||||
// FIXME-NAV: Introducing biases for vertical navigation, needs to be removed.
|
// FIXME-NAV: Introducing biases for vertical navigation, needs to be removed.
|
||||||
@ -3053,39 +3054,35 @@ static void ImGui::NavUpdateWindowing()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.
|
// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.
|
||||||
static void NavScrollToBringItemIntoView(ImGuiWindow* window, ImRect& item_rect_rel)
|
static void NavScrollToBringItemIntoView(ImGuiWindow* window, const ImRect& item_rect)
|
||||||
{
|
{
|
||||||
// Scroll to keep newly navigated item fully into view
|
// Scroll to keep newly navigated item fully into view
|
||||||
ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1, 1), window->InnerMainRect.Max - window->Pos + ImVec2(1, 1));
|
ImRect window_rect(window->InnerMainRect.Min - ImVec2(1, 1), window->InnerMainRect.Max + ImVec2(1, 1));
|
||||||
//GetOverlayDrawList(window)->AddRect(window->Pos + window_rect_rel.Min, window->Pos + window_rect_rel.Max, IM_COL32_WHITE); // [DEBUG]
|
//GetOverlayDrawList(window)->AddRect(window_rect_rel.Min, window_rect_rel.Max, IM_COL32_WHITE); // [DEBUG]
|
||||||
if (window_rect_rel.Contains(item_rect_rel))
|
if (window_rect.Contains(item_rect))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (window->ScrollbarX && item_rect_rel.Min.x < window_rect_rel.Min.x)
|
if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.x = item_rect_rel.Min.x + window->Scroll.x - g.Style.ItemSpacing.x;
|
window->ScrollTarget.x = item_rect.Min.x - window->Pos.x + window->Scroll.x - g.Style.ItemSpacing.x;
|
||||||
window->ScrollTargetCenterRatio.x = 0.0f;
|
window->ScrollTargetCenterRatio.x = 0.0f;
|
||||||
}
|
}
|
||||||
else if (window->ScrollbarX && item_rect_rel.Max.x >= window_rect_rel.Max.x)
|
else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.x = item_rect_rel.Max.x + window->Scroll.x + g.Style.ItemSpacing.x;
|
window->ScrollTarget.x = item_rect.Max.x - window->Pos.x + window->Scroll.x + g.Style.ItemSpacing.x;
|
||||||
window->ScrollTargetCenterRatio.x = 1.0f;
|
window->ScrollTargetCenterRatio.x = 1.0f;
|
||||||
}
|
}
|
||||||
if (item_rect_rel.Min.y < window_rect_rel.Min.y)
|
if (item_rect.Min.y < window_rect.Min.y)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.y = item_rect_rel.Min.y + window->Scroll.y - g.Style.ItemSpacing.y;
|
window->ScrollTarget.y = item_rect.Min.y - window->Pos.y + window->Scroll.y - g.Style.ItemSpacing.y;
|
||||||
window->ScrollTargetCenterRatio.y = 0.0f;
|
window->ScrollTargetCenterRatio.y = 0.0f;
|
||||||
}
|
}
|
||||||
else if (item_rect_rel.Max.y >= window_rect_rel.Max.y)
|
else if (item_rect.Max.y >= window_rect.Max.y)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.y = item_rect_rel.Max.y + window->Scroll.y + g.Style.ItemSpacing.y;
|
window->ScrollTarget.y = item_rect.Max.y - window->Pos.y + window->Scroll.y + g.Style.ItemSpacing.y;
|
||||||
window->ScrollTargetCenterRatio.y = 1.0f;
|
window->ScrollTargetCenterRatio.y = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Estimate upcoming scroll so we can offset our relative mouse position so mouse position can be applied immediately after in NavUpdate()
|
|
||||||
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window, false);
|
|
||||||
item_rect_rel.Translate(window->Scroll - next_scroll);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui::NavUpdate()
|
static void ImGui::NavUpdate()
|
||||||
@ -3149,9 +3146,18 @@ static void ImGui::NavUpdate()
|
|||||||
|
|
||||||
IM_ASSERT(g.NavWindow && result->Window);
|
IM_ASSERT(g.NavWindow && result->Window);
|
||||||
|
|
||||||
// Scroll to keep newly navigated item fully into view
|
// Scroll to keep newly navigated item fully into view. Also scroll parent window if necessary.
|
||||||
if (g.NavLayer == 0)
|
if (g.NavLayer == 0)
|
||||||
NavScrollToBringItemIntoView(result->Window, result->RectRel);
|
{
|
||||||
|
ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos);
|
||||||
|
NavScrollToBringItemIntoView(result->Window, rect_abs);
|
||||||
|
if (result->Window->Flags & ImGuiWindowFlags_ChildWindow)
|
||||||
|
NavScrollToBringItemIntoView(result->Window->ParentWindow, rect_abs);
|
||||||
|
|
||||||
|
// Estimate upcoming scroll so we can offset our result position so mouse position can be applied immediately after in NavUpdate()
|
||||||
|
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(result->Window, false);
|
||||||
|
result->RectRel.Translate(result->Window->Scroll - next_scroll);
|
||||||
|
}
|
||||||
|
|
||||||
// Apply result from previous frame navigation directional move request
|
// Apply result from previous frame navigation directional move request
|
||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
@ -3270,6 +3276,7 @@ static void ImGui::NavUpdate()
|
|||||||
if (g.NavMoveRequestForward == ImGuiNavForward_None)
|
if (g.NavMoveRequestForward == ImGuiNavForward_None)
|
||||||
{
|
{
|
||||||
g.NavMoveDir = ImGuiDir_None;
|
g.NavMoveDir = ImGuiDir_None;
|
||||||
|
g.NavMoveRequestFlags = 0;
|
||||||
if (g.NavWindow && !g.NavWindowingTarget && allowed_dir_flags && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
if (g.NavWindow && !g.NavWindowingTarget && allowed_dir_flags && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
||||||
{
|
{
|
||||||
if ((allowed_dir_flags & (1<<ImGuiDir_Left)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Left;
|
if ((allowed_dir_flags & (1<<ImGuiDir_Left)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Left;
|
||||||
@ -3277,11 +3284,13 @@ static void ImGui::NavUpdate()
|
|||||||
if ((allowed_dir_flags & (1<<ImGuiDir_Up)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Up;
|
if ((allowed_dir_flags & (1<<ImGuiDir_Up)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Up;
|
||||||
if ((allowed_dir_flags & (1<<ImGuiDir_Down)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Down;
|
if ((allowed_dir_flags & (1<<ImGuiDir_Down)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Down;
|
||||||
}
|
}
|
||||||
|
g.NavMoveClipDir = g.NavMoveDir;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Forwarding previous request (which has been modified, e.g. wrap around menus rewrite the requests with a starting rectangle at the other side of the window)
|
// Forwarding previous request (which has been modified, e.g. wrap around menus rewrite the requests with a starting rectangle at the other side of the window)
|
||||||
IM_ASSERT(g.NavMoveDir != ImGuiDir_None);
|
// (Preserve g.NavMoveRequestFlags, g.NavMoveClipDir which were set by the NavMoveRequestForward() function)
|
||||||
|
IM_ASSERT(g.NavMoveDir != ImGuiDir_None && g.NavMoveClipDir != ImGuiDir_None);
|
||||||
IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_ForwardQueued);
|
IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_ForwardQueued);
|
||||||
g.NavMoveRequestForward = ImGuiNavForward_ForwardActive;
|
g.NavMoveRequestForward = ImGuiNavForward_ForwardActive;
|
||||||
}
|
}
|
||||||
@ -4586,7 +4595,7 @@ void ImGui::EndFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Hide implicit "Debug" window if it hasn't been used
|
// Hide implicit "Debug" window if it hasn't been used
|
||||||
IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls
|
IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls, did you forget to call end on g.CurrentWindow->Name?
|
||||||
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
|
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
|
||||||
g.CurrentWindow->Active = false;
|
g.CurrentWindow->Active = false;
|
||||||
End();
|
End();
|
||||||
@ -5161,9 +5170,11 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items
|
|||||||
const ImVec2 pos = window->DC.CursorPos;
|
const ImVec2 pos = window->DC.CursorPos;
|
||||||
int start = (int)((window->ClipRect.Min.y - pos.y) / items_height);
|
int start = (int)((window->ClipRect.Min.y - pos.y) / items_height);
|
||||||
int end = (int)((window->ClipRect.Max.y - pos.y) / items_height);
|
int end = (int)((window->ClipRect.Max.y - pos.y) / items_height);
|
||||||
if (g.NavMoveRequest && g.NavMoveDir == ImGuiDir_Up) // When performing a navigation request, ensure we have one item extra in the direction we are moving to
|
|
||||||
|
// When performing a navigation request, ensure we have one item extra in the direction we are moving to
|
||||||
|
if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Up)
|
||||||
start--;
|
start--;
|
||||||
if (g.NavMoveRequest && g.NavMoveDir == ImGuiDir_Down)
|
if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Down)
|
||||||
end++;
|
end++;
|
||||||
|
|
||||||
start = ImClamp(start, 0, items_count);
|
start = ImClamp(start, 0, items_count);
|
||||||
@ -5714,15 +5725,50 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
|
|||||||
return is_open;
|
return is_open;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NavProcessMoveRequestWrapAround(ImGuiWindow* window)
|
void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.NavWindow == window && NavMoveRequestButNoResultYet())
|
IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_None);
|
||||||
if ((g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) && g.NavMoveRequestForward == ImGuiNavForward_None && g.NavLayer == 0)
|
|
||||||
{
|
|
||||||
g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued;
|
|
||||||
ImGui::NavMoveRequestCancel();
|
ImGui::NavMoveRequestCancel();
|
||||||
g.NavWindow->NavRectRel[0].Min.y = g.NavWindow->NavRectRel[0].Max.y = ((g.NavMoveDir == ImGuiDir_Up) ? ImMax(window->SizeFull.y, window->SizeContents.y) : 0.0f) - window->Scroll.y;
|
g.NavMoveDir = move_dir;
|
||||||
|
g.NavMoveClipDir = clip_dir;
|
||||||
|
g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued;
|
||||||
|
g.NavMoveRequestFlags = move_flags;
|
||||||
|
g.NavWindow->NavRectRel[g.NavLayer] = bb_rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (g.NavWindow != window || !NavMoveRequestButNoResultYet() || g.NavMoveRequestForward != ImGuiNavForward_None || g.NavLayer != 0)
|
||||||
|
return;
|
||||||
|
IM_ASSERT(move_flags != 0); // No points calling this with no wrapping
|
||||||
|
ImRect bb_rel = window->NavRectRel[0];
|
||||||
|
|
||||||
|
ImGuiDir clip_dir = g.NavMoveDir;
|
||||||
|
if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX)))
|
||||||
|
{
|
||||||
|
bb_rel.Min.x = bb_rel.Max.x = ImMax(window->SizeFull.x, window->SizeContents.x) - window->Scroll.x;
|
||||||
|
if (move_flags & ImGuiNavMoveFlags_WrapX) { bb_rel.TranslateY(-bb_rel.GetHeight()); clip_dir = ImGuiDir_Up; }
|
||||||
|
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
|
||||||
|
}
|
||||||
|
if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX)))
|
||||||
|
{
|
||||||
|
bb_rel.Min.x = bb_rel.Max.x = -window->Scroll.x;
|
||||||
|
if (move_flags & ImGuiNavMoveFlags_WrapX) { bb_rel.TranslateY(+bb_rel.GetHeight()); clip_dir = ImGuiDir_Down; }
|
||||||
|
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
|
||||||
|
}
|
||||||
|
if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY)))
|
||||||
|
{
|
||||||
|
bb_rel.Min.y = bb_rel.Max.y = ImMax(window->SizeFull.y, window->SizeContents.y) - window->Scroll.y;
|
||||||
|
if (move_flags & ImGuiNavMoveFlags_WrapY) { bb_rel.TranslateX(-bb_rel.GetWidth()); clip_dir = ImGuiDir_Left; }
|
||||||
|
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
|
||||||
|
}
|
||||||
|
if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY)))
|
||||||
|
{
|
||||||
|
bb_rel.Min.y = bb_rel.Max.y = -window->Scroll.y;
|
||||||
|
if (move_flags & ImGuiNavMoveFlags_WrapY) { bb_rel.TranslateX(+bb_rel.GetWidth()); clip_dir = ImGuiDir_Right; }
|
||||||
|
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5733,7 +5779,7 @@ void ImGui::EndPopup()
|
|||||||
IM_ASSERT(g.CurrentPopupStack.Size > 0);
|
IM_ASSERT(g.CurrentPopupStack.Size > 0);
|
||||||
|
|
||||||
// Make all menus and popups wrap around for now, may need to expose that policy.
|
// Make all menus and popups wrap around for now, may need to expose that policy.
|
||||||
NavProcessMoveRequestWrapAround(g.CurrentWindow);
|
NavMoveRequestTryWrapping(g.CurrentWindow, ImGuiNavMoveFlags_LoopY);
|
||||||
|
|
||||||
End();
|
End();
|
||||||
}
|
}
|
||||||
@ -7040,7 +7086,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
window->SizeFullAtLastBegin = window->SizeFull;
|
window->SizeFullAtLastBegin = window->SizeFull;
|
||||||
|
|
||||||
// Update various regions. Variables they depends on are set above in this function.
|
// Update various regions. Variables they depends on are set above in this function.
|
||||||
// FIXME: window->ContentsRegion.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
|
// FIXME: window->ContentsRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
|
||||||
window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
|
window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
|
||||||
window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();
|
window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();
|
||||||
window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));
|
window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));
|
||||||
@ -8989,7 +9035,7 @@ void ImGui::LogButtons()
|
|||||||
bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
|
bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
|
||||||
{
|
{
|
||||||
if (flags & ImGuiTreeNodeFlags_Leaf)
|
if (flags & ImGuiTreeNodeFlags_Leaf)
|
||||||
return true;
|
return false;
|
||||||
|
|
||||||
// We only write to the tree storage if the user clicks (or explicitly use SetNextTreeNode*** functions)
|
// We only write to the tree storage if the user clicks (or explicitly use SetNextTreeNode*** functions)
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -12103,9 +12149,11 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
|
||||||
ImGuiButtonFlags button_flags = 0;
|
ImGuiButtonFlags button_flags = 0;
|
||||||
if (flags & ImGuiSelectableFlags_Menu) button_flags |= ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_NoHoldingActiveID;
|
if (flags & ImGuiSelectableFlags_NoHoldingActiveID) button_flags |= ImGuiButtonFlags_NoHoldingActiveID;
|
||||||
if (flags & ImGuiSelectableFlags_MenuItem) button_flags |= ImGuiButtonFlags_PressedOnRelease;
|
if (flags & ImGuiSelectableFlags_PressedOnClick) button_flags |= ImGuiButtonFlags_PressedOnClick;
|
||||||
|
if (flags & ImGuiSelectableFlags_PressedOnRelease) button_flags |= ImGuiButtonFlags_PressedOnRelease;
|
||||||
if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled;
|
if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled;
|
||||||
if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick;
|
if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick;
|
||||||
bool hovered, held;
|
bool hovered, held;
|
||||||
@ -12261,7 +12309,7 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, boo
|
|||||||
ImVec2 pos = window->DC.CursorPos;
|
ImVec2 pos = window->DC.CursorPos;
|
||||||
ImVec2 label_size = CalcTextSize(label, NULL, true);
|
ImVec2 label_size = CalcTextSize(label, NULL, true);
|
||||||
|
|
||||||
ImGuiSelectableFlags flags = ImGuiSelectableFlags_MenuItem | (enabled ? 0 : ImGuiSelectableFlags_Disabled);
|
ImGuiSelectableFlags flags = ImGuiSelectableFlags_PressedOnRelease | (enabled ? 0 : ImGuiSelectableFlags_Disabled);
|
||||||
bool pressed;
|
bool pressed;
|
||||||
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
|
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
|
||||||
{
|
{
|
||||||
@ -12435,7 +12483,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
|
|||||||
window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);
|
window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);
|
||||||
PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);
|
PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);
|
||||||
float w = label_size.x;
|
float w = label_size.x;
|
||||||
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
|
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
|
||||||
PopStyleVar();
|
PopStyleVar();
|
||||||
window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
|
window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
|
||||||
}
|
}
|
||||||
@ -12445,7 +12493,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
|
|||||||
popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y);
|
popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y);
|
||||||
float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame
|
float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame
|
||||||
float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);
|
float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);
|
||||||
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
|
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
|
||||||
if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
|
if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
|
||||||
RenderArrow(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right);
|
RenderArrow(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right);
|
||||||
if (!enabled) PopStyleColor();
|
if (!enabled) PopStyleColor();
|
||||||
|
6
imgui.h
6
imgui.h
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.61
|
// dear imgui, v1.62 WIP
|
||||||
// (headers)
|
// (headers)
|
||||||
|
|
||||||
// See imgui.cpp file for documentation.
|
// See imgui.cpp file for documentation.
|
||||||
@ -22,7 +22,7 @@
|
|||||||
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
|
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
|
||||||
|
|
||||||
// Version
|
// Version
|
||||||
#define IMGUI_VERSION "1.61"
|
#define IMGUI_VERSION "1.62 WIP"
|
||||||
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert))
|
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert))
|
||||||
#define IMGUI_HAS_VIEWPORT 1 // Viewport WIP branch
|
#define IMGUI_HAS_VIEWPORT 1 // Viewport WIP branch
|
||||||
|
|
||||||
@ -1258,8 +1258,10 @@ public:
|
|||||||
return;
|
return;
|
||||||
value_type* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
|
value_type* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
|
||||||
if (Data)
|
if (Data)
|
||||||
|
{
|
||||||
memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
|
memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
|
||||||
ImGui::MemFree(Data);
|
ImGui::MemFree(Data);
|
||||||
|
}
|
||||||
Data = new_data;
|
Data = new_data;
|
||||||
Capacity = new_capacity;
|
Capacity = new_capacity;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.61
|
// dear imgui, v1.62 WIP
|
||||||
// (demo code)
|
// (demo code)
|
||||||
|
|
||||||
// Message to the person tempted to delete this file when integrating ImGui into their code base:
|
// Message to the person tempted to delete this file when integrating ImGui into their code base:
|
||||||
@ -457,7 +457,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().
|
// Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().
|
||||||
node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet
|
node_flags |= ImGuiTreeNodeFlags_Leaf; // | ImGuiTreeNodeFlags_Bullet;
|
||||||
ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i);
|
ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i);
|
||||||
if (ImGui::IsItemClicked())
|
if (ImGui::IsItemClicked())
|
||||||
node_clicked = i;
|
node_clicked = i;
|
||||||
@ -3194,13 +3194,9 @@ static void ShowExampleAppPropertyEditor(bool* p_open)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well)
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
// Here we use a Selectable (instead of Text) to highlight on hover
|
ImGui::TreeNodeEx("Field", ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet, "Field_%d", i);
|
||||||
//ImGui::Text("Field_%d", i);
|
|
||||||
char label[32];
|
|
||||||
sprintf(label, "Field_%d", i);
|
|
||||||
ImGui::Bullet();
|
|
||||||
ImGui::Selectable(label);
|
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::PushItemWidth(-1);
|
ImGui::PushItemWidth(-1);
|
||||||
if (i >= 5)
|
if (i >= 5)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.61
|
// dear imgui, v1.62 WIP
|
||||||
// (drawing and font code)
|
// (drawing and font code)
|
||||||
|
|
||||||
// Contains implementation for
|
// Contains implementation for
|
||||||
@ -54,6 +54,7 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
||||||
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
|
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
|
||||||
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
||||||
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: ‘memset/memcpy’ clearing/writing an object of type ‘xxxx’ with no trivial copy-assignment; use assignment or value-initialization instead
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.61
|
// dear imgui, v1.62 WIP
|
||||||
// (internals)
|
// (internals)
|
||||||
|
|
||||||
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
|
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
|
||||||
@ -33,16 +33,25 @@
|
|||||||
// Forward Declarations
|
// Forward Declarations
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
struct ImRect;
|
struct ImRect; // An axis-aligned rectangle (2 points)
|
||||||
struct ImGuiColMod;
|
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
|
||||||
struct ImGuiStyleMod;
|
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
|
||||||
struct ImGuiGroupData;
|
struct ImGuiColMod; // Stacked color modifier, backup of modified data so we can restore it
|
||||||
struct ImGuiMenuColumns;
|
struct ImGuiColumnData; // Storage data for a single column
|
||||||
struct ImGuiDrawContext;
|
struct ImGuiColumnsSet; // Storage data for a columns set
|
||||||
struct ImGuiTextEditState;
|
struct ImGuiContext; // Main imgui context
|
||||||
struct ImGuiPopupRef;
|
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
|
||||||
struct ImGuiWindow;
|
struct ImGuiItemHoveredDataBackup; // Backup and restore IsItemHovered() internal data
|
||||||
struct ImGuiWindowSettings;
|
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
|
||||||
|
struct ImGuiNavMoveResult; // Result of a directional navigation move query result
|
||||||
|
struct ImGuiNextWindowData; // Storage for SetNexWindow** functions
|
||||||
|
struct ImGuiPopupRef; // Storage for current popup stack
|
||||||
|
struct ImGuiSettingsHandler;
|
||||||
|
struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
|
||||||
|
struct ImGuiTextEditState; // Internal state of the currently focused/edited text input box
|
||||||
|
struct ImGuiWindow; // Storage for one window
|
||||||
|
struct ImGuiWindowTempData; // Temporary storage for one, that's the data which in theory we could ditch at the end of the frame
|
||||||
|
struct ImGuiWindowSettings; // Storage for window settings stored in .ini file (we keep one of those even if the actual window wasn't instanced during this session)
|
||||||
|
|
||||||
typedef int ImGuiLayoutType; // enum: horizontal or vertical // enum ImGuiLayoutType_
|
typedef int ImGuiLayoutType; // enum: horizontal or vertical // enum ImGuiLayoutType_
|
||||||
typedef int ImGuiButtonFlags; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_
|
typedef int ImGuiButtonFlags; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_
|
||||||
@ -50,6 +59,7 @@ typedef int ImGuiItemFlags; // flags: for PushItemFlag()
|
|||||||
typedef int ImGuiItemStatusFlags; // flags: storage for DC.LastItemXXX // enum ImGuiItemStatusFlags_
|
typedef int ImGuiItemStatusFlags; // flags: storage for DC.LastItemXXX // enum ImGuiItemStatusFlags_
|
||||||
typedef int ImGuiNavHighlightFlags; // flags: for RenderNavHighlight() // enum ImGuiNavHighlightFlags_
|
typedef int ImGuiNavHighlightFlags; // flags: for RenderNavHighlight() // enum ImGuiNavHighlightFlags_
|
||||||
typedef int ImGuiNavDirSourceFlags; // flags: for GetNavInputAmount2d() // enum ImGuiNavDirSourceFlags_
|
typedef int ImGuiNavDirSourceFlags; // flags: for GetNavInputAmount2d() // enum ImGuiNavDirSourceFlags_
|
||||||
|
typedef int ImGuiNavMoveFlags; // flags: for navigation requests // enum ImGuiNavMoveFlags_
|
||||||
typedef int ImGuiSeparatorFlags; // flags: for Separator() - internal // enum ImGuiSeparatorFlags_
|
typedef int ImGuiSeparatorFlags; // flags: for Separator() - internal // enum ImGuiSeparatorFlags_
|
||||||
typedef int ImGuiSliderFlags; // flags: for SliderBehavior() // enum ImGuiSliderFlags_
|
typedef int ImGuiSliderFlags; // flags: for SliderBehavior() // enum ImGuiSliderFlags_
|
||||||
|
|
||||||
@ -227,10 +237,11 @@ enum ImGuiColumnsFlags_
|
|||||||
enum ImGuiSelectableFlagsPrivate_
|
enum ImGuiSelectableFlagsPrivate_
|
||||||
{
|
{
|
||||||
// NB: need to be in sync with last value of ImGuiSelectableFlags_
|
// NB: need to be in sync with last value of ImGuiSelectableFlags_
|
||||||
ImGuiSelectableFlags_Menu = 1 << 3, // -> PressedOnClick
|
ImGuiSelectableFlags_NoHoldingActiveID = 1 << 3,
|
||||||
ImGuiSelectableFlags_MenuItem = 1 << 4, // -> PressedOnRelease
|
ImGuiSelectableFlags_PressedOnClick = 1 << 4,
|
||||||
ImGuiSelectableFlags_Disabled = 1 << 5,
|
ImGuiSelectableFlags_PressedOnRelease = 1 << 5,
|
||||||
ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 6
|
ImGuiSelectableFlags_Disabled = 1 << 6,
|
||||||
|
ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 7
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ImGuiSeparatorFlags_
|
enum ImGuiSeparatorFlags_
|
||||||
@ -302,6 +313,14 @@ enum ImGuiNavDirSourceFlags_
|
|||||||
ImGuiNavDirSourceFlags_PadLStick = 1 << 2
|
ImGuiNavDirSourceFlags_PadLStick = 1 << 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ImGuiNavMoveFlags_
|
||||||
|
{
|
||||||
|
ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
|
||||||
|
ImGuiNavMoveFlags_LoopY = 1 << 1,
|
||||||
|
ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
|
||||||
|
ImGuiNavMoveFlags_WrapY = 1 << 3 // This is not super useful for provided for completeness
|
||||||
|
};
|
||||||
|
|
||||||
enum ImGuiNavForward
|
enum ImGuiNavForward
|
||||||
{
|
{
|
||||||
ImGuiNavForward_None,
|
ImGuiNavForward_None,
|
||||||
@ -337,6 +356,8 @@ struct IMGUI_API ImRect
|
|||||||
void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
|
void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
|
||||||
void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
|
void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
|
||||||
void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
|
void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
|
||||||
|
void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
|
||||||
|
void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
|
||||||
void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
|
void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
|
||||||
void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
|
void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
|
||||||
void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
||||||
@ -360,7 +381,7 @@ struct ImGuiStyleMod
|
|||||||
ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
|
ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Stacked data for BeginGroup()/EndGroup()
|
// Stacked storage data for BeginGroup()/EndGroup()
|
||||||
struct ImGuiGroupData
|
struct ImGuiGroupData
|
||||||
{
|
{
|
||||||
ImVec2 BackupCursorPos;
|
ImVec2 BackupCursorPos;
|
||||||
@ -374,7 +395,7 @@ struct ImGuiGroupData
|
|||||||
bool AdvanceCursor;
|
bool AdvanceCursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Simple column measurement currently used for MenuItem() only. This is very short-sighted/throw-away code and NOT a generic helper.
|
// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
|
||||||
struct IMGUI_API ImGuiMenuColumns
|
struct IMGUI_API ImGuiMenuColumns
|
||||||
{
|
{
|
||||||
int Count;
|
int Count;
|
||||||
@ -412,7 +433,7 @@ struct IMGUI_API ImGuiTextEditState
|
|||||||
void OnKeyPressed(int key);
|
void OnKeyPressed(int key);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Data saved in imgui.ini file
|
// Windows data saved in imgui.ini file
|
||||||
struct ImGuiWindowSettings
|
struct ImGuiWindowSettings
|
||||||
{
|
{
|
||||||
char* Name;
|
char* Name;
|
||||||
@ -491,6 +512,7 @@ struct ImGuiColumnsSet
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Data shared between all ImDrawList instances
|
||||||
struct IMGUI_API ImDrawListSharedData
|
struct IMGUI_API ImDrawListSharedData
|
||||||
{
|
{
|
||||||
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
||||||
@ -602,7 +624,7 @@ struct ImGuiNextWindowData
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Main state for ImGui
|
// Main imgui context
|
||||||
struct ImGuiContext
|
struct ImGuiContext
|
||||||
{
|
{
|
||||||
bool Initialized;
|
bool Initialized;
|
||||||
@ -690,8 +712,10 @@ struct ImGuiContext
|
|||||||
ImRect NavInitResultRectRel;
|
ImRect NavInitResultRectRel;
|
||||||
bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items
|
bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items
|
||||||
bool NavMoveRequest; // Move request for this frame
|
bool NavMoveRequest; // Move request for this frame
|
||||||
|
ImGuiNavMoveFlags NavMoveRequestFlags;
|
||||||
ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
|
ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
|
||||||
ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request
|
ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request
|
||||||
|
ImGuiDir NavMoveClipDir;
|
||||||
ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow
|
ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow
|
||||||
ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using the NavFlattened flag)
|
ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using the NavFlattened flag)
|
||||||
|
|
||||||
@ -812,8 +836,9 @@ struct ImGuiContext
|
|||||||
NavInitResultId = 0;
|
NavInitResultId = 0;
|
||||||
NavMoveFromClampedRefRect = false;
|
NavMoveFromClampedRefRect = false;
|
||||||
NavMoveRequest = false;
|
NavMoveRequest = false;
|
||||||
|
NavMoveRequestFlags = 0;
|
||||||
NavMoveRequestForward = ImGuiNavForward_None;
|
NavMoveRequestForward = ImGuiNavForward_None;
|
||||||
NavMoveDir = NavMoveDirLast = ImGuiDir_None;
|
NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None;
|
||||||
|
|
||||||
ModalWindowDarkeningRatio = 0.0f;
|
ModalWindowDarkeningRatio = 0.0f;
|
||||||
MouseCursor = ImGuiMouseCursor_Arrow;
|
MouseCursor = ImGuiMouseCursor_Arrow;
|
||||||
@ -866,9 +891,9 @@ enum ImGuiItemFlags_
|
|||||||
ImGuiItemFlags_Default_ = ImGuiItemFlags_AllowKeyboardFocus
|
ImGuiItemFlags_Default_ = ImGuiItemFlags_AllowKeyboardFocus
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transient per-window data, reset at the beginning of the frame
|
// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
|
||||||
// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiDrawContext is quite tenuous and could be reconsidered.
|
// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered.
|
||||||
struct IMGUI_API ImGuiDrawContext
|
struct IMGUI_API ImGuiWindowTempData
|
||||||
{
|
{
|
||||||
ImVec2 CursorPos;
|
ImVec2 CursorPos;
|
||||||
ImVec2 CursorPosPrevLine;
|
ImVec2 CursorPosPrevLine;
|
||||||
@ -913,7 +938,7 @@ struct IMGUI_API ImGuiDrawContext
|
|||||||
float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
|
float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
|
||||||
ImGuiColumnsSet* ColumnsSet; // Current columns set
|
ImGuiColumnsSet* ColumnsSet; // Current columns set
|
||||||
|
|
||||||
ImGuiDrawContext()
|
ImGuiWindowTempData()
|
||||||
{
|
{
|
||||||
CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
|
CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
|
||||||
CurrentLineHeight = PrevLineHeight = 0.0f;
|
CurrentLineHeight = PrevLineHeight = 0.0f;
|
||||||
@ -945,7 +970,7 @@ struct IMGUI_API ImGuiDrawContext
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Windows data
|
// Storage for one window
|
||||||
struct IMGUI_API ImGuiWindow
|
struct IMGUI_API ImGuiWindow
|
||||||
{
|
{
|
||||||
char* Name;
|
char* Name;
|
||||||
@ -997,7 +1022,7 @@ struct IMGUI_API ImGuiWindow
|
|||||||
ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
|
ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
|
||||||
ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.
|
ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.
|
||||||
|
|
||||||
ImGuiDrawContext DC; // Temporary per-window data, reset at the beginning of the frame
|
ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
|
||||||
ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack
|
ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack
|
||||||
ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
|
ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
|
||||||
ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
|
ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
|
||||||
@ -1134,6 +1159,8 @@ namespace ImGui
|
|||||||
|
|
||||||
IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
|
IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
|
||||||
IMGUI_API void NavMoveRequestCancel();
|
IMGUI_API void NavMoveRequestCancel();
|
||||||
|
IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags);
|
||||||
|
IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
|
||||||
IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
|
IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
|
||||||
|
|
||||||
IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
|
IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
|
||||||
|
@ -5,11 +5,12 @@ You may also load external .TTF/.OTF files.
|
|||||||
The files in this folder are suggested fonts, provided as a convenience.
|
The files in this folder are suggested fonts, provided as a convenience.
|
||||||
(Note: .OTF support in stb_truetype.h currently doesn't appear to load every font)
|
(Note: .OTF support in stb_truetype.h currently doesn't appear to load every font)
|
||||||
|
|
||||||
Fonts are rasterized in a single texture at the time of calling either of io.Fonts.GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
|
Fonts are rasterized in a single texture at the time of calling either of io.Fonts->GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
|
||||||
Also read dear imgui FAQ in imgui.cpp!
|
Also read dear imgui FAQ in imgui.cpp!
|
||||||
|
|
||||||
In this document:
|
In this document:
|
||||||
|
|
||||||
|
- Readme First / FAQ
|
||||||
- Using Icons
|
- Using Icons
|
||||||
- Fonts Loading Instructions
|
- Fonts Loading Instructions
|
||||||
- FreeType rasterizer, Small font sizes
|
- FreeType rasterizer, Small font sizes
|
||||||
@ -20,6 +21,16 @@ In this document:
|
|||||||
- Links, Other fonts
|
- Links, Other fonts
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------
|
||||||
|
README FIRST / FAQ
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
- You can use the style editor ImGui::ShowStyleEditor() to browse your fonts and understand what's going on if you have an issue.
|
||||||
|
- Make sure your font ranges data are persistent (available during the call to GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
|
||||||
|
- Use C++11 u8"my text" syntax to encode literal strings as UTF-8.
|
||||||
|
- If you want to include a backslash \ character in your string literal, you need to double them e.g. "folder\\filename".
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
USING ICONS
|
USING ICONS
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user