mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Fixed uses of IsItemDeactivated(), IsItemDeactivatedAfterEdit() on multi-components widgets and after EndGroup(). (#2550, #1875)
This commit is contained in:
		@@ -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);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user