mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Added SetNextItemShortcut() wip function. (#456)
Mark widget as hovered. Amend d10641b
.
This commit is contained in:
parent
4c2c09450a
commit
a201af7354
35
imgui.cpp
35
imgui.cpp
@ -3891,6 +3891,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
|
|||||||
g.ActiveIdNoClearOnFocusLoss = false;
|
g.ActiveIdNoClearOnFocusLoss = false;
|
||||||
g.ActiveIdWindow = window;
|
g.ActiveIdWindow = window;
|
||||||
g.ActiveIdHasBeenEditedThisFrame = false;
|
g.ActiveIdHasBeenEditedThisFrame = false;
|
||||||
|
g.ActiveIdFromShortcut = false;
|
||||||
if (id)
|
if (id)
|
||||||
{
|
{
|
||||||
g.ActiveIdIsAlive = id;
|
g.ActiveIdIsAlive = id;
|
||||||
@ -4100,7 +4101,8 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flag
|
|||||||
if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap)
|
if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap)
|
||||||
return false;
|
return false;
|
||||||
if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)
|
if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)
|
||||||
return false;
|
if (!g.ActiveIdFromShortcut)
|
||||||
|
return false;
|
||||||
|
|
||||||
// Done with rectangle culling so we can perform heavier checks now.
|
// Done with rectangle culling so we can perform heavier checks now.
|
||||||
if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None))
|
if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None))
|
||||||
@ -4160,12 +4162,13 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flag
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: This is inlined/duplicated in ItemAdd()
|
// FIXME: This is inlined/duplicated in ItemAdd()
|
||||||
|
// FIXME: The id != 0 path is not used by our codebase, may get rid of it?
|
||||||
bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id)
|
bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
if (!bb.Overlaps(window->ClipRect))
|
if (!bb.Overlaps(window->ClipRect))
|
||||||
if (id == 0 || (id != g.ActiveId && id != g.NavId))
|
if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId))
|
||||||
if (!g.LogEnabled)
|
if (!g.LogEnabled)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
@ -9421,6 +9424,13 @@ bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiIn
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::SetNextItemShortcut(ImGuiKeyChord key_chord)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasShortcut;
|
||||||
|
g.NextItemData.Shortcut = key_chord;
|
||||||
|
}
|
||||||
|
|
||||||
bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
|
bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
|
||||||
{
|
{
|
||||||
//ImGuiContext& g = *GImGui;
|
//ImGuiContext& g = *GImGui;
|
||||||
@ -9731,6 +9741,7 @@ void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx)
|
|||||||
// [SECTION] ITEM SUBMISSION
|
// [SECTION] ITEM SUBMISSION
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// - KeepAliveID()
|
// - KeepAliveID()
|
||||||
|
// - ItemHandleShortcut() [Internal]
|
||||||
// - ItemAdd()
|
// - ItemAdd()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -9744,6 +9755,20 @@ void ImGui::KeepAliveID(ImGuiID id)
|
|||||||
g.ActiveIdPreviousFrameIsAlive = true;
|
g.ActiveIdPreviousFrameIsAlive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ItemHandleShortcut(ImGuiID id)
|
||||||
|
{
|
||||||
|
// FIXME: Generalize Activation queue?
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if (ImGui::Shortcut(g.NextItemData.Shortcut, id, ImGuiInputFlags_None) && g.NavActivateId == 0)
|
||||||
|
{
|
||||||
|
g.NavActivateId = id; // Will effectively disable clipping.
|
||||||
|
g.NavActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_FromShortcut;
|
||||||
|
if (g.ActiveId == 0 || g.ActiveId == id)
|
||||||
|
g.NavActivateDownId = g.NavActivatePressedId = id;
|
||||||
|
ImGui::NavHighlightActivated(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Declare item bounding box for clipping and interaction.
|
// Declare item bounding box for clipping and interaction.
|
||||||
// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface
|
// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface
|
||||||
// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction.
|
// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction.
|
||||||
@ -9785,6 +9810,9 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
|
|||||||
if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened))
|
if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened))
|
||||||
NavProcessItem();
|
NavProcessItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasShortcut)
|
||||||
|
ItemHandleShortcut(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lightweight clear of SetNextItemXXX data.
|
// Lightweight clear of SetNextItemXXX data.
|
||||||
@ -9801,9 +9829,10 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
|
|||||||
//const bool is_clipped = IsClippedEx(bb, id);
|
//const bool is_clipped = IsClippedEx(bb, id);
|
||||||
//if (is_clipped)
|
//if (is_clipped)
|
||||||
// return false;
|
// return false;
|
||||||
|
// g.NavActivateId is not necessarily == g.NavId, in the case of remote activation (e.g. shortcuts)
|
||||||
const bool is_rect_visible = bb.Overlaps(window->ClipRect);
|
const bool is_rect_visible = bb.Overlaps(window->ClipRect);
|
||||||
if (!is_rect_visible)
|
if (!is_rect_visible)
|
||||||
if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId))
|
if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId))
|
||||||
if (!g.LogEnabled)
|
if (!g.LogEnabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
2
imgui.h
2
imgui.h
@ -24,7 +24,7 @@
|
|||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
||||||
#define IMGUI_VERSION "1.90.2 WIP"
|
#define IMGUI_VERSION "1.90.2 WIP"
|
||||||
#define IMGUI_VERSION_NUM 19014
|
#define IMGUI_VERSION_NUM 19015
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1145,6 +1145,7 @@ enum ImGuiNextItemDataFlags_
|
|||||||
ImGuiNextItemDataFlags_None = 0,
|
ImGuiNextItemDataFlags_None = 0,
|
||||||
ImGuiNextItemDataFlags_HasWidth = 1 << 0,
|
ImGuiNextItemDataFlags_HasWidth = 1 << 0,
|
||||||
ImGuiNextItemDataFlags_HasOpen = 1 << 1,
|
ImGuiNextItemDataFlags_HasOpen = 1 << 1,
|
||||||
|
ImGuiNextItemDataFlags_HasShortcut = 1 << 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImGuiNextItemData
|
struct ImGuiNextItemData
|
||||||
@ -1154,6 +1155,7 @@ struct ImGuiNextItemData
|
|||||||
// Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem()
|
// Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem()
|
||||||
ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
|
ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
|
||||||
float Width; // Set by SetNextItemWidth()
|
float Width; // Set by SetNextItemWidth()
|
||||||
|
ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()
|
||||||
bool OpenVal; // Set by SetNextItemOpen()
|
bool OpenVal; // Set by SetNextItemOpen()
|
||||||
ImGuiCond OpenCond : 8;
|
ImGuiCond OpenCond : 8;
|
||||||
|
|
||||||
@ -1518,6 +1520,7 @@ enum ImGuiActivateFlags_
|
|||||||
ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.
|
ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.
|
||||||
ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
|
ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
|
||||||
ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request
|
ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request
|
||||||
|
ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Early work-in-progress API for ScrollToItem()
|
// Early work-in-progress API for ScrollToItem()
|
||||||
@ -1963,6 +1966,7 @@ struct ImGuiContext
|
|||||||
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;
|
bool ActiveIdHasBeenEditedThisFrame;
|
||||||
|
bool ActiveIdFromShortcut;
|
||||||
int ActiveIdMouseButton : 8;
|
int ActiveIdMouseButton : 8;
|
||||||
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)
|
||||||
ImGuiWindow* ActiveIdWindow;
|
ImGuiWindow* ActiveIdWindow;
|
||||||
@ -2267,6 +2271,7 @@ struct ImGuiContext
|
|||||||
ActiveIdHasBeenPressedBefore = false;
|
ActiveIdHasBeenPressedBefore = false;
|
||||||
ActiveIdHasBeenEditedBefore = false;
|
ActiveIdHasBeenEditedBefore = false;
|
||||||
ActiveIdHasBeenEditedThisFrame = false;
|
ActiveIdHasBeenEditedThisFrame = false;
|
||||||
|
ActiveIdFromShortcut = false;
|
||||||
ActiveIdClickOffset = ImVec2(-1, -1);
|
ActiveIdClickOffset = ImVec2(-1, -1);
|
||||||
ActiveIdWindow = NULL;
|
ActiveIdWindow = NULL;
|
||||||
ActiveIdSource = ImGuiInputSource_None;
|
ActiveIdSource = ImGuiInputSource_None;
|
||||||
@ -3225,6 +3230,7 @@ namespace ImGui
|
|||||||
// - IsKeyChordPressed() compares mods + call IsKeyPressed() -> function has no side-effect.
|
// - IsKeyChordPressed() compares mods + call IsKeyPressed() -> function has no side-effect.
|
||||||
// - Shortcut() submits a route then if currently can be routed calls IsKeyChordPressed() -> function has (desirable) side-effects.
|
// - Shortcut() submits a route then if currently can be routed calls IsKeyChordPressed() -> function has (desirable) side-effects.
|
||||||
IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags = 0);
|
||||||
|
IMGUI_API void SetNextItemShortcut(ImGuiKeyChord key_chord);
|
||||||
IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
|
IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
|
||||||
IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags = 0); // owner_id needs to be explicit and cannot be 0
|
IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags = 0); // owner_id needs to be explicit and cannot be 0
|
||||||
IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
|
IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
|
||||||
|
@ -477,6 +477,9 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
|
|||||||
// Frame N + RepeatDelay + RepeatRate*N true true - true
|
// Frame N + RepeatDelay + RepeatRate*N true true - true
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// FIXME: For refactor we could output flags, incl mouse hovered vs nav keyboard vs nav triggered etc.
|
||||||
|
// And better standardize how widgets use 'GetColor32((held && hovered) ? ... : hovered ? ...)' vs 'GetColor32(held ? ... : hovered ? ...);'
|
||||||
|
// For mouse feedback we typically prefer the 'held && hovered' test, but for nav feedback not always. Outputting hovered=true on Activation may be misleading.
|
||||||
bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)
|
bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -598,7 +601,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Gamepad/Keyboard handling
|
// Gamepad/Keyboard handling
|
||||||
// We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse.
|
// We report navigated and navigation-activated items as hovered but we don't set g.HoveredId to not interfere with mouse.
|
||||||
if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover)
|
if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover)
|
||||||
if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus))
|
if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus))
|
||||||
hovered = true;
|
hovered = true;
|
||||||
@ -621,8 +624,10 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
pressed = true;
|
pressed = true;
|
||||||
SetActiveID(id, window);
|
SetActiveID(id, window);
|
||||||
g.ActiveIdSource = g.NavInputSource;
|
g.ActiveIdSource = g.NavInputSource;
|
||||||
if (!(flags & ImGuiButtonFlags_NoNavFocus))
|
if (!(flags & ImGuiButtonFlags_NoNavFocus) && !(g.NavActivateFlags & ImGuiActivateFlags_FromShortcut))
|
||||||
SetFocusID(id, window);
|
SetFocusID(id, window);
|
||||||
|
if (g.NavActivateFlags & ImGuiActivateFlags_FromShortcut)
|
||||||
|
g.ActiveIdFromShortcut = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -667,7 +672,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
{
|
{
|
||||||
// When activated using Nav, we hold on the ActiveID until activation button is released
|
// When activated using Nav, we hold on the ActiveID until activation button is released
|
||||||
if (g.NavActivateDownId == id)
|
if (g.NavActivateDownId == id)
|
||||||
held = true;
|
held = true; // hovered == true not true as we are already likely hovered on direct activation.
|
||||||
else
|
else
|
||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
}
|
}
|
||||||
@ -675,7 +680,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
g.ActiveIdHasBeenPressedBefore = true;
|
g.ActiveIdHasBeenPressedBefore = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Activation highlight
|
// Activation highlight (this may be a remote activation)
|
||||||
if (g.NavHighlightActivatedId == id)
|
if (g.NavHighlightActivatedId == id)
|
||||||
hovered = true;
|
hovered = true;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user