Skip to content

Commit ba1c846

Browse files
committed
Internals: Removed ImGuiButtonFlags_Disabled (which had inconsistent behavior) in favor of ImGuiItemFlags_Disabled. Selectable()'s ImGuiSelectableFlags_Disabled now uses the later. (ocornut#211)
1 parent f668240 commit ba1c846

File tree

3 files changed

+19
-22
lines changed

3 files changed

+19
-22
lines changed

imgui_demo.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -2187,7 +2187,7 @@ static void ShowDemoWindowWidgets()
21872187
const char* item_names[] =
21882188
{
21892189
"Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputFloat",
2190-
"InputFloat3", "ColorEdit4", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox"
2190+
"InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox"
21912191
};
21922192
static int item_type = 1;
21932193
ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names));
@@ -2208,11 +2208,12 @@ static void ShowDemoWindowWidgets()
22082208
if (item_type == 6) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input
22092209
if (item_type == 7) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
22102210
if (item_type == 8) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
2211-
if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
2212-
if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
2213-
if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
2214-
if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", &current, items, IM_ARRAYSIZE(items)); }
2215-
if (item_type == 13){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
2211+
if (item_type == 9) { ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item
2212+
if (item_type == 10){ ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
2213+
if (item_type == 11){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
2214+
if (item_type == 12){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
2215+
if (item_type == 13){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", &current, items, IM_ARRAYSIZE(items)); }
2216+
if (item_type == 14){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
22162217

22172218
// Display the values of IsItemHovered() and other common item state functions.
22182219
// Note that the ImGuiHoveredFlags_XXX flags can be combined.

imgui_internal.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ enum ImGuiButtonFlagsPrivate_
798798
ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
799799
ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
800800
ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED]
801-
ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions
801+
//ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use PushDisabled() or ImGuiItemFlags_Disabled
802802
ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
803803
ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held
804804
ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)

imgui_widgets.cpp

+11-15
Original file line numberDiff line numberDiff line change
@@ -488,14 +488,6 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
488488
ImGuiContext& g = *GImGui;
489489
ImGuiWindow* window = GetCurrentWindow();
490490

491-
if (flags & ImGuiButtonFlags_Disabled)
492-
{
493-
if (out_hovered) *out_hovered = false;
494-
if (out_held) *out_held = false;
495-
if (g.ActiveId == id) ClearActiveID();
496-
return false;
497-
}
498-
499491
// Default only reacts to left mouse button
500492
if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0)
501493
flags |= ImGuiButtonFlags_MouseButtonDefault_;
@@ -6139,7 +6131,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
61396131
}
61406132

61416133
bool item_add;
6142-
if (flags & ImGuiSelectableFlags_Disabled)
6134+
const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0;
6135+
if (disabled_item)
61436136
{
61446137
ImGuiItemFlags backup_item_flags = g.CurrentItemFlags;
61456138
g.CurrentItemFlags |= ImGuiItemFlags_Disabled;
@@ -6160,6 +6153,12 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
61606153
if (!item_add)
61616154
return false;
61626155

6156+
const bool disabled_global = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0;
6157+
if (disabled_item && !disabled_global)
6158+
PushDisabled(true);
6159+
if (disabled_item || disabled_global)
6160+
selected = false;
6161+
61636162
// FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only,
61646163
// which would be advantageous since most selectable are not selected.
61656164
if (span_all_columns && window->DC.CurrentColumns)
@@ -6172,13 +6171,9 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
61726171
if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; }
61736172
if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; }
61746173
if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; }
6175-
if (flags & ImGuiSelectableFlags_Disabled) { button_flags |= ImGuiButtonFlags_Disabled; }
61766174
if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; }
61776175
if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; }
61786176

6179-
if (flags & ImGuiSelectableFlags_Disabled)
6180-
selected = false;
6181-
61826177
const bool was_selected = selected;
61836178
bool hovered, held;
61846179
bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
@@ -6228,14 +6223,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
62286223
else if (span_all_columns && g.CurrentTable)
62296224
TablePopBackgroundChannel();
62306225

6231-
if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]);
62326226
RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
6233-
if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor();
62346227

62356228
// Automatically close popups
62366229
if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.CurrentItemFlags & ImGuiItemFlags_SelectableDontClosePopup))
62376230
CloseCurrentPopup();
62386231

6232+
if (disabled_item && !disabled_global)
6233+
PopDisabled();
6234+
62396235
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.LastItemStatusFlags);
62406236
return pressed;
62416237
}

0 commit comments

Comments
 (0)