mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
Combo box always appear above other child windows of a same parent
This commit is contained in:
parent
c907108c23
commit
f387c3f22f
26
imgui.cpp
26
imgui.cpp
@ -267,7 +267,6 @@
|
||||
- columns: columns header to act as button (~sort op) and allow resize/reorder
|
||||
- columns: user specify columns size
|
||||
- combo: turn child handling code into pop up helper
|
||||
- combo: layer conflict with other child windows
|
||||
- combo: contents should extends to fit label if combo widget is small
|
||||
- list selection, concept of a selectable "block" (that can be multiple widgets)
|
||||
! menubar, menus
|
||||
@ -1485,7 +1484,7 @@ void ImGuiWindow::AddToRenderList()
|
||||
for (size_t i = 0; i < DC.ChildWindows.size(); i++)
|
||||
{
|
||||
ImGuiWindow* child = DC.ChildWindows[i];
|
||||
if (child->Visible) // clipped childs may have been marked not Visible
|
||||
if (child->Visible) // clipped children may have been marked not Visible
|
||||
child->AddToRenderList();
|
||||
}
|
||||
}
|
||||
@ -1859,12 +1858,27 @@ void ImGui::Shutdown()
|
||||
g.Initialized = false;
|
||||
}
|
||||
|
||||
// FIXME: Add a more explicit sort order in the window structure.
|
||||
static int ChildWindowComparer(const void* lhs, const void* rhs)
|
||||
{
|
||||
const ImGuiWindow* a = *(const ImGuiWindow**)lhs;
|
||||
const ImGuiWindow* b = *(const ImGuiWindow**)rhs;
|
||||
if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip))
|
||||
return d;
|
||||
if (int d = (a->Flags & ImGuiWindowFlags_ComboBox) - (b->Flags & ImGuiWindowFlags_ComboBox))
|
||||
return d;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void AddWindowToSortedBuffer(ImGuiWindow* window, ImVector<ImGuiWindow*>& sorted_windows)
|
||||
{
|
||||
sorted_windows.push_back(window);
|
||||
if (window->Visible)
|
||||
{
|
||||
for (size_t i = 0; i < window->DC.ChildWindows.size(); i++)
|
||||
const size_t count = window->DC.ChildWindows.size();
|
||||
if (count > 1)
|
||||
qsort(window->DC.ChildWindows.begin(), count, sizeof(ImGuiWindow*), ChildWindowComparer);
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
ImGuiWindow* child = window->DC.ChildWindows[i];
|
||||
if (child->Visible)
|
||||
@ -1912,7 +1926,7 @@ void ImGui::Render()
|
||||
g.CurrentWindow->Visible = false;
|
||||
ImGui::End();
|
||||
|
||||
// Select window for move/focus when we're done with all our widgets (we only consider non-childs windows here)
|
||||
// Select window for move/focus when we're done with all our widgets (we only consider non-child windows here)
|
||||
if (g.ActiveId == 0 && g.HoveredId == 0 && g.HoveredRootWindow != NULL && g.IO.MouseClicked[0])
|
||||
SetActiveId(g.HoveredRootWindow->GetID("#MOVE"));
|
||||
|
||||
@ -1923,12 +1937,12 @@ void ImGui::Render()
|
||||
for (size_t i = 0; i != g.Windows.size(); i++)
|
||||
{
|
||||
ImGuiWindow* window = g.Windows[i];
|
||||
if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is visible its parent will add it
|
||||
if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is visible its parent will add it
|
||||
if (window->Visible)
|
||||
continue;
|
||||
AddWindowToSortedBuffer(window, g.RenderSortedWindows);
|
||||
}
|
||||
IM_ASSERT(g.Windows.size() == g.RenderSortedWindows.size()); // We done something wrong
|
||||
IM_ASSERT(g.Windows.size() == g.RenderSortedWindows.size()); // we done something wrong
|
||||
g.Windows.swap(g.RenderSortedWindows);
|
||||
|
||||
// Clear data for next frame
|
||||
|
Loading…
Reference in New Issue
Block a user