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
 | 
			
		||||
  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.
 | 
			
		||||
- 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.
 | 
			
		||||
- ImFontAtlas: FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545)
 | 
			
		||||
  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.ActiveIdAllowOverlap = false;
 | 
			
		||||
    g.ActiveIdWindow = window;
 | 
			
		||||
    g.ActiveIdHasBeenEditedThisFrame = false;
 | 
			
		||||
    if (id)
 | 
			
		||||
    {
 | 
			
		||||
        g.ActiveIdIsAlive = id;
 | 
			
		||||
@@ -2759,6 +2760,7 @@ void ImGui::MarkItemEdited(ImGuiID id)
 | 
			
		||||
    IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive);
 | 
			
		||||
    IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out.
 | 
			
		||||
    //IM_ASSERT(g.CurrentWindow->DC.LastItemId == id);
 | 
			
		||||
    g.ActiveIdHasBeenEditedThisFrame = true;
 | 
			
		||||
    g.ActiveIdHasBeenEditedBefore = true;
 | 
			
		||||
    g.CurrentWindow->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
 | 
			
		||||
}
 | 
			
		||||
@@ -3532,6 +3534,7 @@ void ImGui::NewFrame()
 | 
			
		||||
    g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
 | 
			
		||||
    g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
 | 
			
		||||
    g.ActiveIdIsAlive = 0;
 | 
			
		||||
    g.ActiveIdHasBeenEditedThisFrame = false;
 | 
			
		||||
    g.ActiveIdPreviousFrameIsAlive = false;
 | 
			
		||||
    g.ActiveIdIsJustActivated = false;
 | 
			
		||||
    if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
 | 
			
		||||
@@ -4336,6 +4339,8 @@ bool ImGui::IsItemDeactivated()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -6832,6 +6837,15 @@ void ImGui::EndGroup()
 | 
			
		||||
        window->DC.LastItemId = g.ActiveIdPreviousFrame;
 | 
			
		||||
    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->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_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_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
 | 
			
		||||
    , // [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                    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                    ActiveIdHasBeenEditedThisFrame;
 | 
			
		||||
    int                     ActiveIdAllowNavDirFlags;           // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
 | 
			
		||||
    int                     ActiveIdBlockNavInputFlags;
 | 
			
		||||
    ImVec2                  ActiveIdClickOffset;                // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
 | 
			
		||||
@@ -1046,6 +1049,7 @@ struct ImGuiContext
 | 
			
		||||
        ActiveIdAllowOverlap = false;
 | 
			
		||||
        ActiveIdHasBeenPressedBefore = false;
 | 
			
		||||
        ActiveIdHasBeenEditedBefore = false;
 | 
			
		||||
        ActiveIdHasBeenEditedThisFrame = false;
 | 
			
		||||
        ActiveIdAllowNavDirFlags = 0x00;
 | 
			
		||||
        ActiveIdBlockNavInputFlags = 0x00;
 | 
			
		||||
        ActiveIdClickOffset = ImVec2(-1,-1);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user