mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 20:07:01 +00:00
This commit is contained in:
parent
56cdbe434d
commit
f2699de242
19
imgui.cpp
19
imgui.cpp
@ -7609,11 +7609,13 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
|||||||
const ImGuiIO& io = g.IO;
|
const ImGuiIO& io = g.IO;
|
||||||
const ImGuiStyle& style = g.Style;
|
const ImGuiStyle& style = g.Style;
|
||||||
|
|
||||||
const ImGuiID id = window->GetID(label);
|
|
||||||
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
|
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
|
||||||
const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0;
|
const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0;
|
||||||
const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
|
const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
|
||||||
|
|
||||||
|
if (is_multiline) // Open group before calling GetID() because groups tracks id created during their spawn
|
||||||
|
BeginGroup();
|
||||||
|
const ImGuiID id = window->GetID(label);
|
||||||
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
||||||
ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
|
ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
|
||||||
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);
|
||||||
@ -7622,7 +7624,6 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
|||||||
ImGuiWindow* draw_window = window;
|
ImGuiWindow* draw_window = window;
|
||||||
if (is_multiline)
|
if (is_multiline)
|
||||||
{
|
{
|
||||||
BeginGroup();
|
|
||||||
if (!BeginChildFrame(id, frame_bb.GetSize()))
|
if (!BeginChildFrame(id, frame_bb.GetSize()))
|
||||||
{
|
{
|
||||||
EndChildFrame();
|
EndChildFrame();
|
||||||
@ -8149,8 +8150,6 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
|||||||
Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line
|
Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line
|
||||||
EndChildFrame();
|
EndChildFrame();
|
||||||
EndGroup();
|
EndGroup();
|
||||||
if (g.ActiveId == id || is_currently_scrolling) // Set LastItemId which was lost by EndChild/EndGroup, so user can use IsItemActive()
|
|
||||||
window->DC.LastItemId = g.ActiveId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_password)
|
if (is_password)
|
||||||
@ -8204,7 +8203,7 @@ bool ImGui::InputScalarEx(const char* label, ImGuiDataType data_type, void* data
|
|||||||
if (!(extra_flags & ImGuiInputTextFlags_CharsHexadecimal))
|
if (!(extra_flags & ImGuiInputTextFlags_CharsHexadecimal))
|
||||||
extra_flags |= ImGuiInputTextFlags_CharsDecimal;
|
extra_flags |= ImGuiInputTextFlags_CharsDecimal;
|
||||||
extra_flags |= ImGuiInputTextFlags_AutoSelectAll;
|
extra_flags |= ImGuiInputTextFlags_AutoSelectAll;
|
||||||
if (InputText("", buf, IM_ARRAYSIZE(buf), extra_flags))
|
if (InputText("", buf, IM_ARRAYSIZE(buf), extra_flags)) // PushId(label) + "" gives us the expected ID from outside point of view
|
||||||
value_changed = DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, scalar_format);
|
value_changed = DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, scalar_format);
|
||||||
|
|
||||||
// Step buttons
|
// Step buttons
|
||||||
@ -9155,6 +9154,7 @@ void ImGui::BeginGroup()
|
|||||||
group_data.BackupCurrentLineHeight = window->DC.CurrentLineHeight;
|
group_data.BackupCurrentLineHeight = window->DC.CurrentLineHeight;
|
||||||
group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;
|
group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;
|
||||||
group_data.BackupLogLinePosY = window->DC.LogLinePosY;
|
group_data.BackupLogLinePosY = window->DC.LogLinePosY;
|
||||||
|
group_data.BackupActiveIdIsAlive = GImGui->ActiveIdIsAlive;
|
||||||
group_data.AdvanceCursor = true;
|
group_data.AdvanceCursor = true;
|
||||||
|
|
||||||
window->DC.GroupOffsetX = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffsetX;
|
window->DC.GroupOffsetX = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffsetX;
|
||||||
@ -9166,15 +9166,15 @@ void ImGui::BeginGroup()
|
|||||||
|
|
||||||
void ImGui::EndGroup()
|
void ImGui::EndGroup()
|
||||||
{
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
ImGuiStyle& style = GetStyle();
|
|
||||||
|
|
||||||
IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls
|
IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls
|
||||||
|
|
||||||
ImGuiGroupData& group_data = window->DC.GroupStack.back();
|
ImGuiGroupData& group_data = window->DC.GroupStack.back();
|
||||||
|
|
||||||
ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);
|
ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);
|
||||||
group_bb.Max.y -= style.ItemSpacing.y; // Cancel out last vertical spacing because we are adding one ourselves.
|
group_bb.Max.y -= g.Style.ItemSpacing.y; // Cancel out last vertical spacing because we are adding one ourselves.
|
||||||
group_bb.Max = ImMax(group_bb.Min, group_bb.Max);
|
group_bb.Max = ImMax(group_bb.Min, group_bb.Max);
|
||||||
|
|
||||||
window->DC.CursorPos = group_data.BackupCursorPos;
|
window->DC.CursorPos = group_data.BackupCursorPos;
|
||||||
@ -9192,6 +9192,11 @@ void ImGui::EndGroup()
|
|||||||
ItemAdd(group_bb, NULL);
|
ItemAdd(group_bb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive() will function on the entire group.
|
||||||
|
// It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but if you search for LastItemId you'll notice it is only used in that context.
|
||||||
|
if (!group_data.BackupActiveIdIsAlive && g.ActiveIdIsAlive && g.ActiveId && g.ActiveIdWindow->RootWindow == window->RootWindow)
|
||||||
|
window->DC.LastItemId = g.ActiveId;
|
||||||
|
|
||||||
window->DC.GroupStack.pop_back();
|
window->DC.GroupStack.pop_back();
|
||||||
|
|
||||||
//window->DrawList->AddRect(group_bb.Min, group_bb.Max, 0xFFFF00FF); // Debug
|
//window->DrawList->AddRect(group_bb.Min, group_bb.Max, 0xFFFF00FF); // Debug
|
||||||
|
@ -266,6 +266,7 @@ struct ImGuiGroupData
|
|||||||
float BackupCurrentLineHeight;
|
float BackupCurrentLineHeight;
|
||||||
float BackupCurrentLineTextBaseOffset;
|
float BackupCurrentLineTextBaseOffset;
|
||||||
float BackupLogLinePosY;
|
float BackupLogLinePosY;
|
||||||
|
bool BackupActiveIdIsAlive;
|
||||||
bool AdvanceCursor;
|
bool AdvanceCursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user