|
@@ -658,7 +658,7 @@ CODE
|
|
|
- Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only]
|
|
|
note: for all calls to IO new functions, the Dear ImGui context should be bound/current.
|
|
|
read https://github.com/ocornut/imgui/issues/4921 for details.
|
|
|
- - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
|
+ - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(), ImGui::IsKeyDown(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
|
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
|
- Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes).
|
|
@@ -4002,9 +4002,7 @@ ImGuiContext::ImGuiContext(ImFontAtlas* shared_font_atlas)
|
|
|
ActiveIdSource = ImGuiInputSource_None;
|
|
|
ActiveIdMouseButton = -1;
|
|
|
ActiveIdPreviousFrame = 0;
|
|
|
- ActiveIdPreviousFrameIsAlive = false;
|
|
|
- ActiveIdPreviousFrameHasBeenEditedBefore = false;
|
|
|
- ActiveIdPreviousFrameWindow = NULL;
|
|
|
+ memset(&DeactivatedItemData, 0, sizeof(DeactivatedItemData));
|
|
|
memset(&ActiveIdValueOnActivation, 0, sizeof(ActiveIdValueOnActivation));
|
|
|
LastActiveId = 0;
|
|
|
LastActiveIdTimer = 0.0f;
|
|
@@ -4270,7 +4268,7 @@ void ImGui::Shutdown()
|
|
|
g.WindowsById.Clear();
|
|
|
g.NavWindow = NULL;
|
|
|
g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL;
|
|
|
- g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL;
|
|
|
+ g.ActiveIdWindow = NULL;
|
|
|
g.MovingWindow = NULL;
|
|
|
|
|
|
g.KeysRoutingTable.Clear();
|
|
@@ -4460,6 +4458,13 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
|
|
g.MovingWindow = NULL;
|
|
|
}
|
|
|
|
|
|
+ // Store deactivate data
|
|
|
+ ImGuiDeactivatedItemData* deactivated_data = &g.DeactivatedItemData;
|
|
|
+ deactivated_data->ID = g.ActiveId;
|
|
|
+ deactivated_data->ElapseFrame = (g.LastItemData.ID == g.ActiveId) ? g.FrameCount : g.FrameCount + 1; // FIXME: OK to use LastItemData?
|
|
|
+ deactivated_data->HasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
|
|
|
+ deactivated_data->IsAlive = (g.ActiveIdIsAlive == g.ActiveId);
|
|
|
+
|
|
|
// This could be written in a more general way (e.g associate a hook to ActiveId),
|
|
|
// but since this is currently quite an exception we'll leave it as is.
|
|
|
// One common scenario leading to this is: pressing Key ->NavMoveRequestApplyResult() -> ClearActiveID()
|
|
@@ -5378,11 +5383,8 @@ void ImGui::NewFrame()
|
|
|
g.ActiveIdTimer += g.IO.DeltaTime;
|
|
|
g.LastActiveIdTimer += g.IO.DeltaTime;
|
|
|
g.ActiveIdPreviousFrame = g.ActiveId;
|
|
|
- g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
|
|
|
- g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
|
|
|
g.ActiveIdIsAlive = 0;
|
|
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
|
|
- g.ActiveIdPreviousFrameIsAlive = false;
|
|
|
g.ActiveIdIsJustActivated = false;
|
|
|
if (g.TempInputId != 0 && g.ActiveId != g.TempInputId)
|
|
|
g.TempInputId = 0;
|
|
@@ -5391,6 +5393,9 @@ void ImGui::NewFrame()
|
|
|
g.ActiveIdUsingNavDirMask = 0x00;
|
|
|
g.ActiveIdUsingAllKeyboardKeys = false;
|
|
|
}
|
|
|
+ if (g.DeactivatedItemData.ElapseFrame < g.FrameCount)
|
|
|
+ g.DeactivatedItemData.ID = 0;
|
|
|
+ g.DeactivatedItemData.IsAlive = false;
|
|
|
|
|
|
// Record when we have been stationary as this state is preserved while over same item.
|
|
|
// FIXME: The way this is expressed means user cannot alter HoverStationaryDelay during the frame to use varying values.
|
|
@@ -6101,13 +6106,13 @@ bool ImGui::IsItemDeactivated()
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDeactivated)
|
|
|
return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Deactivated) != 0;
|
|
|
- return (g.ActiveIdPreviousFrame == g.LastItemData.ID && g.ActiveIdPreviousFrame != 0 && g.ActiveId != g.LastItemData.ID);
|
|
|
+ return (g.DeactivatedItemData.ID == g.LastItemData.ID && g.LastItemData.ID != 0 && g.DeactivatedItemData.ElapseFrame >= g.FrameCount);
|
|
|
}
|
|
|
|
|
|
bool ImGui::IsItemDeactivatedAfterEdit()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore));
|
|
|
+ return IsItemDeactivated() && g.DeactivatedItemData.HasBeenEditedBefore;
|
|
|
}
|
|
|
|
|
|
// == (GetItemID() == GetFocusID() && GetFocusID() != 0)
|
|
@@ -11115,8 +11120,8 @@ void ImGui::KeepAliveID(ImGuiID id)
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.ActiveId == id)
|
|
|
g.ActiveIdIsAlive = id;
|
|
|
- if (g.ActiveIdPreviousFrame == id)
|
|
|
- g.ActiveIdPreviousFrameIsAlive = true;
|
|
|
+ if (g.DeactivatedItemData.ID == id)
|
|
|
+ g.DeactivatedItemData.IsAlive = true;
|
|
|
}
|
|
|
|
|
|
// Declare item bounding box for clipping and interaction.
|
|
@@ -11201,6 +11206,9 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
|
|
|
// window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG]
|
|
|
#endif
|
|
|
|
|
|
+ if (id != 0 && g.DeactivatedItemData.ID == id)
|
|
|
+ g.DeactivatedItemData.ElapseFrame = g.FrameCount;
|
|
|
+
|
|
|
// We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them)
|
|
|
if (is_rect_visible)
|
|
|
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Visible;
|
|
@@ -11560,7 +11568,7 @@ void ImGui::BeginGroup()
|
|
|
group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive;
|
|
|
group_data.BackupHoveredIdIsAlive = g.HoveredId != 0;
|
|
|
group_data.BackupIsSameLine = window->DC.IsSameLine;
|
|
|
- group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive;
|
|
|
+ group_data.BackupDeactivatedIdIsAlive = g.DeactivatedItemData.IsAlive;
|
|
|
group_data.EmitItem = true;
|
|
|
|
|
|
window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x;
|
|
@@ -11611,11 +11619,11 @@ void ImGui::EndGroup()
|
|
|
// Also if you grep for LastItemId you'll notice it is only used in that context.
|
|
|
// (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.)
|
|
|
const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId;
|
|
|
- const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true);
|
|
|
+ const bool group_contains_deactivated_id = (group_data.BackupDeactivatedIdIsAlive == false) && (g.DeactivatedItemData.IsAlive == true);
|
|
|
if (group_contains_curr_active_id)
|
|
|
g.LastItemData.ID = g.ActiveId;
|
|
|
- else if (group_contains_prev_active_id)
|
|
|
- g.LastItemData.ID = g.ActiveIdPreviousFrame;
|
|
|
+ else if (group_contains_deactivated_id)
|
|
|
+ g.LastItemData.ID = g.DeactivatedItemData.ID;
|
|
|
g.LastItemData.Rect = group_bb;
|
|
|
|
|
|
// Forward Hovered flag
|
|
@@ -11629,7 +11637,7 @@ void ImGui::EndGroup()
|
|
|
|
|
|
// Forward Deactivated flag
|
|
|
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDeactivated;
|
|
|
- if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame)
|
|
|
+ if (group_contains_deactivated_id)
|
|
|
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated;
|
|
|
|
|
|
g.GroupStack.pop_back();
|