|
@@ -1,4 +1,4 @@
|
|
|
-// dear imgui, v1.90.8
|
|
|
+// dear imgui, v1.90.9 WIP
|
|
|
// (main code and documentation)
|
|
|
|
|
|
// Help:
|
|
@@ -438,6 +438,8 @@ CODE
|
|
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
|
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
|
|
|
|
|
+ - 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
|
|
|
+ - 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
|
|
|
- 2024/06/06 (1.90.8) - reordered ImGuiInputTextFlags values. This should not be breaking unless you are using generated headers that have values not matching the main library.
|
|
|
- 2024/06/06 (1.90.8) - removed 'ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft', was mostly unused and misleading.
|
|
|
- 2024/05/27 (1.90.7) - commented out obsolete symbols marked obsolete in 1.88 (May 2022):
|
|
@@ -2563,18 +2565,16 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float&
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// std::lower_bound but without the bullshit
|
|
|
-static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiStoragePair>& data, ImGuiID key)
|
|
|
+ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key)
|
|
|
{
|
|
|
- ImGuiStorage::ImGuiStoragePair* first = data.Data;
|
|
|
- ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size;
|
|
|
- size_t count = (size_t)(last - first);
|
|
|
- while (count > 0)
|
|
|
+ ImGuiStoragePair* in_p = in_begin;
|
|
|
+ for (size_t count = (size_t)(in_end - in_p); count > 0; )
|
|
|
{
|
|
|
size_t count2 = count >> 1;
|
|
|
- ImGuiStorage::ImGuiStoragePair* mid = first + count2;
|
|
|
+ ImGuiStoragePair* mid = in_p + count2;
|
|
|
if (mid->key < key)
|
|
|
{
|
|
|
- first = ++mid;
|
|
|
+ in_p = ++mid;
|
|
|
count -= count2 + 1;
|
|
|
}
|
|
|
else
|
|
@@ -2582,7 +2582,7 @@ static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiSt
|
|
|
count = count2;
|
|
|
}
|
|
|
}
|
|
|
- return first;
|
|
|
+ return in_p;
|
|
|
}
|
|
|
|
|
|
// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
|
|
@@ -2603,7 +2603,7 @@ void ImGuiStorage::BuildSortByKey()
|
|
|
|
|
|
int ImGuiStorage::GetInt(ImGuiID key, int default_val) const
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
return default_val;
|
|
|
return it->val_i;
|
|
@@ -2616,7 +2616,7 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const
|
|
|
|
|
|
float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
return default_val;
|
|
|
return it->val_f;
|
|
@@ -2624,7 +2624,7 @@ float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
|
|
|
|
|
|
void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
return NULL;
|
|
|
return it->val_p;
|
|
@@ -2633,7 +2633,7 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
|
|
|
// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
|
|
|
int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
it = Data.insert(it, ImGuiStoragePair(key, default_val));
|
|
|
return &it->val_i;
|
|
@@ -2646,7 +2646,7 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val)
|
|
|
|
|
|
float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
it = Data.insert(it, ImGuiStoragePair(key, default_val));
|
|
|
return &it->val_f;
|
|
@@ -2654,7 +2654,7 @@ float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)
|
|
|
|
|
|
void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
it = Data.insert(it, ImGuiStoragePair(key, default_val));
|
|
|
return &it->val_p;
|
|
@@ -2663,7 +2663,7 @@ void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
|
|
|
// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame)
|
|
|
void ImGuiStorage::SetInt(ImGuiID key, int val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
Data.insert(it, ImGuiStoragePair(key, val));
|
|
|
else
|
|
@@ -2677,7 +2677,7 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val)
|
|
|
|
|
|
void ImGuiStorage::SetFloat(ImGuiID key, float val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
Data.insert(it, ImGuiStoragePair(key, val));
|
|
|
else
|
|
@@ -2686,7 +2686,7 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val)
|
|
|
|
|
|
void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val)
|
|
|
{
|
|
|
- ImGuiStoragePair* it = LowerBound(Data, key);
|
|
|
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
|
|
|
if (it == Data.end() || it->key != key)
|
|
|
Data.insert(it, ImGuiStoragePair(key, val));
|
|
|
else
|
|
@@ -3386,11 +3386,13 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
|
|
|
case ImGuiCol_ResizeGrip: return "ResizeGrip";
|
|
|
case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
|
|
|
case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
|
|
|
- case ImGuiCol_Tab: return "Tab";
|
|
|
case ImGuiCol_TabHovered: return "TabHovered";
|
|
|
- case ImGuiCol_TabActive: return "TabActive";
|
|
|
- case ImGuiCol_TabUnfocused: return "TabUnfocused";
|
|
|
- case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive";
|
|
|
+ case ImGuiCol_Tab: return "Tab";
|
|
|
+ case ImGuiCol_TabSelected: return "TabSelected";
|
|
|
+ case ImGuiCol_TabSelectedOverline: return "TabSelectedOverline";
|
|
|
+ case ImGuiCol_TabDimmed: return "TabDimmed";
|
|
|
+ case ImGuiCol_TabDimmedSelected: return "TabDimmedSelected";
|
|
|
+ case ImGuiCol_TabDimmedSelectedOverline: return "TabDimmedSelectedOverline";
|
|
|
case ImGuiCol_DockingPreview: return "DockingPreview";
|
|
|
case ImGuiCol_DockingEmptyBg: return "DockingEmptyBg";
|
|
|
case ImGuiCol_PlotLines: return "PlotLines";
|
|
@@ -4271,7 +4273,7 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flag
|
|
|
// Done with rectangle culling so we can perform heavier checks now.
|
|
|
if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None))
|
|
|
{
|
|
|
- g.HoveredIdDisabled = true;
|
|
|
+ g.HoveredIdIsDisabled = true;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -4306,7 +4308,7 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flag
|
|
|
// Release active id if turning disabled
|
|
|
if (g.ActiveId == id && id != 0)
|
|
|
ClearActiveID();
|
|
|
- g.HoveredIdDisabled = true;
|
|
|
+ g.HoveredIdIsDisabled = true;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -4669,7 +4671,7 @@ void ImGui::UpdateMouseMovingWindowEndFrame()
|
|
|
g.MovingWindow = NULL;
|
|
|
|
|
|
// Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already)
|
|
|
- if (g.HoveredIdDisabled)
|
|
|
+ if (g.HoveredIdIsDisabled)
|
|
|
g.MovingWindow = NULL;
|
|
|
}
|
|
|
else if (root_window == NULL && g.NavWindow != NULL)
|
|
@@ -4893,7 +4895,7 @@ void ImGui::NewFrame()
|
|
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
|
g.HoveredId = 0;
|
|
|
g.HoveredIdAllowOverlap = false;
|
|
|
- g.HoveredIdDisabled = false;
|
|
|
+ g.HoveredIdIsDisabled = false;
|
|
|
|
|
|
// Clear ActiveID if the item is not alive anymore.
|
|
|
// In 1.87, the common most call to KeepAliveID() was moved from GetID() to ItemAdd().
|
|
@@ -10558,10 +10560,6 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
|
|
IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation.");
|
|
|
#endif
|
|
|
|
|
|
- // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly.
|
|
|
- if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors))
|
|
|
- g.IO.ConfigWindowsResizeFromEdges = false;
|
|
|
-
|
|
|
// Perform simple check: error if Docking or Viewport are enabled _exactly_ on frame 1 (instead of frame 0 or later), which is a common error leading to loss of .ini data.
|
|
|
if (g.FrameCount == 1 && (g.IO.ConfigFlags & ImGuiConfigFlags_DockingEnable) && (g.ConfigFlagsLastFrame & ImGuiConfigFlags_DockingEnable) == 0)
|
|
|
IM_ASSERT(0 && "Please set DockingEnable before the first call to NewFrame()! Otherwise you will lose your .ini settings!");
|
|
@@ -11915,8 +11913,8 @@ void ImGui::CloseCurrentPopup()
|
|
|
window->DC.NavHideHighlightOneFrame = true;
|
|
|
}
|
|
|
|
|
|
-// Attention! BeginPopup() adds default flags which BeginPopupEx()!
|
|
|
-bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
|
|
|
+// Attention! BeginPopup() adds default flags when calling BeginPopupEx()!
|
|
|
+bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (!IsPopupOpen(id, ImGuiPopupFlags_None))
|
|
@@ -11926,13 +11924,12 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
|
|
|
}
|
|
|
|
|
|
char name[20];
|
|
|
- if (flags & ImGuiWindowFlags_ChildMenu)
|
|
|
+ if (extra_window_flags & ImGuiWindowFlags_ChildMenu)
|
|
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuDepth); // Recycle windows based on depth
|
|
|
else
|
|
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
|
|
|
|
|
|
- flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoDocking;
|
|
|
- bool is_open = Begin(name, NULL, flags);
|
|
|
+ bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoDocking);
|
|
|
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
|
|
|
EndPopup();
|
|
|
|
|
@@ -21243,7 +21240,7 @@ void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label)
|
|
|
{
|
|
|
if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes()))
|
|
|
return;
|
|
|
- for (const ImGuiStorage::ImGuiStoragePair& p : storage->Data)
|
|
|
+ for (const ImGuiStoragePair& p : storage->Data)
|
|
|
BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer.
|
|
|
TreePop();
|
|
|
}
|