Fixed ListBox() label not included in declared size (fix #151), fixed ListBoxHeader() incorrect handling of SkipItems, Added Exemple

This commit is contained in:
ocornut 2015-03-06 22:40:21 +00:00
parent eaab61f08b
commit 4ab2db73e5

View File

@ -1137,6 +1137,13 @@ static inline ImGuiWindow* GetCurrentWindow()
return g.CurrentWindow; return g.CurrentWindow;
} }
static inline ImGuiWindow* GetParentWindow()
{
ImGuiState& g = *GImGui;
IM_ASSERT(g.CurrentWindowStack.size() >= 2);
return g.CurrentWindowStack[g.CurrentWindowStack.size() - 2];
}
static void SetActiveId(ImGuiID id) static void SetActiveId(ImGuiID id)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
@ -2574,8 +2581,8 @@ void ImGui::EndChild()
window = GetCurrentWindow(); window = GetCurrentWindow();
ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + sz); ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + sz);
ItemAdd(bb, NULL);
ItemSize(sz); ItemSize(sz);
ItemAdd(bb, NULL);
} }
} }
@ -6018,8 +6025,6 @@ bool ImGui::Selectable(const char* label, bool* p_selected, const ImVec2& size_a
bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg) bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
const ImGuiStyle& style = ImGui::GetStyle(); const ImGuiStyle& style = ImGui::GetStyle();
const ImGuiID id = ImGui::GetID(label); const ImGuiID id = ImGui::GetID(label);
@ -6031,6 +6036,8 @@ bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
size.y = (size_arg.y != 0.0f) ? size_arg.y : ImGui::GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y; size.y = (size_arg.y != 0.0f) ? size_arg.y : ImGui::GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y;
const ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); const ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y));
const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
window->DC.LastItemAabb = bb;
if (label_size.x > 0) if (label_size.x > 0)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
@ -6057,7 +6064,13 @@ bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_item
void ImGui::ListBoxFooter() void ImGui::ListBoxFooter()
{ {
ImGuiWindow* parent_window = GetParentWindow();
const ImGuiAabb bb = parent_window->DC.LastItemAabb;
ImGui::EndChildFrame(); ImGui::EndChildFrame();
parent_window->DC.CursorPos = bb.Min;
ItemSize(bb, NULL);
} }
bool ImGui::ListBox(const char* label, int* current_item, const char** items, int items_count, int height_items) bool ImGui::ListBox(const char* label, int* current_item, const char** items, int items_count, int height_items)
@ -6068,6 +6081,10 @@ bool ImGui::ListBox(const char* label, int* current_item, const char** items, in
bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items)
{ {
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
if (!ImGui::ListBoxHeader(label, items_count, height_in_items)) if (!ImGui::ListBoxHeader(label, items_count, height_in_items))
return false; return false;
@ -8772,22 +8789,32 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::SameLine(); ImGui::SameLine();
ImGui::Checkbox("Rich", &c4); ImGui::Checkbox("Rich", &c4);
// SliderFloat // Various
static float f0=1.0f, f1=2.0f, f2=3.0f; static float f0=1.0f, f1=2.0f, f2=3.0f;
ImGui::PushItemWidth(80); ImGui::PushItemWidth(80);
const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" };
static int item = -1; static int item = -1;
ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items));
//ImGui::SameLine();
//ImGui::ListBox("Listbox", &item, items, IM_ARRAYSIZE(items));
//if (ImGui::IsItemHovered())
// ImGui::SetTooltip("Hovered");
ImGui::SameLine(); ImGui::SameLine();
ImGui::SliderFloat("X", &f0, 0.0f,5.0f); ImGui::SliderFloat("X", &f0, 0.0f,5.0f);
ImGui::SameLine(); ImGui::SameLine();
ImGui::SliderFloat("Y", &f1, 0.0f,5.0f); ImGui::SliderFloat("Y", &f1, 0.0f,5.0f);
ImGui::SameLine(); ImGui::SameLine();
ImGui::SliderFloat("Z", &f2, 0.0f,5.0f); ImGui::SliderFloat("Z", &f2, 0.0f,5.0f);
ImGui::PopItemWidth();
ImGui::PushItemWidth(80);
ImGui::Text("Lists:");
static int selection[5] = { -1, 0, 1, 2, 3 };
for (int i = 0; i < 5; i++)
{
if (i > 0) ImGui::SameLine();
ImGui::PushID(i);
ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items));
ImGui::PopID();
//if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i);
}
ImGui::PopItemWidth();
} }
if (ImGui::CollapsingHeader("Child regions")) if (ImGui::CollapsingHeader("Child regions"))