Menus: Fix sub-menu inhibition stopping working in some cases. (Amend WIP) (#2517, #5614, noticed in #5546)
Amend bda2cde6
Fixes the case where following menu hover sequence results in incorrect RestoreNavWindow (previously SourceWindow) pointing to opened sub-menu:
1. Hover "Menu -> Options" - Open ##Menu_01 window
2. Hover "Menu -> Colors" - SourceWindow incorrectly points to ##Menu_01 window
This commit is contained in:
parent
a502ceb075
commit
b3ea01d86f
@ -79,6 +79,9 @@ Other Changes:
|
|||||||
- Window: Fixed a potential crash when appending to a child window. (#5515, #3496, #4797) [@rokups]
|
- Window: Fixed a potential crash when appending to a child window. (#5515, #3496, #4797) [@rokups]
|
||||||
- IO: Added ImGuiKey_MouseXXX aliases for mouse buttons/wheel so all operations done on ImGuiKey
|
- IO: Added ImGuiKey_MouseXXX aliases for mouse buttons/wheel so all operations done on ImGuiKey
|
||||||
can apply to mouse data as well. (#4921)
|
can apply to mouse data as well. (#4921)
|
||||||
|
- Menus: Fixed incorrect sub-menu parent association when opening a menu by closing another.
|
||||||
|
Among other things, it would accidentally break part of the closing heuristic logic when moving
|
||||||
|
towards a sub-menu. (#2517, #5614). [@rokups]
|
||||||
- Nav: Fixed moving/resizing window with gamepad or keyboard when running at very high framerate.
|
- Nav: Fixed moving/resizing window with gamepad or keyboard when running at very high framerate.
|
||||||
- Nav: Pressing Space/GamepadFaceDown on a repeating button uses the same repeating rate as a mouse hold.
|
- Nav: Pressing Space/GamepadFaceDown on a repeating button uses the same repeating rate as a mouse hold.
|
||||||
- Platform IME: [Windows] Removed call to ImmAssociateContextEx() leading to freeze on some setups.
|
- Platform IME: [Windows] Removed call to ImmAssociateContextEx() leading to freeze on some setups.
|
||||||
|
13
imgui.cpp
13
imgui.cpp
@ -9336,7 +9336,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
|
|||||||
ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
|
ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
|
||||||
popup_ref.PopupId = id;
|
popup_ref.PopupId = id;
|
||||||
popup_ref.Window = NULL;
|
popup_ref.Window = NULL;
|
||||||
popup_ref.SourceWindow = g.NavWindow;
|
popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type).
|
||||||
popup_ref.OpenFrameCount = g.FrameCount;
|
popup_ref.OpenFrameCount = g.FrameCount;
|
||||||
popup_ref.OpenParentId = parent_window->IDStack.back();
|
popup_ref.OpenParentId = parent_window->IDStack.back();
|
||||||
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
|
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
|
||||||
@ -9438,12 +9438,13 @@ void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_
|
|||||||
IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
|
IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
|
||||||
|
|
||||||
// Trim open popup stack
|
// Trim open popup stack
|
||||||
ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow;
|
|
||||||
ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window;
|
ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window;
|
||||||
|
ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow;
|
||||||
g.OpenPopupStack.resize(remaining);
|
g.OpenPopupStack.resize(remaining);
|
||||||
|
|
||||||
if (restore_focus_to_window_under_popup)
|
if (restore_focus_to_window_under_popup)
|
||||||
{
|
{
|
||||||
|
ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window;
|
||||||
if (focus_window && !focus_window->WasActive && popup_window)
|
if (focus_window && !focus_window->WasActive && popup_window)
|
||||||
{
|
{
|
||||||
// Fallback
|
// Fallback
|
||||||
@ -12689,8 +12690,12 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < g.OpenPopupStack.Size; i++)
|
for (int i = 0; i < g.OpenPopupStack.Size; i++)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = g.OpenPopupStack[i].Window;
|
// As it's difficult to interact with tree nodes while popups are open, we display everything inline.
|
||||||
BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : "");
|
const ImGuiPopupData* popup_data = &g.OpenPopupStack[i];
|
||||||
|
ImGuiWindow* window = popup_data->Window;
|
||||||
|
BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'",
|
||||||
|
popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "",
|
||||||
|
popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL");
|
||||||
}
|
}
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
2
imgui.h
2
imgui.h
@ -65,7 +65,7 @@ Index of this file:
|
|||||||
// Version
|
// Version
|
||||||
// (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)
|
// (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)
|
||||||
#define IMGUI_VERSION "1.89 WIP"
|
#define IMGUI_VERSION "1.89 WIP"
|
||||||
#define IMGUI_VERSION_NUM 18812
|
#define IMGUI_VERSION_NUM 18813
|
||||||
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
|
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
|
||||||
|
@ -1048,7 +1048,7 @@ struct ImGuiPopupData
|
|||||||
{
|
{
|
||||||
ImGuiID PopupId; // Set on OpenPopup()
|
ImGuiID PopupId; // Set on OpenPopup()
|
||||||
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
|
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
|
||||||
ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup
|
ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
|
||||||
int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
|
int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
|
||||||
int OpenFrameCount; // Set on OpenPopup()
|
int OpenFrameCount; // Set on OpenPopup()
|
||||||
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
|
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
|
||||||
|
@ -7107,7 +7107,8 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
// Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu
|
// Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu
|
||||||
// Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive.
|
// Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive.
|
||||||
bool moving_toward_child_menu = false;
|
bool moving_toward_child_menu = false;
|
||||||
ImGuiWindow* child_menu_window = (g.BeginPopupStack.Size < g.OpenPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].SourceWindow == window) ? g.OpenPopupStack[g.BeginPopupStack.Size].Window : NULL;
|
ImGuiPopupData* child_popup = (g.BeginPopupStack.Size < g.OpenPopupStack.Size) ? &g.OpenPopupStack[g.BeginPopupStack.Size] : NULL; // Popup candidate (testing below)
|
||||||
|
ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL;
|
||||||
if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar))
|
if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar))
|
||||||
{
|
{
|
||||||
float ref_unit = g.FontSize; // FIXME-DPI
|
float ref_unit = g.FontSize; // FIXME-DPI
|
||||||
|
Loading…
Reference in New Issue
Block a user