mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 11:57:00 +00:00
TreeNode: Added IsItemToggledOpen() to explicitly query if item was just open/closed, facilitating interactions with custom multi-selections patterns. (#1896, #1861)
This commit is contained in:
parent
011d475532
commit
57dc34f4e8
@ -67,7 +67,9 @@ Other Changes:
|
|||||||
- TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow
|
- TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow
|
||||||
incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897)
|
incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897)
|
||||||
- TreeNode: The collapsing arrow accepts click even if modifier keys are being held, facilitating
|
- TreeNode: The collapsing arrow accepts click even if modifier keys are being held, facilitating
|
||||||
interactions with multi-select patterns. (#2886, #1896, #1861)
|
interactions with custom multi-selections patterns. (#2886, #1896, #1861)
|
||||||
|
- TreeNode: Added IsItemToggledOpen() to explicitly query if item was just open/closed, facilitating
|
||||||
|
interactions with custom multi-selections patterns. (#1896, #1861)
|
||||||
- DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the data
|
- DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the data
|
||||||
to clarify how they are used, and more comments redirecting to the demo code. (#2844)
|
to clarify how they are used, and more comments redirecting to the demo code. (#2844)
|
||||||
- Misc: Optimized storage of window settings data (reducing allocation count).
|
- Misc: Optimized storage of window settings data (reducing allocation count).
|
||||||
|
@ -4458,6 +4458,12 @@ bool ImGui::IsItemClicked(int mouse_button)
|
|||||||
return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None);
|
return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ImGui::IsItemToggledOpen()
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
return (g.CurrentWindow->DC.LastItemStatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
bool ImGui::IsItemToggledSelection()
|
bool ImGui::IsItemToggledSelection()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
1
imgui.h
1
imgui.h
@ -636,6 +636,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive).
|
IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive).
|
||||||
IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing.
|
IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing.
|
||||||
IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item).
|
IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item).
|
||||||
|
IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode().
|
||||||
IMGUI_API bool IsAnyItemHovered(); // is any item hovered?
|
IMGUI_API bool IsAnyItemHovered(); // is any item hovered?
|
||||||
IMGUI_API bool IsAnyItemActive(); // is any item active?
|
IMGUI_API bool IsAnyItemActive(); // is any item active?
|
||||||
IMGUI_API bool IsAnyItemFocused(); // is any item focused?
|
IMGUI_API bool IsAnyItemFocused(); // is any item focused?
|
||||||
|
@ -1613,7 +1613,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
{
|
{
|
||||||
// Submit an item (various types available) so we can query their status in the following block.
|
// Submit an item (various types available) so we can query their status in the following block.
|
||||||
static int item_type = 1;
|
static int item_type = 1;
|
||||||
ImGui::Combo("Item Type", &item_type, "Text\0Button\0Button (w/ repeat)\0Checkbox\0SliderFloat\0InputText\0InputFloat\0InputFloat3\0ColorEdit4\0MenuItem\0TreeNode (w/ double-click)\0ListBox\0");
|
ImGui::Combo("Item Type", &item_type, "Text\0Button\0Button (w/ repeat)\0Checkbox\0SliderFloat\0InputText\0InputFloat\0InputFloat3\0ColorEdit4\0MenuItem\0TreeNode\0TreeNode (w/ double-click)\0ListBox\0", 20);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions.");
|
HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions.");
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
@ -1630,8 +1630,9 @@ static void ShowDemoWindowWidgets()
|
|||||||
if (item_type == 7) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
|
if (item_type == 7) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
|
||||||
if (item_type == 8) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
|
if (item_type == 8) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
|
||||||
if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
|
if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
|
||||||
if (item_type == 10){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
|
if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
|
||||||
if (item_type == 11){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
|
if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
|
||||||
|
if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
|
||||||
|
|
||||||
// Display the value of IsItemHovered() and other common item state functions.
|
// Display the value of IsItemHovered() and other common item state functions.
|
||||||
// Note that the ImGuiHoveredFlags_XXX flags can be combined.
|
// Note that the ImGuiHoveredFlags_XXX flags can be combined.
|
||||||
@ -1652,6 +1653,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
"IsItemDeactivatedAfterEdit() = %d\n"
|
"IsItemDeactivatedAfterEdit() = %d\n"
|
||||||
"IsItemVisible() = %d\n"
|
"IsItemVisible() = %d\n"
|
||||||
"IsItemClicked() = %d\n"
|
"IsItemClicked() = %d\n"
|
||||||
|
"IsItemToggledOpen() = %d\n"
|
||||||
"GetItemRectMin() = (%.1f, %.1f)\n"
|
"GetItemRectMin() = (%.1f, %.1f)\n"
|
||||||
"GetItemRectMax() = (%.1f, %.1f)\n"
|
"GetItemRectMax() = (%.1f, %.1f)\n"
|
||||||
"GetItemRectSize() = (%.1f, %.1f)",
|
"GetItemRectSize() = (%.1f, %.1f)",
|
||||||
@ -1669,6 +1671,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
ImGui::IsItemDeactivatedAfterEdit(),
|
ImGui::IsItemDeactivatedAfterEdit(),
|
||||||
ImGui::IsItemVisible(),
|
ImGui::IsItemVisible(),
|
||||||
ImGui::IsItemClicked(),
|
ImGui::IsItemClicked(),
|
||||||
|
ImGui::IsItemToggledOpen(),
|
||||||
ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
|
ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
|
||||||
ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
|
ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
|
||||||
ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
|
ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
|
||||||
|
@ -444,8 +444,9 @@ enum ImGuiItemStatusFlags_
|
|||||||
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_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
|
||||||
ImGuiItemStatusFlags_Deactivated = 1 << 5 // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
|
ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
|
||||||
|
ImGuiItemStatusFlags_Deactivated = 1 << 6 // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
|
||||||
|
|
||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
, // [imgui_tests only]
|
, // [imgui_tests only]
|
||||||
|
@ -5291,9 +5291,9 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
|
|||||||
|
|
||||||
bool hovered, held;
|
bool hovered, held;
|
||||||
bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
|
bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
|
||||||
bool toggled = false;
|
|
||||||
if (!is_leaf)
|
if (!is_leaf)
|
||||||
{
|
{
|
||||||
|
bool toggled = false;
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id))
|
if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id))
|
||||||
@ -5321,6 +5321,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
|
|||||||
{
|
{
|
||||||
is_open = !is_open;
|
is_open = !is_open;
|
||||||
window->DC.StateStorage->SetInt(id, is_open);
|
window->DC.StateStorage->SetInt(id, is_open);
|
||||||
|
window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledOpen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
|
if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
|
||||||
|
Loading…
Reference in New Issue
Block a user