|
@@ -1541,6 +1541,8 @@ void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_exc
|
|
|
// - BeginCombo()
|
|
|
// - BeginComboPopup() [Internal]
|
|
|
// - EndCombo()
|
|
|
+// - BeginComboPreview() [Internal]
|
|
|
+// - EndComboPreview() [Internal]
|
|
|
// - Combo()
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
@@ -1602,6 +1604,14 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
|
|
|
}
|
|
|
RenderFrameBorder(bb.Min, bb.Max, style.FrameRounding);
|
|
|
|
|
|
+ // Custom preview
|
|
|
+ if (flags & ImGuiComboFlags_CustomPreview)
|
|
|
+ {
|
|
|
+ g.ComboPreviewData.PreviewRect = ImRect(bb.Min.x, bb.Min.y, value_x2, bb.Max.y);
|
|
|
+ IM_ASSERT(preview_value == NULL || preview_value[0] == 0);
|
|
|
+ preview_value = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
// Render preview and label
|
|
|
if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview))
|
|
|
{
|
|
@@ -1683,6 +1693,57 @@ void ImGui::EndCombo()
|
|
|
EndPopup();
|
|
|
}
|
|
|
|
|
|
+// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements
|
|
|
+// (Experimental, see GitHub issues: #1658, #4168)
|
|
|
+bool ImGui::BeginComboPreview()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiWindow* window = g.CurrentWindow;
|
|
|
+ ImGuiComboPreviewData* preview_data = &g.ComboPreviewData;
|
|
|
+
|
|
|
+ if (window->SkipItems || !window->ClipRect.Overlaps(window->DC.LastItemRect)) // FIXME: Because we don't have a ImGuiItemStatusFlags_Visible flag to test last ItemAdd() result
|
|
|
+ return false;
|
|
|
+ IM_ASSERT(window->DC.LastItemRect.Min.x == preview_data->PreviewRect.Min.x && window->DC.LastItemRect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag?
|
|
|
+ if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // FIXME: This could be contained in a PushWorkRect() api
|
|
|
+ preview_data->BackupCursorPos = window->DC.CursorPos;
|
|
|
+ preview_data->BackupCursorMaxPos = window->DC.CursorMaxPos;
|
|
|
+ preview_data->BackupCursorPosPrevLine = window->DC.CursorPosPrevLine;
|
|
|
+ preview_data->BackupPrevLineTextBaseOffset = window->DC.PrevLineTextBaseOffset;
|
|
|
+ preview_data->BackupLayout = window->DC.LayoutType;
|
|
|
+ window->DC.CursorPos = preview_data->PreviewRect.Min + g.Style.FramePadding;
|
|
|
+ window->DC.CursorMaxPos = window->DC.CursorPos;
|
|
|
+ window->DC.LayoutType = ImGuiLayoutType_Horizontal;
|
|
|
+ PushClipRect(preview_data->PreviewRect.Min, preview_data->PreviewRect.Max, true);
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+void ImGui::EndComboPreview()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiWindow* window = g.CurrentWindow;
|
|
|
+ ImGuiComboPreviewData* preview_data = &g.ComboPreviewData;
|
|
|
+
|
|
|
+ // FIXME: Using CursorMaxPos approximation instead of correct AABB which we will store in ImDrawCmd in the future
|
|
|
+ ImDrawList* draw_list = window->DrawList;
|
|
|
+ if (window->DC.CursorMaxPos.x < preview_data->PreviewRect.Max.x && window->DC.CursorMaxPos.y < preview_data->PreviewRect.Max.y)
|
|
|
+ if (draw_list->CmdBuffer.Size > 1) // Unlikely case that the PushClipRect() didn't create a command
|
|
|
+ {
|
|
|
+ draw_list->_CmdHeader.ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 2].ClipRect;
|
|
|
+ draw_list->_TryMergeDrawCmds();
|
|
|
+ }
|
|
|
+ PopClipRect();
|
|
|
+ window->DC.CursorPos = preview_data->BackupCursorPos;
|
|
|
+ window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, preview_data->BackupCursorMaxPos);
|
|
|
+ window->DC.CursorPosPrevLine = preview_data->BackupCursorPosPrevLine;
|
|
|
+ window->DC.PrevLineTextBaseOffset = preview_data->BackupPrevLineTextBaseOffset;
|
|
|
+ window->DC.LayoutType = preview_data->BackupLayout;
|
|
|
+ preview_data->PreviewRect = ImRect();
|
|
|
+}
|
|
|
+
|
|
|
// Getter for the old Combo() API: const char*[]
|
|
|
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
|
|
{
|