mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	(amended)
This commit is contained in:
		| @@ -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) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user