mirror of
https://github.com/ocornut/imgui.git
synced 2026-05-28 20:26:06 +08:00
Inputs: SetItemKeyOwner(): return true if ownership has been requested, which can to be checked to accurately gate further input test.
(#456, #2637, #2620, #2891, #3370, #3724, #4828, #5108, #5242, #5641)
This commit is contained in:
@@ -152,6 +152,10 @@ Other Changes:
|
|||||||
items straying out of columns boundaries. (#7994, #2221)
|
items straying out of columns boundaries. (#7994, #2221)
|
||||||
- Box-Select + Tables: fixed an issue when calling `BeginMultiSelect()` in a table
|
- Box-Select + Tables: fixed an issue when calling `BeginMultiSelect()` in a table
|
||||||
before layout has been locked (first row or headers row submitted). (#8250)
|
before layout has been locked (first row or headers row submitted). (#8250)
|
||||||
|
- Inputs:
|
||||||
|
- SetItemKeyOwner(): return true if ownership has been requested, which typically
|
||||||
|
needs to to checked for gating further tests. This is important as the function
|
||||||
|
may fail. (#456, #2637, #2620, #2891, #3370, #3724, #4828, #5108, #5242, #5641)
|
||||||
- Style:
|
- Style:
|
||||||
- Fixed vertical scrollbar top coordinates when using thick borders on windows
|
- Fixed vertical scrollbar top coordinates when using thick borders on windows
|
||||||
with no title bar and no menu bar. (#9366)
|
with no title bar and no menu bar. (#9366)
|
||||||
|
|||||||
@@ -10682,6 +10682,7 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id)
|
|||||||
// - SetKeyOwner(..., None) : clears owner
|
// - SetKeyOwner(..., None) : clears owner
|
||||||
// - SetKeyOwner(..., Any, !Lock) : illegal (assert)
|
// - SetKeyOwner(..., Any, !Lock) : illegal (assert)
|
||||||
// - SetKeyOwner(..., Any or None, Lock) : set lock
|
// - SetKeyOwner(..., Any or None, Lock) : set lock
|
||||||
|
// Ownership is automatically released on the frame after a release, see code in UpdateKeyboardInputs().
|
||||||
void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
|
void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@@ -10708,30 +10709,32 @@ void ImGui::SetKeyOwnersForKeyChord(ImGuiKeyChord key_chord, ImGuiID owner_id, I
|
|||||||
if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); }
|
if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is more or less equivalent to:
|
// This is more or less equivalent to a fancier version of:
|
||||||
// if (IsItemHovered() || IsItemActive())
|
// if (IsItemHovered() || IsItemActive())
|
||||||
// SetKeyOwner(key, GetItemID());
|
// SetKeyOwner(key, GetItemID());
|
||||||
// Extensive uses of that (e.g. many calls for a single item) may want to manually perform the tests once and then call SetKeyOwner() multiple times.
|
// Extensive uses of that (e.g. many calls for a single item) may want to manually perform the tests once and then call SetKeyOwner() multiple times.
|
||||||
// More advanced usage scenarios may want to call SetKeyOwner() manually based on different condition.
|
// More advanced usage scenarios may want to call SetKeyOwner() manually based on different condition.
|
||||||
// Worth noting is that only one item can be hovered and only one item can be active, therefore this usage pattern doesn't need to bother with routing and priority.
|
// Worth noting is that only one item can be hovered and only one item can be active, therefore this usage pattern doesn't need to bother with routing and priority.
|
||||||
void ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags)
|
bool ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiID id = g.LastItemData.ID;
|
ImGuiID id = g.LastItemData.ID;
|
||||||
if (id == 0 || (g.HoveredId != id && g.ActiveId != id))
|
if (id == 0 || (g.HoveredId != id && g.ActiveId != id))
|
||||||
return;
|
return false;
|
||||||
if ((flags & ImGuiInputFlags_CondMask_) == 0)
|
if ((flags & ImGuiInputFlags_CondMask_) == 0)
|
||||||
flags |= ImGuiInputFlags_CondDefault_;
|
flags |= ImGuiInputFlags_CondDefault_;
|
||||||
if ((g.HoveredId == id && (flags & ImGuiInputFlags_CondHovered)) || (g.ActiveId == id && (flags & ImGuiInputFlags_CondActive)))
|
if ((g.HoveredId == id && (flags & ImGuiInputFlags_CondHovered)) || (g.ActiveId == id && (flags & ImGuiInputFlags_CondActive)))
|
||||||
{
|
{
|
||||||
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetItemKeyOwner) == 0); // Passing flags not supported by this function!
|
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetItemKeyOwner) == 0); // Passing flags not supported by this function!
|
||||||
SetKeyOwner(key, id, flags & ~ImGuiInputFlags_CondMask_);
|
SetKeyOwner(key, id, flags & ~ImGuiInputFlags_CondMask_);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetItemKeyOwner(ImGuiKey key)
|
bool ImGui::SetItemKeyOwner(ImGuiKey key)
|
||||||
{
|
{
|
||||||
SetItemKeyOwner(key, ImGuiInputFlags_None);
|
return SetItemKeyOwner(key, ImGuiInputFlags_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the only public API until we expose owner_id versions of the API as replacements.
|
// This is the only public API until we expose owner_id versions of the API as replacements.
|
||||||
|
|||||||
@@ -1092,10 +1092,11 @@ namespace ImGui
|
|||||||
// Inputs Utilities: Key/Input Ownership [BETA]
|
// Inputs Utilities: Key/Input Ownership [BETA]
|
||||||
// - One common use case would be to allow your items to disable standard inputs behaviors such
|
// - One common use case would be to allow your items to disable standard inputs behaviors such
|
||||||
// as Tab or Alt key handling, Mouse Wheel scrolling, etc.
|
// as Tab or Alt key handling, Mouse Wheel scrolling, etc.
|
||||||
// e.g. Button(...); SetItemKeyOwner(ImGuiKey_MouseWheelY); to make hovering/activating a button disable wheel for scrolling.
|
// e.g. `Button(...); if (SetItemKeyOwner(ImGuiKey_MouseWheelY)) { ... }` to make hovering/activating a button disable wheel for scrolling.
|
||||||
// - Reminder ImGuiKey enum include access to mouse buttons and gamepad, so key ownership can apply to them.
|
// - Reminder ImGuiKey enum include access to mouse buttons and gamepad, so key ownership can apply to them.
|
||||||
|
// - The return value of SetItemKeyOwner() says if ownership has been requested for the item, which is a shortcut to calling yet non-public TestKeyOwner() function.
|
||||||
// - Many related features are still in imgui_internal.h. For instance, most IsKeyXXX()/IsMouseXXX() functions have an owner-id-aware version.
|
// - Many related features are still in imgui_internal.h. For instance, most IsKeyXXX()/IsMouseXXX() functions have an owner-id-aware version.
|
||||||
IMGUI_API void SetItemKeyOwner(ImGuiKey key); // Set key owner to last item ID if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
|
IMGUI_API bool SetItemKeyOwner(ImGuiKey key); // Set key owner to last item ID if it is hovered or active. Return true when ownership has been set. Roughly equivalent to 'if (TestKeyOwner(key, GetItemID()) && (IsItemHovered() || IsItemActive())) { SetKeyOwner(key, GetItemID());'.
|
||||||
|
|
||||||
// Inputs Utilities: Mouse
|
// Inputs Utilities: Mouse
|
||||||
// - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
|
// - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
|
||||||
|
|||||||
+3
-3
@@ -875,9 +875,9 @@ static void ExampleImageViewer_DrawCanvas(ExampleImageViewerData* data, ImVec2 c
|
|||||||
data->ViewReset = false;
|
data->ViewReset = false;
|
||||||
|
|
||||||
// Handle inputs
|
// Handle inputs
|
||||||
ImGui::SetItemKeyOwner(ImGuiKey_MouseWheelY); // FIXME: Not while scrolling?
|
if (ImGui::SetItemKeyOwner(ImGuiKey_MouseWheelY)) // FIXME: Not while scrolling?
|
||||||
if (ImGui::IsItemHovered() && io.MouseWheel != 0.0f)
|
if (io.MouseWheel != 0.0f)
|
||||||
data->Zoom = IM_CLAMP(data->Zoom * (1.0f + io.MouseWheel * 0.10f), data->ZoomMin, data->ZoomMax);
|
data->Zoom = IM_CLAMP(data->Zoom * (1.0f + io.MouseWheel * 0.10f), data->ZoomMin, data->ZoomMax);
|
||||||
float zoom = data->Zoom; // (float)(int)ViewZoom;
|
float zoom = data->Zoom; // (float)(int)ViewZoom;
|
||||||
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0))
|
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0))
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -3436,7 +3436,7 @@ namespace ImGui
|
|||||||
IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
|
IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
|
||||||
IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
||||||
IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
||||||
IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
|
IMGUI_API bool SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags);
|
||||||
IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
|
IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
|
||||||
inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
|
inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user