mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 15:11:05 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # examples/imgui_impl_win32.cpp # examples/imgui_impl_win32.h # imgui.cpp # imgui_internal.h
This commit is contained in:
		
							
								
								
									
										181
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										181
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -1,12 +1,19 @@
 | 
			
		||||
// dear imgui, v1.75 WIP
 | 
			
		||||
// (main code and documentation)
 | 
			
		||||
 | 
			
		||||
// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
 | 
			
		||||
// Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.
 | 
			
		||||
// Get latest version at https://github.com/ocornut/imgui
 | 
			
		||||
// Releases change-log at https://github.com/ocornut/imgui/releases
 | 
			
		||||
// Technical Support for Getting Started https://github.com/ocornut/imgui/wiki
 | 
			
		||||
// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/2847
 | 
			
		||||
// Help:
 | 
			
		||||
// - Read FAQ at http://dearimgui.org/faq
 | 
			
		||||
// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.
 | 
			
		||||
// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. All applications in examples/ are doing that.
 | 
			
		||||
 | 
			
		||||
// Resources:
 | 
			
		||||
// - FAQ                   http://dearimgui.org/faq
 | 
			
		||||
// - Homepage & latest     https://github.com/ocornut/imgui
 | 
			
		||||
// - Releases & changelog  https://github.com/ocornut/imgui/releases
 | 
			
		||||
// - Gallery               https://github.com/ocornut/imgui/issues/2847 (please post your screenshots/video there!)
 | 
			
		||||
// - Glossary              https://github.com/ocornut/imgui/wiki/Glossary
 | 
			
		||||
// - Wiki                  https://github.com/ocornut/imgui/wiki
 | 
			
		||||
// - Issues & support      https://github.com/ocornut/imgui/issues
 | 
			
		||||
 | 
			
		||||
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
 | 
			
		||||
// See LICENSE.txt for copyright and licensing details (standard MIT License).
 | 
			
		||||
@@ -157,8 +164,9 @@ CODE
 | 
			
		||||
 GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
 | 
			
		||||
 ---------------------------------------------------------------
 | 
			
		||||
 - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library.
 | 
			
		||||
 - In the majority of cases you should be able to use unmodified back-ends files available in the examples/ folder.
 | 
			
		||||
 - Add the Dear ImGui source files to your projects or using your preferred build system.
 | 
			
		||||
   It is recommended you build and statically link the .cpp files as part of your project and not as shared library (DLL).
 | 
			
		||||
   It is recommended you build and statically link the .cpp files as part of your project and NOT as shared library (DLL).
 | 
			
		||||
 - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types.
 | 
			
		||||
 - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them.
 | 
			
		||||
 - Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide.
 | 
			
		||||
@@ -178,7 +186,7 @@ CODE
 | 
			
		||||
     // TODO: Fill optional fields of the io structure later.
 | 
			
		||||
     // TODO: Load TTF/OTF fonts if you don't want to use the default font.
 | 
			
		||||
 | 
			
		||||
     // Initialize helper Platform and Renderer bindings (here we are using imgui_impl_win32 and imgui_impl_dx11)
 | 
			
		||||
     // Initialize helper Platform and Renderer bindings (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp)
 | 
			
		||||
     ImGui_ImplWin32_Init(hwnd);
 | 
			
		||||
     ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
 | 
			
		||||
 | 
			
		||||
@@ -609,37 +617,17 @@ CODE
 | 
			
		||||
    - Your programming IDE is your friend, find the type or function declaration to find comments
 | 
			
		||||
      associated to it.
 | 
			
		||||
 | 
			
		||||
 Q: What is this library called?
 | 
			
		||||
 Q: Which version should I get?
 | 
			
		||||
 Q: Why the names "Dear ImGui" vs "ImGui"?
 | 
			
		||||
 >> This library is called "Dear ImGui", please don't call it "ImGui" :)
 | 
			
		||||
 >> See https://www.dearimgui.org/faq
 | 
			
		||||
 | 
			
		||||
 Q&A: Concerns
 | 
			
		||||
 =============
 | 
			
		||||
 | 
			
		||||
 Q: Who uses Dear ImGui?
 | 
			
		||||
 Q: Can you create elaborate/serious tools with Dear ImGui?
 | 
			
		||||
 Q: Can you reskin the look of Dear ImGui?
 | 
			
		||||
 Q: Why using C++ (as opposed to C)?
 | 
			
		||||
 >> See https://www.dearimgui.org/faq
 | 
			
		||||
 | 
			
		||||
 Q&A: Integration
 | 
			
		||||
 ================
 | 
			
		||||
 | 
			
		||||
 Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or to my application?
 | 
			
		||||
 A: You can read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags from the ImGuiIO structure (e.g. if (ImGui::GetIO().WantCaptureMouse) { ... } )
 | 
			
		||||
    - When 'io.WantCaptureMouse' is set, imgui wants to use your mouse state, and you may want to discard/hide the inputs from the rest of your application.
 | 
			
		||||
    - When 'io.WantCaptureKeyboard' is set, imgui wants to use your keyboard state, and you may want to discard/hide the inputs from the rest of your application.
 | 
			
		||||
    - When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
 | 
			
		||||
    Note: you should always pass your mouse/keyboard inputs to imgui, even when the io.WantCaptureXXX flag are set false.
 | 
			
		||||
     This is because imgui needs to detect that you clicked in the void to unfocus its own windows.
 | 
			
		||||
    Note: The 'io.WantCaptureMouse' is more accurate that any attempt to "check if the mouse is hovering a window" (don't do that!).
 | 
			
		||||
     It handle mouse dragging correctly (both dragging that started over your application or over an imgui window) and handle e.g. modal windows blocking inputs.
 | 
			
		||||
     Those flags are updated by ImGui::NewFrame(). Preferably read the flags after calling NewFrame() if you can afford it, but reading them before is also
 | 
			
		||||
     perfectly fine, as the bool toggle fairly rarely. If you have on a touch device, you might find use for an early call to UpdateHoveredWindowAndCaptureFlags().
 | 
			
		||||
    Note: Text input widget releases focus on "Return KeyDown", so the subsequent "Return KeyUp" event that your application receive will typically
 | 
			
		||||
     have 'io.WantCaptureKeyboard=false'. Depending on your application logic it may or not be inconvenient. You might want to track which key-downs
 | 
			
		||||
     were targeted for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.)
 | 
			
		||||
 A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
 | 
			
		||||
 >> See https://www.dearimgui.org/faq for fully detailed answer. You really want to read this.
 | 
			
		||||
 | 
			
		||||
 Q. How can I enable keyboard controls?
 | 
			
		||||
 Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display)
 | 
			
		||||
@@ -783,6 +771,15 @@ CODE
 | 
			
		||||
 Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
 | 
			
		||||
 >> See https://www.dearimgui.org/faq and docs/FONTS.txt
 | 
			
		||||
 | 
			
		||||
 Q&A: Concerns
 | 
			
		||||
 =============
 | 
			
		||||
 | 
			
		||||
 Q: Who uses Dear ImGui?
 | 
			
		||||
 Q: Can you create elaborate/serious tools with Dear ImGui?
 | 
			
		||||
 Q: Can you reskin the look of Dear ImGui?
 | 
			
		||||
 Q: Why using C++ (as opposed to C)?
 | 
			
		||||
 >> See https://www.dearimgui.org/faq
 | 
			
		||||
 | 
			
		||||
 Q&A: Community
 | 
			
		||||
 ==============
 | 
			
		||||
 | 
			
		||||
@@ -2807,19 +2804,21 @@ void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window)
 | 
			
		||||
    window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::SetNavID(ImGuiID id, int nav_layer)
 | 
			
		||||
// FIXME-NAV: Refactor those functions into a single, more explicit one.
 | 
			
		||||
void ImGui::SetNavID(ImGuiID id, int nav_layer, int focus_scope_id)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    IM_ASSERT(g.NavWindow);
 | 
			
		||||
    IM_ASSERT(nav_layer == 0 || nav_layer == 1);
 | 
			
		||||
    g.NavId = id;
 | 
			
		||||
    g.NavFocusScopeId = focus_scope_id;
 | 
			
		||||
    g.NavWindow->NavLastIds[nav_layer] = id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel)
 | 
			
		||||
void ImGui::SetNavIDWithRectRel(ImGuiID id, int nav_layer, int focus_scope_id, const ImRect& rect_rel)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    SetNavID(id, nav_layer);
 | 
			
		||||
    SetNavID(id, nav_layer, focus_scope_id);
 | 
			
		||||
    g.NavWindow->NavRectRel[nav_layer] = rect_rel;
 | 
			
		||||
    g.NavMousePosDirty = true;
 | 
			
		||||
    g.NavDisableHighlight = false;
 | 
			
		||||
@@ -2864,13 +2863,15 @@ void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window)
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    IM_ASSERT(id != 0);
 | 
			
		||||
 | 
			
		||||
    // Assume that SetFocusID() is called in the context where its NavLayer is the current layer, which is the case everywhere we call it.
 | 
			
		||||
    // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and window->DC.NavFocusScopeIdCurrent are valid.
 | 
			
		||||
    // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text)
 | 
			
		||||
    const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent;
 | 
			
		||||
    if (g.NavWindow != window)
 | 
			
		||||
        g.NavInitRequest = false;
 | 
			
		||||
    g.NavId = id;
 | 
			
		||||
    g.NavWindow = window;
 | 
			
		||||
    g.NavId = id;
 | 
			
		||||
    g.NavLayer = nav_layer;
 | 
			
		||||
    g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent;
 | 
			
		||||
    window->NavLastIds[nav_layer] = id;
 | 
			
		||||
    if (window->DC.LastItemId == id)
 | 
			
		||||
        window->NavRectRel[nav_layer] = ImRect(window->DC.LastItemRect.Min - window->Pos, window->DC.LastItemRect.Max - window->Pos);
 | 
			
		||||
@@ -3140,24 +3141,24 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id)
 | 
			
		||||
 | 
			
		||||
    // Increment counters
 | 
			
		||||
    const bool is_tab_stop = (window->DC.ItemFlags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0;
 | 
			
		||||
    window->DC.FocusCounterAll++;
 | 
			
		||||
    window->DC.FocusCounterRegular++;
 | 
			
		||||
    if (is_tab_stop)
 | 
			
		||||
        window->DC.FocusCounterTab++;
 | 
			
		||||
        window->DC.FocusCounterTabStop++;
 | 
			
		||||
 | 
			
		||||
    // Process TAB/Shift-TAB to tab *OUT* of the currently focused item.
 | 
			
		||||
    // (Note that we can always TAB out of a widget that doesn't allow tabbing in)
 | 
			
		||||
    if (g.ActiveId == id && g.FocusTabPressed && !IsActiveIdUsingKey(ImGuiKey_Tab) && g.FocusRequestNextWindow == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        g.FocusRequestNextWindow = window;
 | 
			
		||||
        g.FocusRequestNextCounterTab = window->DC.FocusCounterTab + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.
 | 
			
		||||
        g.FocusRequestNextCounterTabStop = window->DC.FocusCounterTabStop + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Handle focus requests
 | 
			
		||||
    if (g.FocusRequestCurrWindow == window)
 | 
			
		||||
    {
 | 
			
		||||
        if (window->DC.FocusCounterAll == g.FocusRequestCurrCounterAll)
 | 
			
		||||
        if (window->DC.FocusCounterRegular == g.FocusRequestCurrCounterRegular)
 | 
			
		||||
            return true;
 | 
			
		||||
        if (is_tab_stop && window->DC.FocusCounterTab == g.FocusRequestCurrCounterTab)
 | 
			
		||||
        if (is_tab_stop && window->DC.FocusCounterTabStop == g.FocusRequestCurrCounterTabStop)
 | 
			
		||||
        {
 | 
			
		||||
            g.NavJustTabbedId = id;
 | 
			
		||||
            return true;
 | 
			
		||||
@@ -3173,8 +3174,8 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id)
 | 
			
		||||
 | 
			
		||||
void ImGui::FocusableItemUnregister(ImGuiWindow* window)
 | 
			
		||||
{
 | 
			
		||||
    window->DC.FocusCounterAll--;
 | 
			
		||||
    window->DC.FocusCounterTab--;
 | 
			
		||||
    window->DC.FocusCounterRegular--;
 | 
			
		||||
    window->DC.FocusCounterTabStop--;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
 | 
			
		||||
@@ -3997,26 +3998,26 @@ void ImGui::NewFrame()
 | 
			
		||||
        // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
 | 
			
		||||
        // manipulate the Next fields even, even though they will be turned into Curr fields by the code below.
 | 
			
		||||
        g.FocusRequestNextWindow = g.NavWindow;
 | 
			
		||||
        g.FocusRequestNextCounterAll = INT_MAX;
 | 
			
		||||
        g.FocusRequestNextCounterRegular = INT_MAX;
 | 
			
		||||
        if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX)
 | 
			
		||||
            g.FocusRequestNextCounterTab = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
 | 
			
		||||
            g.FocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
 | 
			
		||||
        else
 | 
			
		||||
            g.FocusRequestNextCounterTab = g.IO.KeyShift ? -1 : 0;
 | 
			
		||||
            g.FocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Turn queued focus request into current one
 | 
			
		||||
    g.FocusRequestCurrWindow = NULL;
 | 
			
		||||
    g.FocusRequestCurrCounterAll = g.FocusRequestCurrCounterTab = INT_MAX;
 | 
			
		||||
    g.FocusRequestCurrCounterRegular = g.FocusRequestCurrCounterTabStop = INT_MAX;
 | 
			
		||||
    if (g.FocusRequestNextWindow != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        ImGuiWindow* window = g.FocusRequestNextWindow;
 | 
			
		||||
        g.FocusRequestCurrWindow = window;
 | 
			
		||||
        if (g.FocusRequestNextCounterAll != INT_MAX && window->DC.FocusCounterAll != -1)
 | 
			
		||||
            g.FocusRequestCurrCounterAll = ImModPositive(g.FocusRequestNextCounterAll, window->DC.FocusCounterAll + 1);
 | 
			
		||||
        if (g.FocusRequestNextCounterTab != INT_MAX && window->DC.FocusCounterTab != -1)
 | 
			
		||||
            g.FocusRequestCurrCounterTab = ImModPositive(g.FocusRequestNextCounterTab, window->DC.FocusCounterTab + 1);
 | 
			
		||||
        if (g.FocusRequestNextCounterRegular != INT_MAX && window->DC.FocusCounterRegular != -1)
 | 
			
		||||
            g.FocusRequestCurrCounterRegular = ImModPositive(g.FocusRequestNextCounterRegular, window->DC.FocusCounterRegular + 1);
 | 
			
		||||
        if (g.FocusRequestNextCounterTabStop != INT_MAX && window->DC.FocusCounterTabStop != -1)
 | 
			
		||||
            g.FocusRequestCurrCounterTabStop = ImModPositive(g.FocusRequestNextCounterTabStop, window->DC.FocusCounterTabStop + 1);
 | 
			
		||||
        g.FocusRequestNextWindow = NULL;
 | 
			
		||||
        g.FocusRequestNextCounterAll = g.FocusRequestNextCounterTab = INT_MAX;
 | 
			
		||||
        g.FocusRequestNextCounterRegular = g.FocusRequestNextCounterTabStop = INT_MAX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    g.NavIdTabCounter = INT_MAX;
 | 
			
		||||
@@ -4517,7 +4518,7 @@ void ImGui::Render()
 | 
			
		||||
    if (g.FrameCountEnded != g.FrameCount)
 | 
			
		||||
        EndFrame();
 | 
			
		||||
    g.FrameCountRendered = g.FrameCount;
 | 
			
		||||
    g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsRenderWindows = 0;
 | 
			
		||||
    g.IO.MetricsRenderWindows = 0;
 | 
			
		||||
 | 
			
		||||
    // Add background ImDrawList (for each active viewport)
 | 
			
		||||
    for (int n = 0; n != g.Viewports.Size; n++)
 | 
			
		||||
@@ -6024,8 +6025,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
			
		||||
            window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f);
 | 
			
		||||
        else
 | 
			
		||||
            window->WindowPadding = style.WindowPadding;
 | 
			
		||||
        window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
 | 
			
		||||
        window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
 | 
			
		||||
 | 
			
		||||
        // Collapse window by double-clicking on title bar
 | 
			
		||||
        // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
 | 
			
		||||
@@ -6451,27 +6450,35 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
			
		||||
        window->DC.CursorMaxPos = window->DC.CursorStartPos;
 | 
			
		||||
        window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f);
 | 
			
		||||
        window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f;
 | 
			
		||||
        window->DC.NavHideHighlightOneFrame = false;
 | 
			
		||||
        window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f);
 | 
			
		||||
 | 
			
		||||
        window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
 | 
			
		||||
        window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
 | 
			
		||||
        window->DC.NavLayerActiveMask = window->DC.NavLayerActiveMaskNext;
 | 
			
		||||
        window->DC.NavLayerActiveMaskNext = 0x00;
 | 
			
		||||
        window->DC.NavFocusScopeIdCurrent = 0;
 | 
			
		||||
        window->DC.NavHideHighlightOneFrame = false;
 | 
			
		||||
        window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f);
 | 
			
		||||
 | 
			
		||||
        window->DC.MenuBarAppending = false;
 | 
			
		||||
        window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
 | 
			
		||||
        window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
 | 
			
		||||
        window->DC.MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user);
 | 
			
		||||
        window->DC.TreeDepth = 0;
 | 
			
		||||
        window->DC.TreeJumpToParentOnPopMask = 0x00;
 | 
			
		||||
        window->DC.ChildWindows.resize(0);
 | 
			
		||||
        window->DC.StateStorage = &window->StateStorage;
 | 
			
		||||
        window->DC.CurrentColumns = NULL;
 | 
			
		||||
        window->DC.LayoutType = ImGuiLayoutType_Vertical;
 | 
			
		||||
        window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical;
 | 
			
		||||
        window->DC.FocusCounterAll = window->DC.FocusCounterTab = -1;
 | 
			
		||||
        window->DC.FocusCounterRegular = window->DC.FocusCounterTabStop = -1;
 | 
			
		||||
 | 
			
		||||
        window->DC.ItemFlags = parent_window ? parent_window->DC.ItemFlags : ImGuiItemFlags_Default_;
 | 
			
		||||
        window->DC.ItemWidth = window->ItemWidthDefault;
 | 
			
		||||
        window->DC.TextWrapPos = -1.0f; // disabled
 | 
			
		||||
        window->DC.ItemFlagsStack.resize(0);
 | 
			
		||||
        window->DC.ItemWidthStack.resize(0);
 | 
			
		||||
        window->DC.TextWrapPosStack.resize(0);
 | 
			
		||||
        window->DC.CurrentColumns = NULL;
 | 
			
		||||
        window->DC.TreeDepth = 0;
 | 
			
		||||
        window->DC.TreeMayJumpToParentOnPopMask = 0x00;
 | 
			
		||||
        window->DC.StateStorage = &window->StateStorage;
 | 
			
		||||
        window->DC.GroupStack.resize(0);
 | 
			
		||||
        window->MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user);
 | 
			
		||||
 | 
			
		||||
        if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags))
 | 
			
		||||
        {
 | 
			
		||||
@@ -6713,6 +6720,7 @@ void ImGui::FocusWindow(ImGuiWindow* window)
 | 
			
		||||
            g.NavMousePosDirty = true;
 | 
			
		||||
        g.NavInitRequest = false;
 | 
			
		||||
        g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId
 | 
			
		||||
        g.NavFocusScopeId = 0;
 | 
			
		||||
        g.NavIdIsAlive = false;
 | 
			
		||||
        g.NavLayer = ImGuiNavLayer_Main;
 | 
			
		||||
        //IMGUI_DEBUG_LOG("FocusWindow(\"%s\")\n", window ? window->Name : NULL);
 | 
			
		||||
@@ -7642,8 +7650,8 @@ void ImGui::SetKeyboardFocusHere(int offset)
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    g.FocusRequestNextWindow = window;
 | 
			
		||||
    g.FocusRequestNextCounterAll = window->DC.FocusCounterAll + 1 + offset;
 | 
			
		||||
    g.FocusRequestNextCounterTab = INT_MAX;
 | 
			
		||||
    g.FocusRequestNextCounterRegular = window->DC.FocusCounterRegular + 1 + offset;
 | 
			
		||||
    g.FocusRequestNextCounterTabStop = INT_MAX;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::SetItemDefaultFocus()
 | 
			
		||||
@@ -8791,21 +8799,22 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
 | 
			
		||||
#endif
 | 
			
		||||
        if (new_best)
 | 
			
		||||
        {
 | 
			
		||||
            result->ID = id;
 | 
			
		||||
            result->SelectScopeId = g.MultiSelectScopeId;
 | 
			
		||||
            result->Window = window;
 | 
			
		||||
            result->ID = id;
 | 
			
		||||
            result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
 | 
			
		||||
            result->RectRel = nav_bb_rel;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Features like PageUp/PageDown need to maintain a separate score for the visible set of items.
 | 
			
		||||
        const float VISIBLE_RATIO = 0.70f;
 | 
			
		||||
        if ((g.NavMoveRequestFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb))
 | 
			
		||||
            if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO)
 | 
			
		||||
                if (NavScoreItem(&g.NavMoveResultLocalVisibleSet, nav_bb))
 | 
			
		||||
                {
 | 
			
		||||
                    result = &g.NavMoveResultLocalVisibleSet;
 | 
			
		||||
                    result->ID = id;
 | 
			
		||||
                    result->SelectScopeId = g.MultiSelectScopeId;
 | 
			
		||||
                    result->Window = window;
 | 
			
		||||
                    result->ID = id;
 | 
			
		||||
                    result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
 | 
			
		||||
                    result->RectRel = nav_bb_rel;
 | 
			
		||||
                }
 | 
			
		||||
    }
 | 
			
		||||
@@ -8815,8 +8824,9 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
 | 
			
		||||
    {
 | 
			
		||||
        g.NavWindow = window;                                           // Always refresh g.NavWindow, because some operations such as FocusItem() don't have a window.
 | 
			
		||||
        g.NavLayer = window->DC.NavLayerCurrent;
 | 
			
		||||
        g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent;
 | 
			
		||||
        g.NavIdIsAlive = true;
 | 
			
		||||
        g.NavIdTabCounter = window->DC.FocusCounterTab;
 | 
			
		||||
        g.NavIdTabCounter = window->DC.FocusCounterTabStop;
 | 
			
		||||
        window->NavRectRel[window->DC.NavLayerCurrent] = nav_bb_rel;    // Store item bounding box (relative to window position)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -8910,10 +8920,11 @@ static void NavRestoreLayer(ImGuiNavLayer layer)
 | 
			
		||||
    g.NavLayer = layer;
 | 
			
		||||
    if (layer == 0)
 | 
			
		||||
        g.NavWindow = ImGui::NavRestoreLastChildNavWindow(g.NavWindow);
 | 
			
		||||
    if (g.NavWindow->NavLastIds[layer] != 0)
 | 
			
		||||
        ImGui::SetNavIDWithRectRel(g.NavWindow->NavLastIds[layer], layer, g.NavWindow->NavRectRel[layer]);
 | 
			
		||||
    ImGuiWindow* window = g.NavWindow;
 | 
			
		||||
    if (window->NavLastIds[layer] != 0)
 | 
			
		||||
        ImGui::SetNavIDWithRectRel(window->NavLastIds[layer], layer, 0, g.NavWindow->NavRectRel[layer]);
 | 
			
		||||
    else
 | 
			
		||||
        ImGui::NavInitWindow(g.NavWindow, true);
 | 
			
		||||
        ImGui::NavInitWindow(window, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void ImGui::NavUpdateAnyRequestFlag()
 | 
			
		||||
@@ -8936,7 +8947,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
 | 
			
		||||
    //IMGUI_DEBUG_LOG("[Nav] NavInitWindow() init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer);
 | 
			
		||||
    if (init_for_nav)
 | 
			
		||||
    {
 | 
			
		||||
        SetNavID(0, g.NavLayer);
 | 
			
		||||
        SetNavID(0, g.NavLayer, 0);
 | 
			
		||||
        g.NavInitRequest = true;
 | 
			
		||||
        g.NavInitRequestFromMove = false;
 | 
			
		||||
        g.NavInitResultId = 0;
 | 
			
		||||
@@ -8946,6 +8957,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        g.NavId = window->NavLastIds[0];
 | 
			
		||||
        g.NavFocusScopeId = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -9052,9 +9064,9 @@ static void ImGui::NavUpdate()
 | 
			
		||||
        // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called)
 | 
			
		||||
        //IMGUI_DEBUG_LOG("[Nav] Apply NavInitRequest result: 0x%08X Layer %d in \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name);
 | 
			
		||||
        if (g.NavInitRequestFromMove)
 | 
			
		||||
            SetNavIDWithRectRel(g.NavInitResultId, g.NavLayer, g.NavInitResultRectRel);
 | 
			
		||||
            SetNavIDWithRectRel(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel);
 | 
			
		||||
        else
 | 
			
		||||
            SetNavID(g.NavInitResultId, g.NavLayer);
 | 
			
		||||
            SetNavID(g.NavInitResultId, g.NavLayer, 0);
 | 
			
		||||
        g.NavWindow->NavRectRel[g.NavLayer] = g.NavInitResultRectRel;
 | 
			
		||||
    }
 | 
			
		||||
    g.NavInitRequest = false;
 | 
			
		||||
@@ -9121,8 +9133,9 @@ static void ImGui::NavUpdate()
 | 
			
		||||
            ImGuiWindow* parent_window = g.NavWindow->ParentWindow;
 | 
			
		||||
            IM_ASSERT(child_window->ChildId != 0);
 | 
			
		||||
            FocusWindow(parent_window);
 | 
			
		||||
            SetNavID(child_window->ChildId, 0);
 | 
			
		||||
            g.NavIdIsAlive = false;
 | 
			
		||||
            SetNavID(child_window->ChildId, 0, 0);
 | 
			
		||||
            // Reassigning with same value, we're being explicit here.
 | 
			
		||||
            g.NavIdIsAlive = false;     // -V1048
 | 
			
		||||
            if (g.NavDisableMouseHover)
 | 
			
		||||
                g.NavMousePosDirty = true;
 | 
			
		||||
        }
 | 
			
		||||
@@ -9142,7 +9155,7 @@ static void ImGui::NavUpdate()
 | 
			
		||||
            // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were
 | 
			
		||||
            if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
 | 
			
		||||
                g.NavWindow->NavLastIds[0] = 0;
 | 
			
		||||
            g.NavId = 0;
 | 
			
		||||
            g.NavId = g.NavFocusScopeId = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -9212,7 +9225,8 @@ static void ImGui::NavUpdate()
 | 
			
		||||
    {
 | 
			
		||||
        //IMGUI_DEBUG_LOG("[Nav] NavInitRequest from move, window \"%s\", layer=%d\n", g.NavWindow->Name, g.NavLayer);
 | 
			
		||||
        g.NavInitRequest = g.NavInitRequestFromMove = true;
 | 
			
		||||
        g.NavInitResultId = 0;
 | 
			
		||||
        // Reassigning with same value, we're being explicit here.
 | 
			
		||||
        g.NavInitResultId = 0;     // -V1048
 | 
			
		||||
        g.NavDisableHighlight = false;
 | 
			
		||||
    }
 | 
			
		||||
    NavUpdateAnyRequestFlag();
 | 
			
		||||
@@ -9261,7 +9275,7 @@ static void ImGui::NavUpdate()
 | 
			
		||||
            float pad = window->CalcFontSize() * 0.5f;
 | 
			
		||||
            window_rect_rel.Expand(ImVec2(-ImMin(window_rect_rel.GetWidth(), pad), -ImMin(window_rect_rel.GetHeight(), pad))); // Terrible approximation for the intent of starting navigation from first fully visible item
 | 
			
		||||
            window->NavRectRel[g.NavLayer].ClipWith(window_rect_rel);
 | 
			
		||||
            g.NavId = 0;
 | 
			
		||||
            g.NavId = g.NavFocusScopeId = 0;
 | 
			
		||||
        }
 | 
			
		||||
        g.NavMoveFromClampedRefRect = false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -9341,9 +9355,10 @@ static void ImGui::NavUpdateMoveResult()
 | 
			
		||||
    {
 | 
			
		||||
        // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
 | 
			
		||||
        g.NavJustMovedToId = result->ID;
 | 
			
		||||
        g.NavJustMovedToMultiSelectScopeId = result->SelectScopeId;
 | 
			
		||||
        g.NavJustMovedToFocusScopeId = result->FocusScopeId;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel);
 | 
			
		||||
    SetNavIDWithRectRel(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
 | 
			
		||||
    g.NavMoveFromClampedRefRect = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user