Skip to content

Commit a528398

Browse files
committed
Internals: support for varying _ChildWindow flag for menu windows. (#3496, #4797)
1 parent 11638fd commit a528398

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

imgui.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5286,6 +5286,27 @@ static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settin
52865286
window->Collapsed = settings->Collapsed;
52875287
}
52885288

5289+
static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags)
5290+
{
5291+
ImGuiContext& g = *GImGui;
5292+
const ImGuiWindowFlags old_flags = window->Flags;
5293+
const bool child_flag_changed = (new_flags & ImGuiWindowFlags_ChildWindow) != (old_flags & ImGuiWindowFlags_ChildWindow);
5294+
5295+
if ((just_created || child_flag_changed) && !(new_flags & ImGuiWindowFlags_ChildWindow))
5296+
{
5297+
g.WindowsFocusOrder.push_back(window);
5298+
window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1);
5299+
}
5300+
else if (child_flag_changed && (new_flags & ImGuiWindowFlags_ChildWindow))
5301+
{
5302+
IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window);
5303+
for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++)
5304+
g.WindowsFocusOrder[n]->FocusOrder--;
5305+
g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder);
5306+
window->FocusOrder = -1;
5307+
}
5308+
}
5309+
52895310
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
52905311
{
52915312
ImGuiContext& g = *GImGui;
@@ -5325,16 +5346,12 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
53255346
window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);
53265347
}
53275348

5328-
if (!(flags & ImGuiWindowFlags_ChildWindow))
5329-
{
5330-
g.WindowsFocusOrder.push_back(window);
5331-
window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1);
5332-
}
5333-
53345349
if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)
53355350
g.Windows.push_front(window); // Quite slow but rare and only once
53365351
else
53375352
g.Windows.push_back(window);
5353+
UpdateWindowInFocusOrderList(window, true, window->Flags);
5354+
53385355
return window;
53395356
}
53405357

@@ -5934,6 +5951,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
59345951
const bool window_just_created = (window == NULL);
59355952
if (window_just_created)
59365953
window = CreateNewWindow(name, flags);
5954+
else
5955+
UpdateWindowInFocusOrderList(window, window_just_created, flags);
59375956

59385957
// Automatically disable manual moving/resizing when NoInputs is set
59395958
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)

imgui.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Index of this file:
6464
// Version
6565
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
6666
#define IMGUI_VERSION "1.86 WIP"
67-
#define IMGUI_VERSION_NUM 18519
67+
#define IMGUI_VERSION_NUM 18520
6868
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
6969
#define IMGUI_HAS_TABLE
7070

0 commit comments

Comments
 (0)