|
@@ -2603,20 +2603,18 @@ ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_
|
|
|
return in_p;
|
|
|
}
|
|
|
|
|
|
+static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs)
|
|
|
+{
|
|
|
+ // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
|
|
|
+ ImGuiID lhs_v = ((const ImGuiStoragePair*)lhs)->key;
|
|
|
+ ImGuiID rhs_v = ((const ImGuiStoragePair*)rhs)->key;
|
|
|
+ return (lhs_v > rhs_v ? +1 : lhs_v < rhs_v ? -1 : 0);
|
|
|
+}
|
|
|
+
|
|
|
// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
|
|
|
void ImGuiStorage::BuildSortByKey()
|
|
|
{
|
|
|
- struct StaticFunc
|
|
|
- {
|
|
|
- static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs)
|
|
|
- {
|
|
|
- // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
|
|
|
- if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1;
|
|
|
- if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- };
|
|
|
- ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID);
|
|
|
+ ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), PairComparerByID);
|
|
|
}
|
|
|
|
|
|
int ImGuiStorage::GetInt(ImGuiID key, int default_val) const
|
|
@@ -4315,6 +4313,7 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flag
|
|
|
}
|
|
|
|
|
|
// Display shortcut (only works with mouse)
|
|
|
+ // (ImGuiItemStatusFlags_HasShortcut in LastItemData denotes we want a tooltip)
|
|
|
if (id == g.LastItemData.ID && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasShortcut))
|
|
|
if (IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal))
|
|
|
SetTooltip("%s", GetKeyChordName(g.LastItemData.Shortcut));
|
|
@@ -6458,12 +6457,13 @@ static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& si
|
|
|
border_target = ImClamp(border_target, clamp_min, clamp_max);
|
|
|
if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent
|
|
|
{
|
|
|
- ImGuiWindowFlags parent_flags = window->ParentWindow->Flags;
|
|
|
- ImRect border_limit_rect = window->ParentWindow->InnerRect;
|
|
|
- border_limit_rect.Expand(ImVec2(-ImMax(window->WindowPadding.x, window->WindowBorderSize), -ImMax(window->WindowPadding.y, window->WindowBorderSize)));
|
|
|
- if ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar))
|
|
|
+ ImGuiWindow* parent_window = window->ParentWindow;
|
|
|
+ ImGuiWindowFlags parent_flags = parent_window->Flags;
|
|
|
+ ImRect border_limit_rect = parent_window->InnerRect;
|
|
|
+ border_limit_rect.Expand(ImVec2(-ImMax(parent_window->WindowPadding.x, parent_window->WindowBorderSize), -ImMax(parent_window->WindowPadding.y, parent_window->WindowBorderSize)));
|
|
|
+ if ((axis == ImGuiAxis_X) && ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar)))
|
|
|
border_target.x = ImClamp(border_target.x, border_limit_rect.Min.x, border_limit_rect.Max.x);
|
|
|
- if (parent_flags & ImGuiWindowFlags_NoScrollbar)
|
|
|
+ if ((axis == ImGuiAxis_Y) && (parent_flags & ImGuiWindowFlags_NoScrollbar))
|
|
|
border_target.y = ImClamp(border_target.y, border_limit_rect.Min.y, border_limit_rect.Max.y);
|
|
|
}
|
|
|
if (!ignore_resize)
|
|
@@ -10440,12 +10440,15 @@ void ImGui::SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags)
|
|
|
g.NextItemData.ShortcutFlags = flags;
|
|
|
}
|
|
|
|
|
|
+// Called from within ItemAdd: at this point we can read from NextItemData and write to LastItemData
|
|
|
void ImGui::ItemHandleShortcut(ImGuiID id)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiInputFlags flags = g.NextItemData.ShortcutFlags;
|
|
|
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetNextItemShortcut) == 0); // Passing flags not supported by SetNextItemShortcut()!
|
|
|
|
|
|
+ if (g.LastItemData.InFlags & ImGuiItemFlags_Disabled)
|
|
|
+ return;
|
|
|
if (flags & ImGuiInputFlags_Tooltip)
|
|
|
{
|
|
|
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasShortcut;
|
|
@@ -10469,7 +10472,7 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags)
|
|
|
|
|
|
bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id)
|
|
|
{
|
|
|
- //ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
//IMGUI_DEBUG_LOG("Shortcut(%s, flags=%X, owner_id=0x%08X)\n", GetKeyChordName(key_chord, g.TempBuffer.Data, g.TempBuffer.Size), flags, owner_id);
|
|
|
|
|
|
// When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any.
|
|
@@ -10481,6 +10484,9 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID own
|
|
|
if (owner_id == ImGuiKeyOwner_Any || owner_id == ImGuiKeyOwner_NoOwner)
|
|
|
owner_id = GetRoutingIdFromOwnerId(owner_id);
|
|
|
|
|
|
+ if (g.CurrentItemFlags & ImGuiItemFlags_Disabled)
|
|
|
+ return false;
|
|
|
+
|
|
|
// Submit route
|
|
|
if (!SetShortcutRouting(key_chord, flags, owner_id))
|
|
|
return false;
|
|
@@ -13086,6 +13092,8 @@ void ImGui::NavInitRequestApplyResult()
|
|
|
g.NavJustMovedToId = result->ID;
|
|
|
g.NavJustMovedToFocusScopeId = result->FocusScopeId;
|
|
|
g.NavJustMovedToKeyMods = 0;
|
|
|
+ g.NavJustMovedToIsTabbing = false;
|
|
|
+ g.NavJustMovedToHasSelectionData = (result->InFlags & ImGuiItemFlags_HasSelectionUserData) != 0;
|
|
|
}
|
|
|
|
|
|
// Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called)
|
|
@@ -13342,6 +13350,9 @@ void ImGui::NavMoveRequestApplyResult()
|
|
|
g.NavJustMovedToId = result->ID;
|
|
|
g.NavJustMovedToFocusScopeId = result->FocusScopeId;
|
|
|
g.NavJustMovedToKeyMods = g.NavMoveKeyMods;
|
|
|
+ g.NavJustMovedToIsTabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0;
|
|
|
+ g.NavJustMovedToHasSelectionData = (result->InFlags & ImGuiItemFlags_HasSelectionUserData) != 0;
|
|
|
+ //IMGUI_DEBUG_LOG_NAV("[nav] NavJustMovedFromFocusScopeId = 0x%08X, NavJustMovedToFocusScopeId = 0x%08X\n", g.NavJustMovedFromFocusScopeId, g.NavJustMovedToFocusScopeId);
|
|
|
}
|
|
|
|
|
|
// Apply new NavID/Focus
|