Merge branch 'master' into docking (with fixes)
# Conflicts: # imgui.cpp # imgui_internal.h
This commit is contained in:
commit
a1e43c682a
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -168,7 +168,7 @@ jobs:
|
|||||||
run: make -C examples/example_sdl_opengl3
|
run: make -C examples/example_sdl_opengl3
|
||||||
|
|
||||||
MacOS:
|
MacOS:
|
||||||
runs-on: macOS-10.14
|
runs-on: macOS-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
with:
|
with:
|
||||||
@ -206,7 +206,7 @@ jobs:
|
|||||||
run: xcodebuild -project examples/example_apple_opengl2/example_apple_opengl2.xcodeproj -target example_osx_opengl2
|
run: xcodebuild -project examples/example_apple_opengl2/example_apple_opengl2.xcodeproj -target example_osx_opengl2
|
||||||
|
|
||||||
iOS:
|
iOS:
|
||||||
runs-on: macOS-10.14
|
runs-on: macOS-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
with:
|
with:
|
||||||
|
@ -132,6 +132,8 @@ Other Changes:
|
|||||||
multi-line label and no frame padding, such as: multi-line text, small button, tree node item, etc.
|
multi-line label and no frame padding, such as: multi-line text, small button, tree node item, etc.
|
||||||
The second item was correctly offset to match text baseline, and would interact/display correctly,
|
The second item was correctly offset to match text baseline, and would interact/display correctly,
|
||||||
but it wouldn't push the contents area boundary low enough.
|
but it wouldn't push the contents area boundary low enough.
|
||||||
|
- Scrollbar: Fixed an issue where scrollbars wouldn't display on the frame following a frame where
|
||||||
|
all child window contents would be culled.
|
||||||
- ColorPicker: Fixed SV triangle gradient to block (broken in 1.73). (#2864, #2711). [@lewa-j]
|
- ColorPicker: Fixed SV triangle gradient to block (broken in 1.73). (#2864, #2711). [@lewa-j]
|
||||||
- TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow
|
- TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow
|
||||||
incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897)
|
incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897)
|
||||||
@ -141,8 +143,11 @@ Other Changes:
|
|||||||
interactions with custom multi-selections patterns. (#1896, #1861)
|
interactions with custom multi-selections patterns. (#1896, #1861)
|
||||||
- DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the data
|
- DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the data
|
||||||
to clarify how they are used, and more comments redirecting to the demo code. (#2844)
|
to clarify how they are used, and more comments redirecting to the demo code. (#2844)
|
||||||
|
- Error handling: Assert if user mistakenly calls End() instead of EndChild() on a child window. (#1651)
|
||||||
- Misc: Optimized storage of window settings data (reducing allocation count).
|
- Misc: Optimized storage of window settings data (reducing allocation count).
|
||||||
- Misc: Windows: Do not use _wfopen() if IMGUI_DISABLE_WIN32_FUNCTIONS is defined. (#2815)
|
- Misc: Windows: Do not use _wfopen() if IMGUI_DISABLE_WIN32_FUNCTIONS is defined. (#2815)
|
||||||
|
- Misc: Windows: Disabled win32 function by default when building with UWP. (#2892, #2895)
|
||||||
|
- Misc: Using static_assert() when using C++11, instead of our own construct (avoid zealous Clang warnings).
|
||||||
- Docs: Improved and moved FAQ to docs/FAQ.md so it can be readable on the web. [@ButternCream, @ocornut]
|
- Docs: Improved and moved FAQ to docs/FAQ.md so it can be readable on the web. [@ButternCream, @ocornut]
|
||||||
- Docs: Added permanent redirect from https://www.dearimgui.org/faq to FAQ page.
|
- Docs: Added permanent redirect from https://www.dearimgui.org/faq to FAQ page.
|
||||||
- Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups]
|
- Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups]
|
||||||
|
189
imgui.cpp
189
imgui.cpp
@ -54,6 +54,7 @@ CODE
|
|||||||
// [SECTION] ImGuiListClipper
|
// [SECTION] ImGuiListClipper
|
||||||
// [SECTION] RENDER HELPERS
|
// [SECTION] RENDER HELPERS
|
||||||
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
||||||
|
// [SECTION] ERROR CHECKING
|
||||||
// [SECTION] SCROLLING
|
// [SECTION] SCROLLING
|
||||||
// [SECTION] TOOLTIPS
|
// [SECTION] TOOLTIPS
|
||||||
// [SECTION] POPUPS
|
// [SECTION] POPUPS
|
||||||
@ -362,7 +363,7 @@ CODE
|
|||||||
- 2019/XX/XX (1.XX) - Moved IME support functions from io.ImeSetInputScreenPosFn, io.ImeWindowHandle to the PlatformIO api.
|
- 2019/XX/XX (1.XX) - Moved IME support functions from io.ImeSetInputScreenPosFn, io.ImeWindowHandle to the PlatformIO api.
|
||||||
|
|
||||||
|
|
||||||
- 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): Begin() (5 arguments signature), IsRootWindowOrAnyChildHovered(), AlignFirstTextHeightToWidgets(), SetNextWindowPosCenter(), ImFont::Glyph. Grep this log for details and new names, or see how they were implemented until 1.73.
|
- 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): Begin() (5 arguments signature), IsRootWindowOrAnyChildHovered(), AlignFirstTextHeightToWidgets(), SetNextWindowPosCenter(), ImFont::Glyph. See docs/Changelog.txt or grep this log for details and new names, or see how they were implemented until 1.73.
|
||||||
- 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function.
|
- 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function.
|
||||||
if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix.
|
if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix.
|
||||||
The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay).
|
The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay).
|
||||||
@ -853,7 +854,6 @@ static void SetCurrentWindow(ImGuiWindow* window);
|
|||||||
static void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
|
static void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
|
||||||
static void FindHoveredWindow();
|
static void FindHoveredWindow();
|
||||||
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);
|
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);
|
||||||
static void CheckStacksSize(ImGuiWindow* window, bool write);
|
|
||||||
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
|
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
|
||||||
|
|
||||||
static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
|
static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
|
||||||
@ -886,6 +886,10 @@ static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_win
|
|||||||
static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window);
|
static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window);
|
||||||
static int FindWindowFocusIndex(ImGuiWindow* window);
|
static int FindWindowFocusIndex(ImGuiWindow* window);
|
||||||
|
|
||||||
|
// Error Checking
|
||||||
|
static void ErrorCheckEndFrame();
|
||||||
|
static void ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write);
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
static void UpdateMouseInputs();
|
static void UpdateMouseInputs();
|
||||||
static void UpdateMouseWheel();
|
static void UpdateMouseWheel();
|
||||||
@ -3748,7 +3752,7 @@ void ImGui::NewFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
g.Time += g.IO.DeltaTime;
|
g.Time += g.IO.DeltaTime;
|
||||||
g.FrameScopeActive = true;
|
g.WithinFrameScope = true;
|
||||||
g.FrameCount += 1;
|
g.FrameCount += 1;
|
||||||
g.TooltipOverrideCount = 0;
|
g.TooltipOverrideCount = 0;
|
||||||
g.WindowsActiveCount = 0;
|
g.WindowsActiveCount = 0;
|
||||||
@ -3931,7 +3935,7 @@ void ImGui::NewFrame()
|
|||||||
// Create implicit/fallback window - which we will only render it if the user has added something to it.
|
// Create implicit/fallback window - which we will only render it if the user has added something to it.
|
||||||
// We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags.
|
// We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags.
|
||||||
// This fallback is particularly important as it avoid ImGui:: calls from crashing.
|
// This fallback is particularly important as it avoid ImGui:: calls from crashing.
|
||||||
g.FrameScopePushedFallbackWindow = true;
|
g.WithinFrameScopeWithImplicitWindow = true;
|
||||||
SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver);
|
SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver);
|
||||||
Begin("Debug##Default");
|
Begin("Debug##Default");
|
||||||
IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true);
|
IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true);
|
||||||
@ -4285,7 +4289,7 @@ void ImGui::EndFrame()
|
|||||||
IM_ASSERT(g.Initialized);
|
IM_ASSERT(g.Initialized);
|
||||||
if (g.FrameCountEnded == g.FrameCount) // Don't process EndFrame() multiple times.
|
if (g.FrameCountEnded == g.FrameCount) // Don't process EndFrame() multiple times.
|
||||||
return;
|
return;
|
||||||
IM_ASSERT(g.FrameScopeActive && "Forgot to call ImGui::NewFrame()?");
|
IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?");
|
||||||
|
|
||||||
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
|
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
|
||||||
if (g.PlatformIO.Platform_SetImeInputPos && (g.PlatformImeLastPos.x == FLT_MAX || ImLengthSqr(g.PlatformImePos - g.PlatformImeLastPos) > 0.0001f))
|
if (g.PlatformIO.Platform_SetImeInputPos && (g.PlatformImeLastPos.x == FLT_MAX || ImLengthSqr(g.PlatformImePos - g.PlatformImeLastPos) > 0.0001f))
|
||||||
@ -4296,24 +4300,10 @@ void ImGui::EndFrame()
|
|||||||
g.PlatformImePosViewport = NULL;
|
g.PlatformImePosViewport = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
|
ErrorCheckEndFrame();
|
||||||
// to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API).
|
|
||||||
if (g.CurrentWindowStack.Size != 1)
|
|
||||||
{
|
|
||||||
if (g.CurrentWindowStack.Size > 1)
|
|
||||||
{
|
|
||||||
IM_ASSERT(g.CurrentWindowStack.Size == 1 && "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?");
|
|
||||||
while (g.CurrentWindowStack.Size > 1) // FIXME-ERRORHANDLING
|
|
||||||
End();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IM_ASSERT(g.CurrentWindowStack.Size == 1 && "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hide implicit/fallback "Debug" window if it hasn't been used
|
// Hide implicit/fallback "Debug" window if it hasn't been used
|
||||||
g.FrameScopePushedFallbackWindow = false;
|
g.WithinFrameScopeWithImplicitWindow = false;
|
||||||
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
|
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
|
||||||
g.CurrentWindow->Active = false;
|
g.CurrentWindow->Active = false;
|
||||||
End();
|
End();
|
||||||
@ -4345,7 +4335,7 @@ void ImGui::EndFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// End frame
|
// End frame
|
||||||
g.FrameScopeActive = false;
|
g.WithinFrameScope = false;
|
||||||
g.FrameCountEnded = g.FrameCount;
|
g.FrameCountEnded = g.FrameCount;
|
||||||
|
|
||||||
// Initiate moving window + handle left-click and right-click focus
|
// Initiate moving window + handle left-click and right-click focus
|
||||||
@ -4959,7 +4949,10 @@ void ImGui::EndChild()
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
|
||||||
|
IM_ASSERT(g.WithinEndChild == false);
|
||||||
IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss
|
IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss
|
||||||
|
|
||||||
|
g.WithinEndChild = true;
|
||||||
if (window->BeginCount > 1)
|
if (window->BeginCount > 1)
|
||||||
{
|
{
|
||||||
End();
|
End();
|
||||||
@ -4991,6 +4984,7 @@ void ImGui::EndChild()
|
|||||||
ItemAdd(bb, 0);
|
ItemAdd(bb, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
g.WithinEndChild = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper to create a child window / scrolling region that looks like a normal widget frame.
|
// Helper to create a child window / scrolling region that looks like a normal widget frame.
|
||||||
@ -5013,22 +5007,6 @@ void ImGui::EndChildFrame()
|
|||||||
EndChild();
|
EndChild();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save and compare stack sizes on Begin()/End() to detect usage errors
|
|
||||||
static void CheckStacksSize(ImGuiWindow* window, bool write)
|
|
||||||
{
|
|
||||||
// NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
|
|
||||||
ImGuiContext& g = *GImGui;
|
|
||||||
short* p_backup = &window->DC.StackSizesBackup[0];
|
|
||||||
{ int current = window->IDStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "PushID/PopID or TreeNode/TreePop Mismatch!"); p_backup++; } // Too few or too many PopID()/TreePop()
|
|
||||||
{ int current = window->DC.GroupStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "BeginGroup/EndGroup Mismatch!"); p_backup++; } // Too few or too many EndGroup()
|
|
||||||
{ int current = g.BeginPopupStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch"); p_backup++;}// Too few or too many EndMenu()/EndPopup()
|
|
||||||
// For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
|
|
||||||
{ int current = g.ColorModifiers.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushStyleColor/PopStyleColor Mismatch!"); p_backup++; } // Too few or too many PopStyleColor()
|
|
||||||
{ int current = g.StyleModifiers.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushStyleVar/PopStyleVar Mismatch!"); p_backup++; } // Too few or too many PopStyleVar()
|
|
||||||
{ int current = g.FontStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushFont/PopFont Mismatch!"); p_backup++; } // Too few or too many PopFont()
|
|
||||||
IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled)
|
static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled)
|
||||||
{
|
{
|
||||||
window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags);
|
window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags);
|
||||||
@ -5455,6 +5433,9 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
|
|||||||
ImGuiStyle& style = g.Style;
|
ImGuiStyle& style = g.Style;
|
||||||
ImGuiWindowFlags flags = window->Flags;
|
ImGuiWindowFlags flags = window->Flags;
|
||||||
|
|
||||||
|
// Ensure that ScrollBar doesn't read last frame's SkipItems
|
||||||
|
window->SkipItems = false;
|
||||||
|
|
||||||
// Draw window + handle manual resize
|
// Draw window + handle manual resize
|
||||||
// As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame.
|
// As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame.
|
||||||
const float window_rounding = window->WindowRounding;
|
const float window_rounding = window->WindowRounding;
|
||||||
@ -5677,7 +5658,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
const ImGuiStyle& style = g.Style;
|
const ImGuiStyle& style = g.Style;
|
||||||
IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required
|
IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required
|
||||||
IM_ASSERT(g.FrameScopeActive); // Forgot to call ImGui::NewFrame()
|
IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame()
|
||||||
IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet
|
IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet
|
||||||
|
|
||||||
// Find or create
|
// Find or create
|
||||||
@ -5698,7 +5679,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
|
|
||||||
const int current_frame = g.FrameCount;
|
const int current_frame = g.FrameCount;
|
||||||
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
|
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
|
||||||
window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.FrameScopePushedFallbackWindow);
|
window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow);
|
||||||
|
|
||||||
// Update the Appearing flag
|
// Update the Appearing flag
|
||||||
bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
|
bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
|
||||||
@ -5760,7 +5741,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
// We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
|
// We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
|
||||||
g.CurrentWindowStack.push_back(window);
|
g.CurrentWindowStack.push_back(window);
|
||||||
g.CurrentWindow = NULL;
|
g.CurrentWindow = NULL;
|
||||||
CheckStacksSize(window, true);
|
ErrorCheckBeginEndCompareStacksSize(window, true);
|
||||||
if (flags & ImGuiWindowFlags_Popup)
|
if (flags & ImGuiWindowFlags_Popup)
|
||||||
{
|
{
|
||||||
ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
|
ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
|
||||||
@ -6484,16 +6465,21 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
void ImGui::End()
|
void ImGui::End()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
|
||||||
if (g.CurrentWindowStack.Size <= 1 && g.FrameScopePushedFallbackWindow)
|
// Error checking: verify that user hasn't called End() too many times!
|
||||||
|
if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow)
|
||||||
{
|
{
|
||||||
IM_ASSERT(g.CurrentWindowStack.Size > 1 && "Calling End() too many times!");
|
IMGUI_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!");
|
||||||
return; // FIXME-ERRORHANDLING
|
return;
|
||||||
}
|
}
|
||||||
IM_ASSERT(g.CurrentWindowStack.Size > 0);
|
IM_ASSERT(g.CurrentWindowStack.Size > 0);
|
||||||
|
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
// Error checking: verify that user doesn't directly call End() on a child window.
|
||||||
|
if ((window->Flags & ImGuiWindowFlags_ChildWindow) && !window->DockIsActive)
|
||||||
|
IMGUI_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!");
|
||||||
|
|
||||||
|
// Close anything that is open
|
||||||
if (window->DC.CurrentColumns)
|
if (window->DC.CurrentColumns)
|
||||||
EndColumns();
|
EndColumns();
|
||||||
if (!(window->Flags & ImGuiWindowFlags_DockNodeHost)) // Pop inner window clip rectangle
|
if (!(window->Flags & ImGuiWindowFlags_DockNodeHost)) // Pop inner window clip rectangle
|
||||||
@ -6512,7 +6498,7 @@ void ImGui::End()
|
|||||||
g.CurrentWindowStack.pop_back();
|
g.CurrentWindowStack.pop_back();
|
||||||
if (window->Flags & ImGuiWindowFlags_Popup)
|
if (window->Flags & ImGuiWindowFlags_Popup)
|
||||||
g.BeginPopupStack.pop_back();
|
g.BeginPopupStack.pop_back();
|
||||||
CheckStacksSize(window, false);
|
ErrorCheckBeginEndCompareStacksSize(window, false);
|
||||||
SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back());
|
SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back());
|
||||||
if (g.CurrentWindow)
|
if (g.CurrentWindow)
|
||||||
SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport);
|
SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport);
|
||||||
@ -7727,6 +7713,54 @@ void ImGui::Unindent(float indent_w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] ERROR CHECKING
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static void ImGui::ErrorCheckEndFrame()
|
||||||
|
{
|
||||||
|
// Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
|
||||||
|
// to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API).
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (g.CurrentWindowStack.Size != 1)
|
||||||
|
{
|
||||||
|
if (g.CurrentWindowStack.Size > 1)
|
||||||
|
{
|
||||||
|
IMGUI_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?");
|
||||||
|
while (g.CurrentWindowStack.Size > 1)
|
||||||
|
End();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IMGUI_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save and compare stack sizes on Begin()/End() to detect usage errors
|
||||||
|
// Begin() calls this with write=true
|
||||||
|
// End() calls this with write=false
|
||||||
|
static void ImGui::ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
short* p = &window->DC.StackSizesBackup[0];
|
||||||
|
|
||||||
|
// Window stacks
|
||||||
|
// NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
|
||||||
|
{ int n = window->IDStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "PushID/PopID or TreeNode/TreePop Mismatch!"); p++; } // Too few or too many PopID()/TreePop()
|
||||||
|
{ int n = window->DC.GroupStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "BeginGroup/EndGroup Mismatch!"); p++; } // Too few or too many EndGroup()
|
||||||
|
|
||||||
|
// Global stacks
|
||||||
|
// For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
|
||||||
|
{ int n = g.BeginPopupStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch!"); p++; }// Too few or too many EndMenu()/EndPopup()
|
||||||
|
{ int n = g.ColorModifiers.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushStyleColor/PopStyleColor Mismatch!"); p++; } // Too few or too many PopStyleColor()
|
||||||
|
{ int n = g.StyleModifiers.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushStyleVar/PopStyleVar Mismatch!"); p++; } // Too few or too many PopStyleVar()
|
||||||
|
{ int n = g.FontStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushFont/PopFont Mismatch!"); p++; } // Too few or too many PopFont()
|
||||||
|
IM_ASSERT(p == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] SCROLLING
|
// [SECTION] SCROLLING
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -8209,13 +8243,19 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
|
|||||||
void ImGui::EndPopup()
|
void ImGui::EndPopup()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
IM_ASSERT(g.CurrentWindow->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls
|
||||||
IM_ASSERT(g.BeginPopupStack.Size > 0);
|
IM_ASSERT(g.BeginPopupStack.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.
|
||||||
NavMoveRequestTryWrapping(g.CurrentWindow, ImGuiNavMoveFlags_LoopY);
|
NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY);
|
||||||
|
|
||||||
|
// Child-popups don't need to be layed out
|
||||||
|
IM_ASSERT(g.WithinEndChild == false);
|
||||||
|
if (window->Flags & ImGuiWindowFlags_ChildWindow)
|
||||||
|
g.WithinEndChild = true;
|
||||||
End();
|
End();
|
||||||
|
g.WithinEndChild = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button)
|
bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button)
|
||||||
@ -8913,7 +8953,7 @@ static void ImGui::NavUpdate()
|
|||||||
g.IO.NavVisible = (g.IO.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
|
g.IO.NavVisible = (g.IO.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
|
||||||
|
|
||||||
// Process NavCancel input (to close a popup, get back to parent, clear focus)
|
// Process NavCancel input (to close a popup, get back to parent, clear focus)
|
||||||
if (IsNavInputPressed(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
|
if (IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
|
||||||
{
|
{
|
||||||
if (g.ActiveId != 0)
|
if (g.ActiveId != 0)
|
||||||
{
|
{
|
||||||
@ -8957,14 +8997,14 @@ static void ImGui::NavUpdate()
|
|||||||
if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
||||||
{
|
{
|
||||||
bool activate_down = IsNavInputDown(ImGuiNavInput_Activate);
|
bool activate_down = IsNavInputDown(ImGuiNavInput_Activate);
|
||||||
bool activate_pressed = activate_down && IsNavInputPressed(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed);
|
bool activate_pressed = activate_down && IsNavInputTest(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed);
|
||||||
if (g.ActiveId == 0 && activate_pressed)
|
if (g.ActiveId == 0 && activate_pressed)
|
||||||
g.NavActivateId = g.NavId;
|
g.NavActivateId = g.NavId;
|
||||||
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down)
|
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down)
|
||||||
g.NavActivateDownId = g.NavId;
|
g.NavActivateDownId = g.NavId;
|
||||||
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed)
|
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed)
|
||||||
g.NavActivatePressedId = g.NavId;
|
g.NavActivatePressedId = g.NavId;
|
||||||
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputPressed(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed))
|
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputTest(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed))
|
||||||
g.NavInputId = g.NavId;
|
g.NavInputId = g.NavId;
|
||||||
}
|
}
|
||||||
if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
||||||
@ -8985,10 +9025,11 @@ static void ImGui::NavUpdate()
|
|||||||
g.NavMoveRequestFlags = ImGuiNavMoveFlags_None;
|
g.NavMoveRequestFlags = ImGuiNavMoveFlags_None;
|
||||||
if (g.NavWindow && !g.NavWindowingTarget && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
if (g.NavWindow && !g.NavWindowingTarget && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
|
||||||
{
|
{
|
||||||
if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Left; }
|
const ImGuiInputReadMode read_mode = ImGuiInputReadMode_Repeat;
|
||||||
if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadRight,ImGuiNavInput_KeyRight_,ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Right; }
|
if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && (IsNavInputTest(ImGuiNavInput_DpadLeft, read_mode) || IsNavInputTest(ImGuiNavInput_KeyLeft_, read_mode))) { g.NavMoveDir = ImGuiDir_Left; }
|
||||||
if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Up; }
|
if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && (IsNavInputTest(ImGuiNavInput_DpadRight, read_mode) || IsNavInputTest(ImGuiNavInput_KeyRight_, read_mode))) { g.NavMoveDir = ImGuiDir_Right; }
|
||||||
if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) { g.NavMoveDir = ImGuiDir_Down; }
|
if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && (IsNavInputTest(ImGuiNavInput_DpadUp, read_mode) || IsNavInputTest(ImGuiNavInput_KeyUp_, read_mode))) { g.NavMoveDir = ImGuiDir_Up; }
|
||||||
|
if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && (IsNavInputTest(ImGuiNavInput_DpadDown, read_mode) || IsNavInputTest(ImGuiNavInput_KeyDown_, read_mode))) { g.NavMoveDir = ImGuiDir_Down; }
|
||||||
}
|
}
|
||||||
g.NavMoveClipDir = g.NavMoveDir;
|
g.NavMoveClipDir = g.NavMoveDir;
|
||||||
}
|
}
|
||||||
@ -9283,7 +9324,7 @@ static void ImGui::NavUpdateWindowing()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start CTRL-TAB or Square+L/R window selection
|
// Start CTRL-TAB or Square+L/R window selection
|
||||||
bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed);
|
bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputTest(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed);
|
||||||
bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard);
|
bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard);
|
||||||
if (start_windowing_with_gamepad || start_windowing_with_keyboard)
|
if (start_windowing_with_gamepad || start_windowing_with_keyboard)
|
||||||
if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1))
|
if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1))
|
||||||
@ -9302,7 +9343,7 @@ static void ImGui::NavUpdateWindowing()
|
|||||||
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f));
|
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f));
|
||||||
|
|
||||||
// Select window to focus
|
// Select window to focus
|
||||||
const int focus_change_dir = (int)IsNavInputPressed(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputPressed(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow);
|
const int focus_change_dir = (int)IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow);
|
||||||
if (focus_change_dir != 0)
|
if (focus_change_dir != 0)
|
||||||
{
|
{
|
||||||
NavUpdateWindowingHighlightWindow(focus_change_dir);
|
NavUpdateWindowingHighlightWindow(focus_change_dir);
|
||||||
@ -9334,9 +9375,9 @@ static void ImGui::NavUpdateWindowing()
|
|||||||
|
|
||||||
// Keyboard: Press and Release ALT to toggle menu layer
|
// Keyboard: Press and Release ALT to toggle menu layer
|
||||||
// FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of back-end clearing releases all keys on ALT-TAB
|
// FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of back-end clearing releases all keys on ALT-TAB
|
||||||
if (IsNavInputPressed(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed))
|
if (IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed))
|
||||||
g.NavWindowingToggleLayer = true;
|
g.NavWindowingToggleLayer = true;
|
||||||
if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputPressed(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released))
|
if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released))
|
||||||
if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev))
|
if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev))
|
||||||
apply_toggle_layer = true;
|
apply_toggle_layer = true;
|
||||||
|
|
||||||
@ -13559,7 +13600,9 @@ void ImGui::DockSpace(ImGuiID id, const ImVec2& size_arg, ImGuiDockNodeFlags fla
|
|||||||
IM_ASSERT(node->IsRootNode());
|
IM_ASSERT(node->IsRootNode());
|
||||||
DockNodeUpdate(node);
|
DockNodeUpdate(node);
|
||||||
|
|
||||||
|
g.WithinEndChild = true;
|
||||||
End();
|
End();
|
||||||
|
g.WithinEndChild = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tips: Use with ImGuiDockNodeFlags_PassthruCentralNode!
|
// Tips: Use with ImGuiDockNodeFlags_PassthruCentralNode!
|
||||||
@ -14484,6 +14527,10 @@ static void ImGui::DockSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettings
|
|||||||
#else
|
#else
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have Win32 functions
|
||||||
|
#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
|
||||||
|
#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
|
||||||
|
#endif
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
#endif
|
#endif
|
||||||
@ -14676,6 +14723,21 @@ void ImGui::ShowViewportThumbnails()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef IMGUI_DISABLE_METRICS_WINDOW
|
#ifndef IMGUI_DISABLE_METRICS_WINDOW
|
||||||
|
|
||||||
|
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
|
||||||
|
static void MetricsHelpMarker(const char* desc)
|
||||||
|
{
|
||||||
|
ImGui::TextDisabled("(?)");
|
||||||
|
if (ImGui::IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui::BeginTooltip();
|
||||||
|
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
|
||||||
|
ImGui::TextUnformatted(desc);
|
||||||
|
ImGui::PopTextWrapPos();
|
||||||
|
ImGui::EndTooltip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui::ShowMetricsWindow(bool* p_open)
|
void ImGui::ShowMetricsWindow(bool* p_open)
|
||||||
{
|
{
|
||||||
if (!ImGui::Begin("Dear ImGui Metrics", p_open))
|
if (!ImGui::Begin("Dear ImGui Metrics", p_open))
|
||||||
@ -14820,7 +14882,10 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
ImGui::BulletText("%s: NULL", label);
|
ImGui::BulletText("%s: NULL", label);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, (window->Active || window->WasActive), window))
|
bool open = ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, (window->Active || window->WasActive), window);
|
||||||
|
if (ImGui::IsItemHovered() && window->WasActive)
|
||||||
|
ImGui::GetForegroundDrawList()->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255));
|
||||||
|
if (!open)
|
||||||
return;
|
return;
|
||||||
ImGuiWindowFlags flags = window->Flags;
|
ImGuiWindowFlags flags = window->Flags;
|
||||||
NodeDrawList(window, window->Viewport, window->DrawList, "DrawList");
|
NodeDrawList(window, window->Viewport, window->DrawList, "DrawList");
|
||||||
@ -14830,7 +14895,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
(flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "",
|
(flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "",
|
||||||
(flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
|
(flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
|
||||||
ImGui::BulletText("WindowClassId: 0x%08X", window->WindowClass.ClassId);
|
ImGui::BulletText("WindowClassId: 0x%08X", window->WindowClass.ClassId);
|
||||||
ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y);
|
ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : "");
|
||||||
ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1);
|
ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1);
|
||||||
ImGui::BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems);
|
ImGui::BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems);
|
||||||
ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask);
|
ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask);
|
||||||
@ -15096,6 +15161,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
// The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
|
// The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
|
||||||
if (ImGui::Button("Item Picker.."))
|
if (ImGui::Button("Item Picker.."))
|
||||||
ImGui::DebugStartItemPicker();
|
ImGui::DebugStartItemPicker();
|
||||||
|
ImGui::SameLine();
|
||||||
|
MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
|
||||||
|
|
||||||
ImGui::Checkbox("Show windows begin order", &show_windows_begin_order);
|
ImGui::Checkbox("Show windows begin order", &show_windows_begin_order);
|
||||||
ImGui::Checkbox("Show windows rectangles", &show_windows_rects);
|
ImGui::Checkbox("Show windows rectangles", &show_windows_rects);
|
||||||
|
@ -2273,7 +2273,7 @@ static void ShowDemoWindowLayout()
|
|||||||
ImGui::TextUnformatted(names[i]);
|
ImGui::TextUnformatted(names[i]);
|
||||||
|
|
||||||
ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0;
|
ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0;
|
||||||
ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(child_w, 200.0f), true, child_flags);
|
bool window_visible = ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(child_w, 200.0f), true, child_flags);
|
||||||
if (ImGui::BeginMenuBar())
|
if (ImGui::BeginMenuBar())
|
||||||
{
|
{
|
||||||
ImGui::TextUnformatted("abc");
|
ImGui::TextUnformatted("abc");
|
||||||
@ -2283,16 +2283,19 @@ static void ShowDemoWindowLayout()
|
|||||||
ImGui::SetScrollY(scroll_to_off_px);
|
ImGui::SetScrollY(scroll_to_off_px);
|
||||||
if (scroll_to_pos)
|
if (scroll_to_pos)
|
||||||
ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
|
ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
|
||||||
for (int item = 0; item < 100; item++)
|
if (window_visible) // Avoid calling SetScrollHereY when running with culled items
|
||||||
{
|
{
|
||||||
if (enable_track && item == track_item)
|
for (int item = 0; item < 100; item++)
|
||||||
{
|
{
|
||||||
ImGui::TextColored(ImVec4(1,1,0,1), "Item %d", item);
|
if (enable_track && item == track_item)
|
||||||
ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
|
{
|
||||||
}
|
ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
|
||||||
else
|
ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
|
||||||
{
|
}
|
||||||
ImGui::Text("Item %d", item);
|
else
|
||||||
|
{
|
||||||
|
ImGui::Text("Item %d", item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float scroll_y = ImGui::GetScrollY();
|
float scroll_y = ImGui::GetScrollY();
|
||||||
@ -2311,23 +2314,26 @@ static void ShowDemoWindowLayout()
|
|||||||
{
|
{
|
||||||
float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
|
float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
|
||||||
ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0);
|
ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0);
|
||||||
ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(-100, child_height), true, child_flags);
|
bool window_visible = ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(-100, child_height), true, child_flags);
|
||||||
if (scroll_to_off)
|
if (scroll_to_off)
|
||||||
ImGui::SetScrollX(scroll_to_off_px);
|
ImGui::SetScrollX(scroll_to_off_px);
|
||||||
if (scroll_to_pos)
|
if (scroll_to_pos)
|
||||||
ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f);
|
ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f);
|
||||||
for (int item = 0; item < 100; item++)
|
if (window_visible) // Avoid calling SetScrollHereY when running with culled items
|
||||||
{
|
{
|
||||||
if (enable_track && item == track_item)
|
for (int item = 0; item < 100; item++)
|
||||||
{
|
{
|
||||||
ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
|
if (enable_track && item == track_item)
|
||||||
ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right
|
{
|
||||||
|
ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
|
||||||
|
ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImGui::Text("Item %d", item);
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
ImGui::Text("Item %d", item);
|
|
||||||
}
|
|
||||||
ImGui::SameLine();
|
|
||||||
}
|
}
|
||||||
float scroll_x = ImGui::GetScrollX();
|
float scroll_x = ImGui::GetScrollX();
|
||||||
float scroll_max_x = ImGui::GetScrollMaxX();
|
float scroll_max_x = ImGui::GetScrollMaxX();
|
||||||
|
@ -162,12 +162,21 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|||||||
#define IM_NEWLINE "\n"
|
#define IM_NEWLINE "\n"
|
||||||
#endif
|
#endif
|
||||||
#define IM_TABSIZE (4)
|
#define IM_TABSIZE (4)
|
||||||
|
#if (__cplusplus >= 201100)
|
||||||
|
#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
|
||||||
|
#else
|
||||||
#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
|
#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
|
||||||
|
#endif
|
||||||
#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
|
#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
|
||||||
#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
|
#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
|
||||||
#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
|
#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
|
||||||
#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
|
#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
|
||||||
|
|
||||||
|
// Error handling
|
||||||
|
#ifndef IMGUI_USER_ERROR
|
||||||
|
#define IMGUI_USER_ERROR(_EXPR, _MSG) IM_ASSERT((_EXPR) && (_MSG)) // Recoverable User Error
|
||||||
|
#endif
|
||||||
|
|
||||||
// Debug Logging
|
// Debug Logging
|
||||||
#ifndef IMGUI_DEBUG_LOG
|
#ifndef IMGUI_DEBUG_LOG
|
||||||
#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)
|
#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)
|
||||||
@ -1047,9 +1056,7 @@ struct ImGuiDockNode
|
|||||||
struct ImGuiContext
|
struct ImGuiContext
|
||||||
{
|
{
|
||||||
bool Initialized;
|
bool Initialized;
|
||||||
bool FrameScopeActive; // Set by NewFrame(), cleared by EndFrame()
|
bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
|
||||||
bool FrameScopePushedFallbackWindow; // Set by NewFrame(), cleared by EndFrame()
|
|
||||||
bool FontAtlasOwnedByContext; // Io.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
|
|
||||||
ImGuiIO IO;
|
ImGuiIO IO;
|
||||||
ImGuiPlatformIO PlatformIO;
|
ImGuiPlatformIO PlatformIO;
|
||||||
ImGuiStyle Style;
|
ImGuiStyle Style;
|
||||||
@ -1064,20 +1071,23 @@ struct ImGuiContext
|
|||||||
int FrameCountEnded;
|
int FrameCountEnded;
|
||||||
int FrameCountPlatformEnded;
|
int FrameCountPlatformEnded;
|
||||||
int FrameCountRendered;
|
int FrameCountRendered;
|
||||||
|
bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
|
||||||
|
bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
|
||||||
|
bool WithinEndChild; // Set within EndChild()
|
||||||
|
|
||||||
// Windows state
|
// Windows state
|
||||||
ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
|
ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
|
||||||
ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front
|
ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front
|
||||||
ImVector<ImGuiWindow*> WindowsSortBuffer;
|
ImVector<ImGuiWindow*> WindowsSortBuffer;
|
||||||
ImVector<ImGuiWindow*> CurrentWindowStack;
|
ImVector<ImGuiWindow*> CurrentWindowStack;
|
||||||
ImGuiStorage WindowsById;
|
ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
|
||||||
int WindowsActiveCount;
|
int WindowsActiveCount; // Number of unique windows submitted by frame
|
||||||
ImGuiWindow* CurrentWindow; // Being drawn into
|
ImGuiWindow* CurrentWindow; // Window being drawn into
|
||||||
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
|
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
|
||||||
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
|
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
|
||||||
ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
|
ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
|
||||||
ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
|
ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
|
||||||
ImGuiWindow* WheelingWindow;
|
ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
|
||||||
ImVec2 WheelingWindowRefMousePos;
|
ImVec2 WheelingWindowRefMousePos;
|
||||||
float WheelingWindowTimer;
|
float WheelingWindowTimer;
|
||||||
|
|
||||||
@ -1105,7 +1115,6 @@ struct ImGuiContext
|
|||||||
bool ActiveIdPreviousFrameIsAlive;
|
bool ActiveIdPreviousFrameIsAlive;
|
||||||
bool ActiveIdPreviousFrameHasBeenEditedBefore;
|
bool ActiveIdPreviousFrameHasBeenEditedBefore;
|
||||||
ImGuiWindow* ActiveIdPreviousFrameWindow;
|
ImGuiWindow* ActiveIdPreviousFrameWindow;
|
||||||
|
|
||||||
ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
|
ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
|
||||||
float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
|
float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
|
||||||
|
|
||||||
@ -1212,9 +1221,9 @@ struct ImGuiContext
|
|||||||
ImFont InputTextPasswordFont;
|
ImFont InputTextPasswordFont;
|
||||||
ImGuiID TempInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
|
ImGuiID TempInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
|
||||||
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
|
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
|
||||||
float ColorEditLastHue;
|
float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips
|
||||||
float ColorEditLastColor[3];
|
float ColorEditLastColor[3];
|
||||||
ImVec4 ColorPickerRef;
|
ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
|
||||||
bool DragCurrentAccumDirty;
|
bool DragCurrentAccumDirty;
|
||||||
float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
|
float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
|
||||||
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
|
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
|
||||||
@ -1242,7 +1251,7 @@ struct ImGuiContext
|
|||||||
ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
|
ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
|
||||||
ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
|
ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
|
||||||
|
|
||||||
// Logging
|
// Capture/Logging
|
||||||
bool LogEnabled;
|
bool LogEnabled;
|
||||||
ImGuiLogType LogType;
|
ImGuiLogType LogType;
|
||||||
FILE* LogFile; // If != NULL log to stdout/ file
|
FILE* LogFile; // If != NULL log to stdout/ file
|
||||||
@ -1269,7 +1278,6 @@ struct ImGuiContext
|
|||||||
ImGuiContext(ImFontAtlas* shared_font_atlas)
|
ImGuiContext(ImFontAtlas* shared_font_atlas)
|
||||||
{
|
{
|
||||||
Initialized = false;
|
Initialized = false;
|
||||||
FrameScopeActive = FrameScopePushedFallbackWindow = false;
|
|
||||||
ConfigFlagsCurrFrame = ConfigFlagsLastFrame = ImGuiConfigFlags_None;
|
ConfigFlagsCurrFrame = ConfigFlagsLastFrame = ImGuiConfigFlags_None;
|
||||||
Font = NULL;
|
Font = NULL;
|
||||||
FontSize = FontBaseSize = 0.0f;
|
FontSize = FontBaseSize = 0.0f;
|
||||||
@ -1278,6 +1286,7 @@ struct ImGuiContext
|
|||||||
Time = 0.0f;
|
Time = 0.0f;
|
||||||
FrameCount = 0;
|
FrameCount = 0;
|
||||||
FrameCountEnded = FrameCountPlatformEnded = FrameCountRendered = -1;
|
FrameCountEnded = FrameCountPlatformEnded = FrameCountRendered = -1;
|
||||||
|
WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
|
||||||
|
|
||||||
WindowsActiveCount = 0;
|
WindowsActiveCount = 0;
|
||||||
CurrentWindow = NULL;
|
CurrentWindow = NULL;
|
||||||
@ -1306,12 +1315,10 @@ struct ImGuiContext
|
|||||||
ActiveIdClickOffset = ImVec2(-1,-1);
|
ActiveIdClickOffset = ImVec2(-1,-1);
|
||||||
ActiveIdWindow = NULL;
|
ActiveIdWindow = NULL;
|
||||||
ActiveIdSource = ImGuiInputSource_None;
|
ActiveIdSource = ImGuiInputSource_None;
|
||||||
|
|
||||||
ActiveIdPreviousFrame = 0;
|
ActiveIdPreviousFrame = 0;
|
||||||
ActiveIdPreviousFrameIsAlive = false;
|
ActiveIdPreviousFrameIsAlive = false;
|
||||||
ActiveIdPreviousFrameHasBeenEditedBefore = false;
|
ActiveIdPreviousFrameHasBeenEditedBefore = false;
|
||||||
ActiveIdPreviousFrameWindow = NULL;
|
ActiveIdPreviousFrameWindow = NULL;
|
||||||
|
|
||||||
LastActiveId = 0;
|
LastActiveId = 0;
|
||||||
LastActiveIdTimer = 0.0f;
|
LastActiveIdTimer = 0.0f;
|
||||||
|
|
||||||
@ -1842,8 +1849,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool IsMouseDragPastThreshold(int button, float lock_threshold = -1.0f);
|
IMGUI_API bool IsMouseDragPastThreshold(int button, float lock_threshold = -1.0f);
|
||||||
inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
|
inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
|
||||||
inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; }
|
inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; }
|
||||||
inline bool IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; }
|
inline bool IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); }
|
||||||
inline bool IsNavInputPressedAnyOfTwo(ImGuiNavInput n1, ImGuiNavInput n2, ImGuiInputReadMode mode) { return (GetNavInputAmount(n1, mode) + GetNavInputAmount(n2, mode)) > 0.0f; }
|
|
||||||
|
|
||||||
// Docking
|
// Docking
|
||||||
// (some functions are only declared in imgui.cpp, see Docking section)
|
// (some functions are only declared in imgui.cpp, see Docking section)
|
||||||
|
@ -549,7 +549,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
if (g.NavActivateDownId == id)
|
if (g.NavActivateDownId == id)
|
||||||
{
|
{
|
||||||
bool nav_activated_by_code = (g.NavActivateId == id);
|
bool nav_activated_by_code = (g.NavActivateId == id);
|
||||||
bool nav_activated_by_inputs = IsNavInputPressed(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed);
|
bool nav_activated_by_inputs = IsNavInputTest(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed);
|
||||||
if (nav_activated_by_code || nav_activated_by_inputs)
|
if (nav_activated_by_code || nav_activated_by_inputs)
|
||||||
pressed = true;
|
pressed = true;
|
||||||
if (nav_activated_by_code || nav_activated_by_inputs || g.ActiveId == id)
|
if (nav_activated_by_code || nav_activated_by_inputs || g.ActiveId == id)
|
||||||
@ -6491,8 +6491,8 @@ void ImGui::EndTabBar()
|
|||||||
ImGuiTabBar* tab_bar = g.CurrentTabBar;
|
ImGuiTabBar* tab_bar = g.CurrentTabBar;
|
||||||
if (tab_bar == NULL)
|
if (tab_bar == NULL)
|
||||||
{
|
{
|
||||||
IM_ASSERT(tab_bar != NULL && "Mismatched BeginTabBar()/EndTabBar()!");
|
IMGUI_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!");
|
||||||
return; // FIXME-ERRORHANDLING
|
return;
|
||||||
}
|
}
|
||||||
if (tab_bar->WantLayout)
|
if (tab_bar->WantLayout)
|
||||||
TabBarLayout(tab_bar);
|
TabBarLayout(tab_bar);
|
||||||
@ -6923,8 +6923,8 @@ bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags f
|
|||||||
ImGuiTabBar* tab_bar = g.CurrentTabBar;
|
ImGuiTabBar* tab_bar = g.CurrentTabBar;
|
||||||
if (tab_bar == NULL)
|
if (tab_bar == NULL)
|
||||||
{
|
{
|
||||||
IM_ASSERT(tab_bar && "Needs to be called between BeginTabBar() and EndTabBar()!");
|
IMGUI_USER_ERROR(tab_bar, "BeginTabItem() Needs to be called between BeginTabBar() and EndTabBar()!");
|
||||||
return false; // FIXME-ERRORHANDLING
|
return false;
|
||||||
}
|
}
|
||||||
bool ret = TabItemEx(tab_bar, label, p_open, flags, NULL);
|
bool ret = TabItemEx(tab_bar, label, p_open, flags, NULL);
|
||||||
if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
|
if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
|
||||||
|
Loading…
Reference in New Issue
Block a user