mirror of https://github.com/ocornut/imgui
Misc: Added an explicit compile-time test for non-scoped IM_ASSERT() macros to redirect users to a solution + fixed our stb wrappers.
+ Nav: Use nav layer enum, comments.
This commit is contained in:
parent
b7e1b13ca7
commit
cc0d4e346a
|
@ -69,6 +69,8 @@ Other Changes:
|
||||||
- Window: Fixed a bug with child window inheriting ItemFlags from their parent when the child
|
- Window: Fixed a bug with child window inheriting ItemFlags from their parent when the child
|
||||||
window also manipulate the ItemFlags stack. (#3024) [@Stanbroek]
|
window also manipulate the ItemFlags stack. (#3024) [@Stanbroek]
|
||||||
- Font: Fixed non-ASCII space occasionally creating unnecessary empty polygons.
|
- Font: Fixed non-ASCII space occasionally creating unnecessary empty polygons.
|
||||||
|
- Misc: Added an explicit compile-time test for non-scoped IM_ASSERT() macros to redirect users
|
||||||
|
to a solution rather than encourage people to add braces in the codebase.
|
||||||
- Misc: Added additional checks in EndFrame() to verify that io.KeyXXX values have not been
|
- Misc: Added additional checks in EndFrame() to verify that io.KeyXXX values have not been
|
||||||
tampered with between NewFrame() and EndFrame().
|
tampered with between NewFrame() and EndFrame().
|
||||||
- Misc, Freetype: Fixed support for IMGUI_STB_RECT_PACK_FILENAME compile time directive
|
- Misc, Freetype: Fixed support for IMGUI_STB_RECT_PACK_FILENAME compile time directive
|
||||||
|
|
|
@ -17,9 +17,9 @@ IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame();
|
||||||
//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
|
//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
|
||||||
//#define IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT
|
//#define IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT
|
||||||
|
|
||||||
// Win32 message handler
|
// Win32 message handler your application need to call.
|
||||||
// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h>
|
// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h> from this helper.
|
||||||
// - You can COPY this line into your .cpp code to forward declare the function.
|
// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it.
|
||||||
#if 0
|
#if 0
|
||||||
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
#endif
|
#endif
|
||||||
|
|
24
imgui.cpp
24
imgui.cpp
|
@ -6718,6 +6718,14 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
|
// Check user IM_ASSERT macro
|
||||||
|
// (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means you assert macro is incorrectly defined!
|
||||||
|
// If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block.
|
||||||
|
// This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.)
|
||||||
|
// #define IM_ASSERT(EXPR) SomeCode(EXPR); SomeMoreCode(); // Wrong!
|
||||||
|
// #define IM_ASSERT(EXPR) do { SomeCode(EXPR); SomeMoreCode(); } while (0) // Correct!
|
||||||
|
if (true) IM_ASSERT(1); else IM_ASSERT(0);
|
||||||
|
|
||||||
// Check user data
|
// Check user data
|
||||||
// (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument)
|
// (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument)
|
||||||
IM_ASSERT(g.Initialized);
|
IM_ASSERT(g.Initialized);
|
||||||
|
@ -7631,7 +7639,7 @@ void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (g.NavLayer == 0 && focus_window)
|
if (g.NavLayer == ImGuiNavLayer_Main && focus_window)
|
||||||
focus_window = NavRestoreLastChildNavWindow(focus_window);
|
focus_window = NavRestoreLastChildNavWindow(focus_window);
|
||||||
FocusWindow(focus_window);
|
FocusWindow(focus_window);
|
||||||
}
|
}
|
||||||
|
@ -8110,7 +8118,7 @@ static bool ImGui::NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
|
||||||
// 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward.
|
// 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward.
|
||||||
// Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option?
|
// Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option?
|
||||||
if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match
|
if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match
|
||||||
if (g.NavLayer == 1 && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu))
|
if (g.NavLayer == ImGuiNavLayer_Menu && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu))
|
||||||
if ((g.NavMoveDir == ImGuiDir_Left && dax < 0.0f) || (g.NavMoveDir == ImGuiDir_Right && dax > 0.0f) || (g.NavMoveDir == ImGuiDir_Up && day < 0.0f) || (g.NavMoveDir == ImGuiDir_Down && day > 0.0f))
|
if ((g.NavMoveDir == ImGuiDir_Left && dax < 0.0f) || (g.NavMoveDir == ImGuiDir_Right && dax > 0.0f) || (g.NavMoveDir == ImGuiDir_Up && day < 0.0f) || (g.NavMoveDir == ImGuiDir_Down && day > 0.0f))
|
||||||
{
|
{
|
||||||
result->DistAxial = dist_axial;
|
result->DistAxial = dist_axial;
|
||||||
|
@ -8221,7 +8229,7 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const Im
|
||||||
void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags)
|
void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.NavWindow != window || !NavMoveRequestButNoResultYet() || g.NavMoveRequestForward != ImGuiNavForward_None || g.NavLayer != 0)
|
if (g.NavWindow != window || !NavMoveRequestButNoResultYet() || g.NavMoveRequestForward != ImGuiNavForward_None || g.NavLayer != ImGuiNavLayer_Main)
|
||||||
return;
|
return;
|
||||||
IM_ASSERT(move_flags != 0); // No points calling this with no wrapping
|
IM_ASSERT(move_flags != 0); // No points calling this with no wrapping
|
||||||
ImRect bb_rel = window->NavRectRel[0];
|
ImRect bb_rel = window->NavRectRel[0];
|
||||||
|
@ -8466,7 +8474,7 @@ static void ImGui::NavUpdate()
|
||||||
// Store our return window (for returning from Layer 1 to Layer 0) and clear it as soon as we step back in our own Layer 0
|
// Store our return window (for returning from Layer 1 to Layer 0) and clear it as soon as we step back in our own Layer 0
|
||||||
if (g.NavWindow)
|
if (g.NavWindow)
|
||||||
NavSaveLastChildNavWindowIntoParent(g.NavWindow);
|
NavSaveLastChildNavWindowIntoParent(g.NavWindow);
|
||||||
if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == 0)
|
if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == ImGuiNavLayer_Main)
|
||||||
g.NavWindow->NavLastChildNavWindow = NULL;
|
g.NavWindow->NavLastChildNavWindow = NULL;
|
||||||
|
|
||||||
// Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.)
|
// Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.)
|
||||||
|
@ -8503,7 +8511,7 @@ static void ImGui::NavUpdate()
|
||||||
if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
|
if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
|
||||||
ClosePopupToLevel(g.OpenPopupStack.Size - 1, true);
|
ClosePopupToLevel(g.OpenPopupStack.Size - 1, true);
|
||||||
}
|
}
|
||||||
else if (g.NavLayer != 0)
|
else if (g.NavLayer != ImGuiNavLayer_Main)
|
||||||
{
|
{
|
||||||
// Leave the "menu" layer
|
// Leave the "menu" layer
|
||||||
NavRestoreLayer(ImGuiNavLayer_Main);
|
NavRestoreLayer(ImGuiNavLayer_Main);
|
||||||
|
@ -8625,7 +8633,7 @@ static void ImGui::NavUpdate()
|
||||||
g.NavMoveResultOther.Clear();
|
g.NavMoveResultOther.Clear();
|
||||||
|
|
||||||
// When we have manually scrolled (without using navigation) and NavId becomes out of bounds, we project its bounding box to the visible area to restart navigation within visible items
|
// When we have manually scrolled (without using navigation) and NavId becomes out of bounds, we project its bounding box to the visible area to restart navigation within visible items
|
||||||
if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == 0)
|
if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == ImGuiNavLayer_Main)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = g.NavWindow;
|
ImGuiWindow* window = g.NavWindow;
|
||||||
ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1,1), window->InnerRect.Max - window->Pos + ImVec2(1,1));
|
ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1,1), window->InnerRect.Max - window->Pos + ImVec2(1,1));
|
||||||
|
@ -8688,7 +8696,7 @@ static void ImGui::NavUpdateMoveResult()
|
||||||
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.
|
||||||
if (g.NavLayer == 0)
|
if (g.NavLayer == ImGuiNavLayer_Main)
|
||||||
{
|
{
|
||||||
ImVec2 delta_scroll;
|
ImVec2 delta_scroll;
|
||||||
if (g.NavMoveRequestFlags & ImGuiNavMoveFlags_ScrollToEdge)
|
if (g.NavMoveRequestFlags & ImGuiNavMoveFlags_ScrollToEdge)
|
||||||
|
@ -8727,7 +8735,7 @@ static float ImGui::NavUpdatePageUpPageDown()
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.NavMoveDir != ImGuiDir_None || g.NavWindow == NULL)
|
if (g.NavMoveDir != ImGuiDir_None || g.NavWindow == NULL)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
if ((g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL || g.NavLayer != 0)
|
if ((g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL || g.NavLayer != ImGuiNavLayer_Main)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
|
|
||||||
ImGuiWindow* window = g.NavWindow;
|
ImGuiWindow* window = g.NavWindow;
|
||||||
|
|
|
@ -120,7 +120,7 @@ namespace IMGUI_STB_NAMESPACE
|
||||||
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
|
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
|
||||||
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
||||||
#define STBRP_STATIC
|
#define STBRP_STATIC
|
||||||
#define STBRP_ASSERT(x) IM_ASSERT(x)
|
#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0)
|
||||||
#define STBRP_SORT ImQsort
|
#define STBRP_SORT ImQsort
|
||||||
#define STB_RECT_PACK_IMPLEMENTATION
|
#define STB_RECT_PACK_IMPLEMENTATION
|
||||||
#endif
|
#endif
|
||||||
|
@ -135,7 +135,7 @@ namespace IMGUI_STB_NAMESPACE
|
||||||
#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
|
#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
|
||||||
#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x))
|
#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x))
|
||||||
#define STBTT_free(x,u) ((void)(u), IM_FREE(x))
|
#define STBTT_free(x,u) ((void)(u), IM_FREE(x))
|
||||||
#define STBTT_assert(x) IM_ASSERT(x)
|
#define STBTT_assert(x) do { IM_ASSERT(x); } while(0)
|
||||||
#define STBTT_fmod(x,y) ImFmod(x,y)
|
#define STBTT_fmod(x,y) ImFmod(x,y)
|
||||||
#define STBTT_sqrt(x) ImSqrt(x)
|
#define STBTT_sqrt(x) ImSqrt(x)
|
||||||
#define STBTT_pow(x,y) ImPow(x,y)
|
#define STBTT_pow(x,y) ImPow(x,y)
|
||||||
|
|
|
@ -6178,7 +6178,7 @@ void ImGui::EndMainMenuBar()
|
||||||
// When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
|
// When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
|
||||||
// FIXME: With this strategy we won't be able to restore a NULL focus.
|
// FIXME: With this strategy we won't be able to restore a NULL focus.
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0 && !g.NavAnyRequest)
|
if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest)
|
||||||
FocusTopMostWindowUnderOne(g.NavWindow, NULL);
|
FocusTopMostWindowUnderOne(g.NavWindow, NULL);
|
||||||
|
|
||||||
End();
|
End();
|
||||||
|
|
|
@ -280,7 +280,7 @@ namespace
|
||||||
|
|
||||||
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
|
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
|
||||||
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
|
||||||
#define STBRP_ASSERT(x) IM_ASSERT(x)
|
#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0)
|
||||||
#define STBRP_STATIC
|
#define STBRP_STATIC
|
||||||
#define STB_RECT_PACK_IMPLEMENTATION
|
#define STB_RECT_PACK_IMPLEMENTATION
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue