mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Fixed uses of IsItemDeactivated(), IsItemDeactivatedAfterEdit() on multi-components widgets and after EndGroup(). (#2550, #1875)
This commit is contained in:
parent
d3a387cc18
commit
fc3c3de551
@ -44,6 +44,8 @@ Other Changes:
|
|||||||
- Fixed InputFloatX, SliderFloatX, DragFloatX functions erroneously reporting IsItemEdited() multiple
|
- Fixed InputFloatX, SliderFloatX, DragFloatX functions erroneously reporting IsItemEdited() multiple
|
||||||
times when the text input doesn't match the formatted output value (e.g. input "1" shows "1.000").
|
times when the text input doesn't match the formatted output value (e.g. input "1" shows "1.000").
|
||||||
It wasn't much of a problem because we typically use the return value instead of IsItemEdited() here.
|
It wasn't much of a problem because we typically use the return value instead of IsItemEdited() here.
|
||||||
|
- Fixed uses of IsItemDeactivated(), IsItemDeactivatedAfterEdit() on multi-components widgets and
|
||||||
|
after EndGroup(). (#2550, #1875)
|
||||||
- Scrollbar: Very minor bounding box adjustment to cope with various border size.
|
- Scrollbar: Very minor bounding box adjustment to cope with various border size.
|
||||||
- ImFontAtlas: FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545)
|
- ImFontAtlas: FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545)
|
||||||
Combine with RasterizerFlags::MonoHinting for best results.
|
Combine with RasterizerFlags::MonoHinting for best results.
|
||||||
|
14
imgui.cpp
14
imgui.cpp
@ -2692,6 +2692,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
|||||||
g.ActiveIdBlockNavInputFlags = 0;
|
g.ActiveIdBlockNavInputFlags = 0;
|
||||||
g.ActiveIdAllowOverlap = false;
|
g.ActiveIdAllowOverlap = false;
|
||||||
g.ActiveIdWindow = window;
|
g.ActiveIdWindow = window;
|
||||||
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
||||||
if (id)
|
if (id)
|
||||||
{
|
{
|
||||||
g.ActiveIdIsAlive = id;
|
g.ActiveIdIsAlive = id;
|
||||||
@ -2759,6 +2760,7 @@ void ImGui::MarkItemEdited(ImGuiID id)
|
|||||||
IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive);
|
IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive);
|
||||||
IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out.
|
IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out.
|
||||||
//IM_ASSERT(g.CurrentWindow->DC.LastItemId == id);
|
//IM_ASSERT(g.CurrentWindow->DC.LastItemId == id);
|
||||||
|
g.ActiveIdHasBeenEditedThisFrame = true;
|
||||||
g.ActiveIdHasBeenEditedBefore = true;
|
g.ActiveIdHasBeenEditedBefore = true;
|
||||||
g.CurrentWindow->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
|
g.CurrentWindow->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
|
||||||
}
|
}
|
||||||
@ -3532,6 +3534,7 @@ void ImGui::NewFrame()
|
|||||||
g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
|
g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
|
||||||
g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
|
g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
|
||||||
g.ActiveIdIsAlive = 0;
|
g.ActiveIdIsAlive = 0;
|
||||||
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
||||||
g.ActiveIdPreviousFrameIsAlive = false;
|
g.ActiveIdPreviousFrameIsAlive = false;
|
||||||
g.ActiveIdIsJustActivated = false;
|
g.ActiveIdIsJustActivated = false;
|
||||||
if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
|
if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
|
||||||
@ -4336,6 +4339,8 @@ bool ImGui::IsItemDeactivated()
|
|||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
if (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HasDeactivated)
|
||||||
|
return (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_Deactivated) != 0;
|
||||||
return (g.ActiveIdPreviousFrame == window->DC.LastItemId && g.ActiveIdPreviousFrame != 0 && g.ActiveId != window->DC.LastItemId);
|
return (g.ActiveIdPreviousFrame == window->DC.LastItemId && g.ActiveIdPreviousFrame != 0 && g.ActiveId != window->DC.LastItemId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6832,6 +6837,15 @@ void ImGui::EndGroup()
|
|||||||
window->DC.LastItemId = g.ActiveIdPreviousFrame;
|
window->DC.LastItemId = g.ActiveIdPreviousFrame;
|
||||||
window->DC.LastItemRect = group_bb;
|
window->DC.LastItemRect = group_bb;
|
||||||
|
|
||||||
|
// Forward Edited flag
|
||||||
|
if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame)
|
||||||
|
window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
|
||||||
|
|
||||||
|
// Forward Deactivated flag
|
||||||
|
window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDeactivated;
|
||||||
|
if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame)
|
||||||
|
window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Deactivated;
|
||||||
|
|
||||||
window->DC.GroupStack.pop_back();
|
window->DC.GroupStack.pop_back();
|
||||||
//window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug]
|
//window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug]
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,9 @@ enum ImGuiItemStatusFlags_
|
|||||||
ImGuiItemStatusFlags_HoveredRect = 1 << 0,
|
ImGuiItemStatusFlags_HoveredRect = 1 << 0,
|
||||||
ImGuiItemStatusFlags_HasDisplayRect = 1 << 1,
|
ImGuiItemStatusFlags_HasDisplayRect = 1 << 1,
|
||||||
ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
|
ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
|
||||||
ImGuiItemStatusFlags_ToggledSelection = 1 << 3 // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues.
|
ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues.
|
||||||
|
ImGuiItemStatusFlags_HasDeactivated = 1 << 4, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
|
||||||
|
ImGuiItemStatusFlags_Deactivated = 1 << 5 // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
|
||||||
|
|
||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
, // [imgui-test only]
|
, // [imgui-test only]
|
||||||
@ -863,6 +865,7 @@ struct ImGuiContext
|
|||||||
bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
|
bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
|
||||||
bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
|
bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
|
||||||
bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
|
bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
|
||||||
|
bool ActiveIdHasBeenEditedThisFrame;
|
||||||
int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
|
int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
|
||||||
int ActiveIdBlockNavInputFlags;
|
int ActiveIdBlockNavInputFlags;
|
||||||
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
|
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
|
||||||
@ -1046,6 +1049,7 @@ struct ImGuiContext
|
|||||||
ActiveIdAllowOverlap = false;
|
ActiveIdAllowOverlap = false;
|
||||||
ActiveIdHasBeenPressedBefore = false;
|
ActiveIdHasBeenPressedBefore = false;
|
||||||
ActiveIdHasBeenEditedBefore = false;
|
ActiveIdHasBeenEditedBefore = false;
|
||||||
|
ActiveIdHasBeenEditedThisFrame = false;
|
||||||
ActiveIdAllowNavDirFlags = 0x00;
|
ActiveIdAllowNavDirFlags = 0x00;
|
||||||
ActiveIdBlockNavInputFlags = 0x00;
|
ActiveIdBlockNavInputFlags = 0x00;
|
||||||
ActiveIdClickOffset = ImVec2(-1,-1);
|
ActiveIdClickOffset = ImVec2(-1,-1);
|
||||||
|
Loading…
Reference in New Issue
Block a user