From 514dee10ccfd60c8f4b8d835b726ad293f2a8436 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Thu, 23 Apr 2026 01:43:23 +0800 Subject: [PATCH] Fix editor text caret measurement --- .../app/Composition/EditorShellRuntime.cpp | 1 + .../app/Features/Hierarchy/HierarchyPanel.cpp | 14 ++++++- .../app/Features/Hierarchy/HierarchyPanel.h | 3 ++ .../app/Features/Inspector/InspectorPanel.cpp | 7 +++- .../app/Features/Inspector/InspectorPanel.h | 2 + .../app/Features/Project/ProjectPanel.cpp | 6 ++- .../Collections/UIEditorFilterableTreeHost.h | 4 +- .../Collections/UIEditorInlineRenameSession.h | 4 +- .../XCEditor/Fields/UIEditorNumberField.h | 8 +++- .../XCEditor/Fields/UIEditorPropertyGrid.h | 7 +++- .../XCEditor/Fields/UIEditorTextField.h | 8 +++- .../XCEditor/Fields/UIEditorVector2Field.h | 8 +++- .../XCEditor/Fields/UIEditorVector3Field.h | 8 +++- .../XCEditor/Fields/UIEditorVector4Field.h | 8 +++- .../XCEditor/Widgets/UIEditorTextLayout.h | 41 ++++++++++++++++--- .../UIEditorFilterableTreeHost.cpp | 6 ++- .../UIEditorInlineRenameSession.cpp | 6 ++- new_editor/src/Fields/UIEditorNumberField.cpp | 34 +++++++++++---- .../src/Fields/UIEditorPropertyGrid.cpp | 24 +++++++---- new_editor/src/Fields/UIEditorTextField.cpp | 19 +++++++-- .../src/Fields/UIEditorVector2Field.cpp | 12 ++++-- .../src/Fields/UIEditorVector3Field.cpp | 12 ++++-- .../src/Fields/UIEditorVector4Field.cpp | 12 ++++-- .../src/Fields/UIEditorVectorFieldShared.h | 13 ++++-- 24 files changed, 205 insertions(+), 62 deletions(-) diff --git a/new_editor/app/Composition/EditorShellRuntime.cpp b/new_editor/app/Composition/EditorShellRuntime.cpp index 592f7d6f..f7594dfe 100644 --- a/new_editor/app/Composition/EditorShellRuntime.cpp +++ b/new_editor/app/Composition/EditorShellRuntime.cpp @@ -20,6 +20,7 @@ void EditorShellRuntime::Initialize( &m_builtInIcons, m_viewportHostService); m_hierarchyPanel.SetBuiltInIcons(&m_builtInIcons); + m_hierarchyPanel.SetTextMeasurer(&textMeasurer); m_projectPanel.SetBuiltInIcons(&m_builtInIcons); m_projectPanel.SetTextMeasurer(&textMeasurer); m_hierarchyPanel.Initialize(); diff --git a/new_editor/app/Features/Hierarchy/HierarchyPanel.cpp b/new_editor/app/Features/Hierarchy/HierarchyPanel.cpp index f3e6dfb5..754ebf40 100644 --- a/new_editor/app/Features/Hierarchy/HierarchyPanel.cpp +++ b/new_editor/app/Features/Hierarchy/HierarchyPanel.cpp @@ -85,6 +85,11 @@ void HierarchyPanel::SetBuiltInIcons(const BuiltInIcons* icons) { RebuildItems(); } +void HierarchyPanel::SetTextMeasurer( + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { + m_textMeasurer = textMeasurer; +} + void HierarchyPanel::ResetInteractionState() { m_filterHostState = {}; m_filterHostFrame = {}; @@ -660,7 +665,11 @@ void HierarchyPanel::Append(UIDrawList& drawList) const { AppendUIEditorFilterableTreeHostSearchField( drawList, m_filterHostFrame, - m_filterHostState); + m_filterHostState, + "Search", + {}, + {}, + m_textMeasurer); if (m_treeFrame.layout.bounds.width <= 0.0f || m_treeFrame.layout.bounds.height <= 0.0f) { return; @@ -687,7 +696,8 @@ void HierarchyPanel::Append(UIDrawList& drawList) const { m_renameState, ResolveUIEditorTreeViewInlineRenamePalette(), BuildUIEditorTreeViewInlineRenameMetrics( - BuildRenameBounds(m_renameState.itemId, m_treeFrame.layout))); + BuildRenameBounds(m_renameState.itemId, m_treeFrame.layout)), + m_textMeasurer); } AppendUIEditorTreeViewDropPreview( diff --git a/new_editor/app/Features/Hierarchy/HierarchyPanel.h b/new_editor/app/Features/Hierarchy/HierarchyPanel.h index c5946967..d58d9ccb 100644 --- a/new_editor/app/Features/Hierarchy/HierarchyPanel.h +++ b/new_editor/app/Features/Hierarchy/HierarchyPanel.h @@ -3,6 +3,7 @@ #include "HierarchyModel.h" #include "Commands/EditorEditCommandRoute.h" +#include #include #include #include @@ -44,6 +45,7 @@ public: void SetSceneRuntime(EditorSceneRuntime* sceneRuntime); void SetCommandFocusService(EditorCommandFocusService* commandFocusService); void SetBuiltInIcons(const BuiltInIcons* icons); + void SetTextMeasurer(const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer); void ResetInteractionState(); void Update( const UIEditorHostedPanelDispatchEntry& dispatchEntry, @@ -104,6 +106,7 @@ private: std::string m_pendingRenameItemId = {}; std::vector m_frameEvents = {}; Collections::TreeDragDrop::State m_dragState = {}; + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* m_textMeasurer = nullptr; bool m_visible = false; }; diff --git a/new_editor/app/Features/Inspector/InspectorPanel.cpp b/new_editor/app/Features/Inspector/InspectorPanel.cpp index e6adec66..1f337e62 100644 --- a/new_editor/app/Features/Inspector/InspectorPanel.cpp +++ b/new_editor/app/Features/Inspector/InspectorPanel.cpp @@ -218,6 +218,7 @@ void InspectorPanel::ResetPanelState() { m_visible = false; m_bounds = {}; m_sceneRuntime = nullptr; + m_textMeasurer = nullptr; m_subject = {}; m_subjectKey.clear(); m_presentation = {}; @@ -733,6 +734,7 @@ void InspectorPanel::Update( m_visible = true; m_bounds = dispatchEntry.bounds; m_sceneRuntime = &context.GetSceneRuntime(); + m_textMeasurer = context.GetShellServices().textMeasurer; m_subject = BuildInspectorSubject(context.GetSession(), context.GetSceneRuntime()); const std::string nextSubjectKey = BuildSubjectKey(); @@ -894,7 +896,10 @@ void InspectorPanel::Append(UIDrawList& drawList) const { m_interactionState.propertyGridState, m_propertyEditModel, ::XCEngine::UI::Editor::GetUIEditorFixedPropertyGridPalette(), - ::XCEngine::UI::Editor::GetUIEditorFixedPropertyGridMetrics()); + ::XCEngine::UI::Editor::GetUIEditorFixedPropertyGridMetrics(), + {}, + {}, + m_textMeasurer); } if (ShouldShowAddComponentButton()) { diff --git a/new_editor/app/Features/Inspector/InspectorPanel.h b/new_editor/app/Features/Inspector/InspectorPanel.h index a32eacea..6bce7cbc 100644 --- a/new_editor/app/Features/Inspector/InspectorPanel.h +++ b/new_editor/app/Features/Inspector/InspectorPanel.h @@ -4,6 +4,7 @@ #include "Features/Inspector/InspectorSubject.h" #include "Commands/EditorEditCommandRoute.h" +#include #include #include #include @@ -89,6 +90,7 @@ private: std::uint64_t m_lastProjectSelectionStamp = 0u; std::uint64_t m_lastSceneInspectorRevision = 0u; std::uint64_t m_lastAppliedColorPickerRevision = 0u; + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* m_textMeasurer = nullptr; bool m_addComponentButtonHovered = false; bool m_addComponentButtonPressed = false; }; diff --git a/new_editor/app/Features/Project/ProjectPanel.cpp b/new_editor/app/Features/Project/ProjectPanel.cpp index 25b6cdf4..46da5d63 100644 --- a/new_editor/app/Features/Project/ProjectPanel.cpp +++ b/new_editor/app/Features/Project/ProjectPanel.cpp @@ -2324,7 +2324,11 @@ void ProjectPanel::Append(UIDrawList& drawList) const { AppendUIEditorFilterableTreeHostSearchField( drawList, m_treeFilterHostFrame, - m_treeFilterHostState); + m_treeFilterHostState, + "Search", + {}, + {}, + m_textMeasurer); AppendUIEditorTreeViewBackground( drawList, m_treeFrame.layout, diff --git a/new_editor/include/XCEditor/Collections/UIEditorFilterableTreeHost.h b/new_editor/include/XCEditor/Collections/UIEditorFilterableTreeHost.h index 36655af2..2ce9c19b 100644 --- a/new_editor/include/XCEditor/Collections/UIEditorFilterableTreeHost.h +++ b/new_editor/include/XCEditor/Collections/UIEditorFilterableTreeHost.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -101,6 +102,7 @@ void AppendUIEditorFilterableTreeHostSearchField( const UIEditorFilterableTreeHostState& state, std::string_view placeholderText = "Search", const Widgets::UIEditorFilterableTreeHostPalette& palette = {}, - const Widgets::UIEditorFilterableTreeHostMetrics& metrics = {}); + const Widgets::UIEditorFilterableTreeHostMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor diff --git a/new_editor/include/XCEditor/Collections/UIEditorInlineRenameSession.h b/new_editor/include/XCEditor/Collections/UIEditorInlineRenameSession.h index 4472582d..de0c6375 100644 --- a/new_editor/include/XCEditor/Collections/UIEditorInlineRenameSession.h +++ b/new_editor/include/XCEditor/Collections/UIEditorInlineRenameSession.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -50,7 +51,8 @@ void AppendUIEditorInlineRenameSession( const UIEditorInlineRenameSessionFrame& frame, const UIEditorInlineRenameSessionState& state, const Widgets::UIEditorTextFieldPalette& palette = {}, - const Widgets::UIEditorTextFieldMetrics& metrics = {}); + const Widgets::UIEditorTextFieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); UIEditorInlineRenameSessionFrame UpdateUIEditorInlineRenameSession( UIEditorInlineRenameSessionState& state, diff --git a/new_editor/include/XCEditor/Fields/UIEditorNumberField.h b/new_editor/include/XCEditor/Fields/UIEditorNumberField.h index e2104fc0..c72febf2 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorNumberField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorNumberField.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -136,7 +138,8 @@ void AppendUIEditorNumberFieldForeground( const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette = {}, - const UIEditorNumberFieldMetrics& metrics = {}); + const UIEditorNumberFieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorNumberField( ::XCEngine::UI::UIDrawList& drawList, @@ -144,6 +147,7 @@ void AppendUIEditorNumberField( const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette = {}, - const UIEditorNumberFieldMetrics& metrics = {}); + const UIEditorNumberFieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h b/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h index b15b5914..f00df3f6 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h +++ b/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -336,7 +337,8 @@ void AppendUIEditorPropertyGridForeground( const UIEditorPropertyGridPalette& palette = {}, const UIEditorPropertyGridMetrics& metrics = {}, const UIEditorMenuPopupPalette& popupPalette = {}, - const UIEditorMenuPopupMetrics& popupMetrics = {}); + const UIEditorMenuPopupMetrics& popupMetrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorPropertyGrid( ::XCEngine::UI::UIDrawList& drawList, @@ -349,6 +351,7 @@ void AppendUIEditorPropertyGrid( const UIEditorPropertyGridPalette& palette = {}, const UIEditorPropertyGridMetrics& metrics = {}, const UIEditorMenuPopupPalette& popupPalette = {}, - const UIEditorMenuPopupMetrics& popupMetrics = {}); + const UIEditorMenuPopupMetrics& popupMetrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Fields/UIEditorTextField.h b/new_editor/include/XCEditor/Fields/UIEditorTextField.h index bf5c9b71..15947cff 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorTextField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorTextField.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -120,7 +122,8 @@ void AppendUIEditorTextFieldForeground( const UIEditorTextFieldSpec& spec, const UIEditorTextFieldState& state, const UIEditorTextFieldPalette& palette = {}, - const UIEditorTextFieldMetrics& metrics = {}); + const UIEditorTextFieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorTextField( ::XCEngine::UI::UIDrawList& drawList, @@ -128,6 +131,7 @@ void AppendUIEditorTextField( const UIEditorTextFieldSpec& spec, const UIEditorTextFieldState& state, const UIEditorTextFieldPalette& palette = {}, - const UIEditorTextFieldMetrics& metrics = {}); + const UIEditorTextFieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h index ea0413aa..b0603be9 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -161,7 +163,8 @@ void AppendUIEditorVector2FieldForeground( const UIEditorVector2FieldSpec& spec, const UIEditorVector2FieldState& state, const UIEditorVector2FieldPalette& palette = {}, - const UIEditorVector2FieldMetrics& metrics = {}); + const UIEditorVector2FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorVector2Field( ::XCEngine::UI::UIDrawList& drawList, @@ -169,6 +172,7 @@ void AppendUIEditorVector2Field( const UIEditorVector2FieldSpec& spec, const UIEditorVector2FieldState& state, const UIEditorVector2FieldPalette& palette = {}, - const UIEditorVector2FieldMetrics& metrics = {}); + const UIEditorVector2FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h index e1dd71b3..7f47eda9 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -163,7 +165,8 @@ void AppendUIEditorVector3FieldForeground( const UIEditorVector3FieldSpec& spec, const UIEditorVector3FieldState& state, const UIEditorVector3FieldPalette& palette = {}, - const UIEditorVector3FieldMetrics& metrics = {}); + const UIEditorVector3FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorVector3Field( ::XCEngine::UI::UIDrawList& drawList, @@ -171,6 +174,7 @@ void AppendUIEditorVector3Field( const UIEditorVector3FieldSpec& spec, const UIEditorVector3FieldState& state, const UIEditorVector3FieldPalette& palette = {}, - const UIEditorVector3FieldMetrics& metrics = {}); + const UIEditorVector3FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h index 246177e9..c99a85c9 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -176,7 +178,8 @@ void AppendUIEditorVector4FieldForeground( const UIEditorVector4FieldSpec& spec, const UIEditorVector4FieldState& state, const UIEditorVector4FieldPalette& palette = {}, - const UIEditorVector4FieldMetrics& metrics = {}); + const UIEditorVector4FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); void AppendUIEditorVector4Field( ::XCEngine::UI::UIDrawList& drawList, @@ -184,6 +187,7 @@ void AppendUIEditorVector4Field( const UIEditorVector4FieldSpec& spec, const UIEditorVector4FieldState& state, const UIEditorVector4FieldPalette& palette = {}, - const UIEditorVector4FieldMetrics& metrics = {}); + const UIEditorVector4FieldMetrics& metrics = {}, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr); } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/include/XCEditor/Widgets/UIEditorTextLayout.h b/new_editor/include/XCEditor/Widgets/UIEditorTextLayout.h index 573a3fb8..2e31031a 100644 --- a/new_editor/include/XCEditor/Widgets/UIEditorTextLayout.h +++ b/new_editor/include/XCEditor/Widgets/UIEditorTextLayout.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -37,7 +39,18 @@ inline ::XCEngine::UI::UIRect ResolveUIEditorTextClipRect( inline float MeasureUIEditorTextWidth( const std::string& text, - float fontSize) { + float fontSize, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr) { + if (textMeasurer != nullptr && + !text.empty() && + fontSize > 0.0f) { + return textMeasurer->MeasureTextWidth( + ::XCEngine::UI::Editor::UIEditorTextMeasureRequest{ + text, + fontSize + }); + } + return fontSize * 0.56f * static_cast(::XCEngine::UI::Text::CountUtf8Codepoints(text)); } @@ -45,12 +58,24 @@ inline float MeasureUIEditorTextWidth( inline float MeasureUIEditorTextWidthToCaret( const std::string& text, std::size_t caretOffset, - float fontSize) { + float fontSize, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr) { + const std::size_t clampedCaretOffset = (std::min)(caretOffset, text.size()); + if (textMeasurer != nullptr && + clampedCaretOffset > 0u && + fontSize > 0.0f) { + return textMeasurer->MeasureTextWidth( + ::XCEngine::UI::Editor::UIEditorTextMeasureRequest{ + std::string_view(text.data(), clampedCaretOffset), + fontSize + }); + } + return fontSize * 0.56f * static_cast(::XCEngine::UI::Text::CountUtf8CodepointsInRange( text, 0u, - (std::min)(caretOffset, text.size()))); + clampedCaretOffset)); } inline std::uint64_t GetUIEditorTextCaretClockNanoseconds() { @@ -93,14 +118,20 @@ inline void AppendUIEditorTextCaret( float fontSize, float insetX, float insetY = 0.0f, - float thickness = 1.0f) { + float thickness = 1.0f, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer = nullptr) { if (color.a <= 0.0f || !ShouldBlinkUIEditorTextCaret(blinkStartNanoseconds)) { return; } const float caretX = (std::min)( rect.x + rect.width - 1.0f, - rect.x + insetX + MeasureUIEditorTextWidthToCaret(text, caretOffset, fontSize)); + rect.x + insetX + + MeasureUIEditorTextWidthToCaret( + text, + caretOffset, + fontSize, + textMeasurer)); const float top = ResolveUIEditorTextTop(rect, fontSize, insetY); const float bottom = top + MeasureUIEditorTextLayoutHeight(fontSize); drawList.AddLine( diff --git a/new_editor/src/Collections/UIEditorFilterableTreeHost.cpp b/new_editor/src/Collections/UIEditorFilterableTreeHost.cpp index 6c0b5dac..21b0f519 100644 --- a/new_editor/src/Collections/UIEditorFilterableTreeHost.cpp +++ b/new_editor/src/Collections/UIEditorFilterableTreeHost.cpp @@ -227,7 +227,8 @@ void AppendUIEditorFilterableTreeHostSearchField( const UIEditorFilterableTreeHostState& state, std::string_view placeholderText, const Widgets::UIEditorFilterableTreeHostPalette& palette, - const Widgets::UIEditorFilterableTreeHostMetrics& metrics) { + const Widgets::UIEditorFilterableTreeHostMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { if (frame.layout.searchFieldRect.width <= 0.0f || frame.layout.searchFieldRect.height <= 0.0f) { return; @@ -248,7 +249,8 @@ void AppendUIEditorFilterableTreeHostSearchField( state.searchFieldSpec, state.searchFieldInteractionState.textFieldState, palette.searchFieldPalette, - resolvedMetrics.searchFieldMetrics); + resolvedMetrics.searchFieldMetrics, + textMeasurer); if (!state.searchFieldSpec.value.empty() || state.searchFieldInteractionState.textFieldState.editing || diff --git a/new_editor/src/Collections/UIEditorInlineRenameSession.cpp b/new_editor/src/Collections/UIEditorInlineRenameSession.cpp index d21c4962..87c93524 100644 --- a/new_editor/src/Collections/UIEditorInlineRenameSession.cpp +++ b/new_editor/src/Collections/UIEditorInlineRenameSession.cpp @@ -22,7 +22,8 @@ void AppendUIEditorInlineRenameSession( const UIEditorInlineRenameSessionFrame& frame, const UIEditorInlineRenameSessionState& state, const Widgets::UIEditorTextFieldPalette& palette, - const Widgets::UIEditorTextFieldMetrics& metrics) { + const Widgets::UIEditorTextFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { if (!state.active) { return; } @@ -40,7 +41,8 @@ void AppendUIEditorInlineRenameSession( state.textFieldSpec, state.textFieldInteraction.textFieldState, palette, - metrics); + metrics, + textMeasurer); } namespace { diff --git a/new_editor/src/Fields/UIEditorNumberField.cpp b/new_editor/src/Fields/UIEditorNumberField.cpp index 6f06bc79..0cb85ac7 100644 --- a/new_editor/src/Fields/UIEditorNumberField.cpp +++ b/new_editor/src/Fields/UIEditorNumberField.cpp @@ -145,7 +145,8 @@ void AppendValueText( const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette, - const UIEditorNumberFieldMetrics& metrics) { + const UIEditorNumberFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorNumberFieldPalette resolvedPalette = ResolvePalette(palette); const UIEditorNumberFieldMetrics resolvedMetrics = ResolveMetrics(metrics); drawList.PushClipRect(ResolveUIEditorTextClipRect(layout.valueRect, resolvedMetrics.valueFontSize)); @@ -166,7 +167,9 @@ void AppendValueText( resolvedPalette.valueColor, resolvedMetrics.valueFontSize, resolvedMetrics.valueTextInsetX, - resolvedMetrics.valueTextInsetY); + resolvedMetrics.valueTextInsetY, + 1.0f, + textMeasurer); } drawList.PopClipRect(); } @@ -297,7 +300,8 @@ void AppendUIEditorNumberFieldForeground( const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette, - const UIEditorNumberFieldMetrics& metrics) { + const UIEditorNumberFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorNumberFieldPalette resolvedPalette = ResolvePalette(palette); const UIEditorNumberFieldMetrics resolvedMetrics = ResolveMetrics(metrics); AppendLabelText(drawList, layout, spec.label, resolvedPalette, resolvedMetrics); @@ -308,7 +312,8 @@ void AppendUIEditorNumberFieldForeground( spec, state, resolvedPalette, - resolvedMetrics); + resolvedMetrics, + textMeasurer); } void AppendUIEditorNumberField( @@ -317,7 +322,8 @@ void AppendUIEditorNumberField( const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette, - const UIEditorNumberFieldMetrics& metrics) { + const UIEditorNumberFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorNumberFieldPalette resolvedPalette = ResolvePalette(palette); const UIEditorNumberFieldMetrics resolvedMetrics = ResolveMetrics(metrics); const UIEditorNumberFieldLayout layout = BuildUIEditorNumberFieldLayout(bounds, spec, resolvedMetrics); @@ -328,11 +334,25 @@ void AppendUIEditorNumberField( editingSpec.value = parsedValue; } - AppendUIEditorNumberFieldForeground(drawList, layout, editingSpec, state, resolvedPalette, resolvedMetrics); + AppendUIEditorNumberFieldForeground( + drawList, + layout, + editingSpec, + state, + resolvedPalette, + resolvedMetrics, + textMeasurer); return; } - AppendUIEditorNumberFieldForeground(drawList, layout, spec, state, resolvedPalette, resolvedMetrics); + AppendUIEditorNumberFieldForeground( + drawList, + layout, + spec, + state, + resolvedPalette, + resolvedMetrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorPropertyGrid.cpp b/new_editor/src/Fields/UIEditorPropertyGrid.cpp index b8161a03..3bf6d750 100644 --- a/new_editor/src/Fields/UIEditorPropertyGrid.cpp +++ b/new_editor/src/Fields/UIEditorPropertyGrid.cpp @@ -858,7 +858,8 @@ void AppendUIEditorPropertyGridForeground( const UIEditorPropertyGridPalette& palette, const UIEditorPropertyGridMetrics& metrics, const UIEditorMenuPopupPalette& popupPalette, - const UIEditorMenuPopupMetrics& popupMetrics) { + const UIEditorMenuPopupMetrics& popupMetrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { (void)propertyEditModel; drawList.PushClipRect(layout.bounds); @@ -975,7 +976,8 @@ void AppendUIEditorPropertyGridForeground( Internal::BuildNumberFieldSpec(field), fieldState, numberPalette, - numberMetrics); + numberMetrics, + textMeasurer); break; } @@ -1067,7 +1069,8 @@ void AppendUIEditorPropertyGridForeground( Internal::BuildVector2FieldSpec(field), fieldState, vector2Palette, - vector2Metrics); + vector2Metrics, + textMeasurer); break; } @@ -1091,7 +1094,8 @@ void AppendUIEditorPropertyGridForeground( Internal::BuildVector3FieldSpec(field), fieldState, vector3Palette, - vector3Metrics); + vector3Metrics, + textMeasurer); break; } @@ -1115,7 +1119,8 @@ void AppendUIEditorPropertyGridForeground( Internal::BuildVector4FieldSpec(field), fieldState, vector4Palette, - vector4Metrics); + vector4Metrics, + textMeasurer); break; } @@ -1148,7 +1153,8 @@ void AppendUIEditorPropertyGridForeground( fieldSpec, fieldState, textPalette, - textMetrics); + textMetrics, + textMeasurer); if (fieldState.editing) { drawList.PushClipRect( @@ -1216,7 +1222,8 @@ void AppendUIEditorPropertyGrid( const UIEditorPropertyGridPalette& palette, const UIEditorPropertyGridMetrics& metrics, const UIEditorMenuPopupPalette& popupPalette, - const UIEditorMenuPopupMetrics& popupMetrics) { + const UIEditorMenuPopupMetrics& popupMetrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorPropertyGridLayout layout = BuildUIEditorPropertyGridLayout(bounds, sections, expansionModel, metrics); AppendUIEditorPropertyGridBackground( @@ -1238,7 +1245,8 @@ void AppendUIEditorPropertyGrid( palette, metrics, popupPalette, - popupMetrics); + popupMetrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorTextField.cpp b/new_editor/src/Fields/UIEditorTextField.cpp index 8dbeac48..9df3f8d2 100644 --- a/new_editor/src/Fields/UIEditorTextField.cpp +++ b/new_editor/src/Fields/UIEditorTextField.cpp @@ -181,7 +181,8 @@ void AppendUIEditorTextFieldForeground( const UIEditorTextFieldSpec& spec, const UIEditorTextFieldState& state, const UIEditorTextFieldPalette& palette, - const UIEditorTextFieldMetrics& metrics) { + const UIEditorTextFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorTextFieldPalette resolvedPalette = ResolvePalette(palette); const UIEditorTextFieldMetrics resolvedMetrics = ResolveMetrics(metrics); drawList.PushClipRect(ResolveUIEditorTextClipRect(layout.labelRect, resolvedMetrics.labelFontSize)); @@ -212,7 +213,9 @@ void AppendUIEditorTextFieldForeground( resolvedPalette.valueColor, resolvedMetrics.valueFontSize, resolvedMetrics.valueTextInsetX, - resolvedMetrics.valueTextInsetY); + resolvedMetrics.valueTextInsetY, + 1.0f, + textMeasurer); } drawList.PopClipRect(); } @@ -223,12 +226,20 @@ void AppendUIEditorTextField( const UIEditorTextFieldSpec& spec, const UIEditorTextFieldState& state, const UIEditorTextFieldPalette& palette, - const UIEditorTextFieldMetrics& metrics) { + const UIEditorTextFieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const UIEditorTextFieldMetrics resolvedMetrics = ResolveMetrics(metrics); const UIEditorTextFieldPalette resolvedPalette = ResolvePalette(palette); const UIEditorTextFieldLayout layout = BuildUIEditorTextFieldLayout(bounds, spec, resolvedMetrics); AppendUIEditorTextFieldBackground(drawList, layout, spec, state, resolvedPalette, resolvedMetrics); - AppendUIEditorTextFieldForeground(drawList, layout, spec, state, resolvedPalette, resolvedMetrics); + AppendUIEditorTextFieldForeground( + drawList, + layout, + spec, + state, + resolvedPalette, + resolvedMetrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorVector2Field.cpp b/new_editor/src/Fields/UIEditorVector2Field.cpp index a3822abb..28fed2b1 100644 --- a/new_editor/src/Fields/UIEditorVector2Field.cpp +++ b/new_editor/src/Fields/UIEditorVector2Field.cpp @@ -110,14 +110,16 @@ void AppendUIEditorVector2FieldForeground( const UIEditorVector2FieldSpec& spec, const UIEditorVector2FieldState& state, const UIEditorVector2FieldPalette& palette, - const UIEditorVector2FieldMetrics& metrics) { + const UIEditorVector2FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendForeground( drawList, layout, spec, state, palette, - metrics); + metrics, + textMeasurer); } void AppendUIEditorVector2Field( @@ -126,14 +128,16 @@ void AppendUIEditorVector2Field( const UIEditorVector2FieldSpec& spec, const UIEditorVector2FieldState& state, const UIEditorVector2FieldPalette& palette, - const UIEditorVector2FieldMetrics& metrics) { + const UIEditorVector2FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendField( drawList, bounds, spec, state, palette, - metrics); + metrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorVector3Field.cpp b/new_editor/src/Fields/UIEditorVector3Field.cpp index 289756b3..45a00554 100644 --- a/new_editor/src/Fields/UIEditorVector3Field.cpp +++ b/new_editor/src/Fields/UIEditorVector3Field.cpp @@ -124,14 +124,16 @@ void AppendUIEditorVector3FieldForeground( const UIEditorVector3FieldSpec& spec, const UIEditorVector3FieldState& state, const UIEditorVector3FieldPalette& palette, - const UIEditorVector3FieldMetrics& metrics) { + const UIEditorVector3FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendForeground( drawList, layout, spec, state, palette, - metrics); + metrics, + textMeasurer); } void AppendUIEditorVector3Field( @@ -140,14 +142,16 @@ void AppendUIEditorVector3Field( const UIEditorVector3FieldSpec& spec, const UIEditorVector3FieldState& state, const UIEditorVector3FieldPalette& palette, - const UIEditorVector3FieldMetrics& metrics) { + const UIEditorVector3FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendField( drawList, bounds, spec, state, palette, - metrics); + metrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorVector4Field.cpp b/new_editor/src/Fields/UIEditorVector4Field.cpp index 30257419..de3e39a4 100644 --- a/new_editor/src/Fields/UIEditorVector4Field.cpp +++ b/new_editor/src/Fields/UIEditorVector4Field.cpp @@ -128,14 +128,16 @@ void AppendUIEditorVector4FieldForeground( const UIEditorVector4FieldSpec& spec, const UIEditorVector4FieldState& state, const UIEditorVector4FieldPalette& palette, - const UIEditorVector4FieldMetrics& metrics) { + const UIEditorVector4FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendForeground( drawList, layout, spec, state, palette, - metrics); + metrics, + textMeasurer); } void AppendUIEditorVector4Field( @@ -144,14 +146,16 @@ void AppendUIEditorVector4Field( const UIEditorVector4FieldSpec& spec, const UIEditorVector4FieldState& state, const UIEditorVector4FieldPalette& palette, - const UIEditorVector4FieldMetrics& metrics) { + const UIEditorVector4FieldMetrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { Internal::VectorFieldWidgetShared::AppendField( drawList, bounds, spec, state, palette, - metrics); + metrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Widgets diff --git a/new_editor/src/Fields/UIEditorVectorFieldShared.h b/new_editor/src/Fields/UIEditorVectorFieldShared.h index f6952cc4..f75932f5 100644 --- a/new_editor/src/Fields/UIEditorVectorFieldShared.h +++ b/new_editor/src/Fields/UIEditorVectorFieldShared.h @@ -387,7 +387,8 @@ void AppendForeground( const typename Traits::Spec& spec, const typename Traits::State& state, const typename Traits::Palette& palette, - const typename Traits::Metrics& metrics) { + const typename Traits::Metrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const typename Traits::Palette resolvedPalette = ResolvePalette(palette); const typename Traits::Metrics resolvedMetrics = ResolveMetrics(metrics); @@ -465,7 +466,9 @@ void AppendForeground( resolvedPalette.valueColor, resolvedMetrics.valueFontSize, resolvedMetrics.valueTextInsetX, - resolvedMetrics.valueTextInsetY); + resolvedMetrics.valueTextInsetY, + 1.0f, + textMeasurer); } drawList.PopClipRect(); } @@ -478,7 +481,8 @@ void AppendField( const typename Traits::Spec& spec, const typename Traits::State& state, const typename Traits::Palette& palette, - const typename Traits::Metrics& metrics) { + const typename Traits::Metrics& metrics, + const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) { const typename Traits::Palette resolvedPalette = ResolvePalette(palette); const typename Traits::Metrics resolvedMetrics = ResolveMetrics(metrics); const typename Traits::Layout layout = @@ -496,7 +500,8 @@ void AppendField( spec, state, resolvedPalette, - resolvedMetrics); + resolvedMetrics, + textMeasurer); } } // namespace XCEngine::UI::Editor::Internal::VectorFieldWidgetShared