diff --git a/new_editor/include/XCEditor/Fields/UIEditorAssetField.h b/new_editor/include/XCEditor/Fields/UIEditorAssetField.h index cf88b10b..82bde529 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorAssetField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorAssetField.h @@ -40,6 +40,7 @@ struct UIEditorAssetFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 116.0f; float controlInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorBoolField.h b/new_editor/include/XCEditor/Fields/UIEditorBoolField.h index 390173ab..9daa1cd1 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorBoolField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorBoolField.h @@ -31,6 +31,7 @@ struct UIEditorBoolFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float checkboxSize = 18.0f; float labelTextInsetY = 0.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorColorField.h b/new_editor/include/XCEditor/Fields/UIEditorColorField.h index cd7ec6f6..a0c6b653 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorColorField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorColorField.h @@ -44,6 +44,7 @@ struct UIEditorColorFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float swatchWidth = 54.0f; float swatchInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorEnumField.h b/new_editor/include/XCEditor/Fields/UIEditorEnumField.h index e731818f..739a1ac7 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorEnumField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorEnumField.h @@ -36,6 +36,7 @@ struct UIEditorEnumFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 96.0f; float controlInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorNumberField.h b/new_editor/include/XCEditor/Fields/UIEditorNumberField.h index 814da810..e2104fc0 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorNumberField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorNumberField.h @@ -41,6 +41,7 @@ struct UIEditorNumberFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 96.0f; float controlInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorObjectField.h b/new_editor/include/XCEditor/Fields/UIEditorObjectField.h index b84d32b8..f0f60e85 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorObjectField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorObjectField.h @@ -38,6 +38,7 @@ struct UIEditorObjectFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 96.0f; float controlInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h b/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h index f78e3158..b15b5914 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h +++ b/new_editor/include/XCEditor/Fields/UIEditorPropertyGrid.h @@ -198,6 +198,7 @@ struct UIEditorPropertyGridMetrics { float horizontalPadding = 12.0f; float sectionHeaderHorizontalPadding = 6.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float labelControlGap = 20.0f; float disclosureExtent = 12.0f; float disclosureLabelGap = 8.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorTextField.h b/new_editor/include/XCEditor/Fields/UIEditorTextField.h index c4c2d4e9..bf5c9b71 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorTextField.h +++ b/new_editor/include/XCEditor/Fields/UIEditorTextField.h @@ -36,6 +36,7 @@ struct UIEditorTextFieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 96.0f; float controlInsetY = 1.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h index 2435fc77..ea0413aa 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector2Field.h @@ -47,6 +47,7 @@ struct UIEditorVector2FieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float controlInsetY = 1.0f; float componentGap = 6.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h index aff0bafe..e1dd71b3 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector3Field.h @@ -47,6 +47,7 @@ struct UIEditorVector3FieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float controlInsetY = 1.0f; float componentGap = 6.0f; diff --git a/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h b/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h index 8961c587..246177e9 100644 --- a/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h +++ b/new_editor/include/XCEditor/Fields/UIEditorVector4Field.h @@ -58,6 +58,7 @@ struct UIEditorVector4FieldMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float controlInsetY = 1.0f; float componentGap = 6.0f; diff --git a/new_editor/include/XCEditor/Widgets/UIEditorFieldRowLayout.h b/new_editor/include/XCEditor/Widgets/UIEditorFieldRowLayout.h index aa74cdf3..f78af830 100644 --- a/new_editor/include/XCEditor/Widgets/UIEditorFieldRowLayout.h +++ b/new_editor/include/XCEditor/Widgets/UIEditorFieldRowLayout.h @@ -98,6 +98,7 @@ struct UIEditorFieldRowLayoutMetrics { float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; + float sharedControlColumnMinWidth = 0.0f; float controlTrailingInset = 8.0f; float controlInsetY = 1.0f; }; diff --git a/new_editor/src/Fields/UIEditorAssetField.cpp b/new_editor/src/Fields/UIEditorAssetField.cpp index ae817718..2c72cafd 100644 --- a/new_editor/src/Fields/UIEditorAssetField.cpp +++ b/new_editor/src/Fields/UIEditorAssetField.cpp @@ -130,6 +130,7 @@ UIEditorAssetFieldLayout BuildUIEditorAssetFieldLayout( metrics.horizontalPadding, metrics.labelControlGap, metrics.controlColumnStart, + metrics.sharedControlColumnMinWidth, metrics.controlTrailingInset, metrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorBoolField.cpp b/new_editor/src/Fields/UIEditorBoolField.cpp index 3bb14d0b..f9870a08 100644 --- a/new_editor/src/Fields/UIEditorBoolField.cpp +++ b/new_editor/src/Fields/UIEditorBoolField.cpp @@ -46,6 +46,7 @@ UIEditorBoolFieldLayout BuildUIEditorBoolFieldLayout( metrics.horizontalPadding, metrics.labelControlGap, metrics.controlColumnStart, + metrics.sharedControlColumnMinWidth, metrics.controlTrailingInset, 0.0f, }); diff --git a/new_editor/src/Fields/UIEditorColorField.cpp b/new_editor/src/Fields/UIEditorColorField.cpp index e53b26d9..5e3e65ce 100644 --- a/new_editor/src/Fields/UIEditorColorField.cpp +++ b/new_editor/src/Fields/UIEditorColorField.cpp @@ -120,6 +120,7 @@ UIEditorColorFieldLayout BuildUIEditorColorFieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.swatchInsetY, }); diff --git a/new_editor/src/Fields/UIEditorEnumField.cpp b/new_editor/src/Fields/UIEditorEnumField.cpp index f63317c8..546abd2a 100644 --- a/new_editor/src/Fields/UIEditorEnumField.cpp +++ b/new_editor/src/Fields/UIEditorEnumField.cpp @@ -115,6 +115,7 @@ UIEditorEnumFieldLayout BuildUIEditorEnumFieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorFieldStyle.cpp b/new_editor/src/Fields/UIEditorFieldStyle.cpp index 64fb8f95..11f56a6a 100644 --- a/new_editor/src/Fields/UIEditorFieldStyle.cpp +++ b/new_editor/src/Fields/UIEditorFieldStyle.cpp @@ -17,17 +17,18 @@ const Widgets::UIEditorPropertyGridMetrics& GetUIEditorFixedPropertyGridMetrics( ResolveUIEditorTreeViewMetrics(); Widgets::UIEditorPropertyGridMetrics metrics = {}; metrics.contentInset = 0.0f; - metrics.sectionGap = 4.0f; + metrics.sectionGap = 0.0f; metrics.sectionHeaderHeight = 24.0f; metrics.fieldRowHeight = 22.0f; metrics.rowGap = 3.0f; metrics.horizontalPadding = 12.0f; metrics.sectionHeaderHorizontalPadding = 6.0f; metrics.controlColumnStart = 236.0f; + metrics.sharedControlColumnMinWidth = 160.0f; metrics.labelControlGap = 20.0f; metrics.disclosureExtent = treeMetrics.disclosureExtent; metrics.disclosureLabelGap = treeMetrics.disclosureLabelGap; - metrics.sectionTextInsetY = 6.0f; + metrics.sectionTextInsetY = 0.0f; metrics.sectionFontSize = 12.0f; metrics.labelTextInsetY = 0.0f; metrics.labelFontSize = 11.0f; @@ -82,6 +83,7 @@ Widgets::UIEditorBoolFieldMetrics BuildUIEditorPropertyGridBoolFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; hosted.labelFontSize = propertyGridMetrics.labelFontSize; @@ -119,6 +121,7 @@ Widgets::UIEditorNumberFieldMetrics BuildUIEditorPropertyGridNumberFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -162,6 +165,7 @@ Widgets::UIEditorTextFieldMetrics BuildUIEditorPropertyGridTextFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -205,6 +209,7 @@ Widgets::UIEditorVector2FieldMetrics BuildUIEditorPropertyGridVector2FieldMetric hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -250,6 +255,7 @@ Widgets::UIEditorVector3FieldMetrics BuildUIEditorPropertyGridVector3FieldMetric hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -295,6 +301,7 @@ Widgets::UIEditorVector4FieldMetrics BuildUIEditorPropertyGridVector4FieldMetric hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -340,6 +347,7 @@ Widgets::UIEditorEnumFieldMetrics BuildUIEditorPropertyGridEnumFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; @@ -384,6 +392,7 @@ Widgets::UIEditorColorFieldMetrics BuildUIEditorPropertyGridColorFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.swatchWidth = boolMetrics.checkboxSize; hosted.swatchInsetY = @@ -427,6 +436,7 @@ Widgets::UIEditorObjectFieldMetrics BuildUIEditorPropertyGridObjectFieldMetrics( hosted.horizontalPadding = propertyGridMetrics.horizontalPadding; hosted.labelControlGap = propertyGridMetrics.labelControlGap; hosted.controlColumnStart = propertyGridMetrics.controlColumnStart; + hosted.sharedControlColumnMinWidth = propertyGridMetrics.sharedControlColumnMinWidth; hosted.controlTrailingInset = propertyGridMetrics.valueBoxInsetX; hosted.controlInsetY = propertyGridMetrics.valueBoxInsetY; hosted.labelTextInsetY = propertyGridMetrics.labelTextInsetY; diff --git a/new_editor/src/Fields/UIEditorNumberField.cpp b/new_editor/src/Fields/UIEditorNumberField.cpp index 7485c7cc..6f06bc79 100644 --- a/new_editor/src/Fields/UIEditorNumberField.cpp +++ b/new_editor/src/Fields/UIEditorNumberField.cpp @@ -233,6 +233,7 @@ UIEditorNumberFieldLayout BuildUIEditorNumberFieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorObjectField.cpp b/new_editor/src/Fields/UIEditorObjectField.cpp index 8fd509d7..1e368f8b 100644 --- a/new_editor/src/Fields/UIEditorObjectField.cpp +++ b/new_editor/src/Fields/UIEditorObjectField.cpp @@ -119,6 +119,7 @@ UIEditorObjectFieldLayout BuildUIEditorObjectFieldLayout( metrics.horizontalPadding, metrics.labelControlGap, metrics.controlColumnStart, + metrics.sharedControlColumnMinWidth, metrics.controlTrailingInset, metrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorPropertyGrid.cpp b/new_editor/src/Fields/UIEditorPropertyGrid.cpp index ce49881c..8b80a179 100644 --- a/new_editor/src/Fields/UIEditorPropertyGrid.cpp +++ b/new_editor/src/Fields/UIEditorPropertyGrid.cpp @@ -864,11 +864,18 @@ void AppendUIEditorPropertyGridForeground( layout.sectionDisclosureRects[sectionVisibleIndex], layout.sectionExpanded[sectionVisibleIndex], palette.disclosureColor); - drawList.PushClipRect(layout.sectionTitleRects[sectionVisibleIndex], true); + drawList.PushClipRect( + ResolveUIEditorTextClipRect( + layout.sectionTitleRects[sectionVisibleIndex], + metrics.sectionFontSize), + true); drawList.AddText( ::XCEngine::UI::UIPoint( layout.sectionTitleRects[sectionVisibleIndex].x, - layout.sectionTitleRects[sectionVisibleIndex].y + metrics.sectionTextInsetY), + ResolveUIEditorTextTop( + layout.sectionTitleRects[sectionVisibleIndex], + metrics.sectionFontSize, + metrics.sectionTextInsetY)), section.title, palette.sectionTextColor, metrics.sectionFontSize); diff --git a/new_editor/src/Fields/UIEditorPropertyGridInteraction.cpp b/new_editor/src/Fields/UIEditorPropertyGridInteraction.cpp index f5b5a468..79dee0b3 100644 --- a/new_editor/src/Fields/UIEditorPropertyGridInteraction.cpp +++ b/new_editor/src/Fields/UIEditorPropertyGridInteraction.cpp @@ -1201,6 +1201,7 @@ void PruneStateEntries( template bool HasMeaningfulResult( const typename Traits::InteractionResult& result, + const typename Traits::FieldStateType& previousFieldState, const typename Traits::InteractionState& interactionState, bool hadFocus, bool hadEditing) { @@ -1211,6 +1212,9 @@ bool HasMeaningfulResult( result.editCommitted || Traits::HasEditCommitRejected(result) || result.editCanceled || + Traits::HasHoverStateChanged( + previousFieldState, + Traits::FieldState(interactionState)) || result.hitTarget.kind != Traits::kNoneHitTargetKind || hadFocus || hadEditing || @@ -1297,6 +1301,8 @@ bool ProcessFieldEventImpl( BuildInteractionState(state, field.fieldId); const bool hadFocus = Traits::FieldState(interactionState).focused; const bool hadEditing = Traits::FieldState(interactionState).editing; + const typename Traits::FieldStateType previousFieldState = + Traits::FieldState(interactionState); typename Traits::Spec spec = Traits::BuildSpec(field); const typename Traits::InteractionFrame frame = Traits::Update( @@ -1308,6 +1314,7 @@ bool ProcessFieldEventImpl( if (!HasMeaningfulResult( frame.result, + previousFieldState, interactionState, hadFocus, hadEditing)) { @@ -1415,6 +1422,7 @@ struct NumberTraits { using Metrics = Widgets::UIEditorNumberFieldMetrics; using Spec = Widgets::UIEditorNumberFieldSpec; using HitTargetKind = Widgets::UIEditorNumberFieldHitTargetKind; + using FieldStateType = Widgets::UIEditorNumberFieldState; static constexpr UIEditorPropertyGridFieldKind kFieldKind = UIEditorPropertyGridFieldKind::Number; @@ -1470,6 +1478,12 @@ struct NumberTraits { static bool HasEditCommitRejected(const InteractionResult& result) { return result.editCommitRejected; } + + static bool HasHoverStateChanged( + const FieldStateType& before, + const FieldStateType& after) { + return before.hoveredTarget != after.hoveredTarget; + } }; struct TextTraits { @@ -1480,6 +1494,7 @@ struct TextTraits { using Metrics = Widgets::UIEditorTextFieldMetrics; using Spec = Widgets::UIEditorTextFieldSpec; using HitTargetKind = Widgets::UIEditorTextFieldHitTargetKind; + using FieldStateType = Widgets::UIEditorTextFieldState; static constexpr UIEditorPropertyGridFieldKind kFieldKind = UIEditorPropertyGridFieldKind::Text; @@ -1535,6 +1550,12 @@ struct TextTraits { static bool HasEditCommitRejected(const InteractionResult&) { return false; } + + static bool HasHoverStateChanged( + const FieldStateType& before, + const FieldStateType& after) { + return before.hoveredTarget != after.hoveredTarget; + } }; template <> @@ -2461,6 +2482,7 @@ void PruneStateEntries( template bool HasMeaningfulResult( const typename Traits::InteractionResult& result, + const typename Traits::FieldStateType& previousFieldState, const typename Traits::InteractionState& interactionState, bool hadFocus, bool hadEditing) { @@ -2473,6 +2495,9 @@ bool HasMeaningfulResult( result.editCommitted || result.editCommitRejected || result.editCanceled || + Traits::HasHoverStateChanged( + previousFieldState, + Traits::FieldState(interactionState)) || result.hitTarget.kind != Traits::kNoneHitTargetKind || hadFocus || hadEditing || @@ -2533,6 +2558,8 @@ bool ProcessVectorFieldEventImpl( BuildInteractionState(state, field.fieldId); const bool hadFocus = Traits::FieldState(vectorState).focused; const bool hadEditing = Traits::FieldState(vectorState).editing; + const typename Traits::FieldStateType previousFieldState = + Traits::FieldState(vectorState); typename Traits::Spec spec = Traits::BuildSpec(field); const typename Traits::InteractionFrame frame = Traits::Update( @@ -2544,6 +2571,7 @@ bool ProcessVectorFieldEventImpl( if (!HasMeaningfulResult( frame.result, + previousFieldState, vectorState, hadFocus, hadEditing)) { @@ -2651,6 +2679,7 @@ struct Vector2Traits { using InteractionFrame = UIEditorVector2FieldInteractionFrame; using Metrics = Widgets::UIEditorVector2FieldMetrics; using Spec = Widgets::UIEditorVector2FieldSpec; + using FieldStateType = Widgets::UIEditorVector2FieldState; static constexpr UIEditorPropertyGridFieldKind kFieldKind = UIEditorPropertyGridFieldKind::Vector2; @@ -2698,6 +2727,13 @@ struct Vector2Traits { inputEvents, metrics); } + + static bool HasHoverStateChanged( + const FieldStateType& before, + const FieldStateType& after) { + return before.hoveredTarget != after.hoveredTarget || + before.hoveredComponentIndex != after.hoveredComponentIndex; + } }; struct Vector3Traits { @@ -2707,6 +2743,7 @@ struct Vector3Traits { using InteractionFrame = UIEditorVector3FieldInteractionFrame; using Metrics = Widgets::UIEditorVector3FieldMetrics; using Spec = Widgets::UIEditorVector3FieldSpec; + using FieldStateType = Widgets::UIEditorVector3FieldState; static constexpr UIEditorPropertyGridFieldKind kFieldKind = UIEditorPropertyGridFieldKind::Vector3; @@ -2754,6 +2791,13 @@ struct Vector3Traits { inputEvents, metrics); } + + static bool HasHoverStateChanged( + const FieldStateType& before, + const FieldStateType& after) { + return before.hoveredTarget != after.hoveredTarget || + before.hoveredComponentIndex != after.hoveredComponentIndex; + } }; struct Vector4Traits { @@ -2763,6 +2807,7 @@ struct Vector4Traits { using InteractionFrame = UIEditorVector4FieldInteractionFrame; using Metrics = Widgets::UIEditorVector4FieldMetrics; using Spec = Widgets::UIEditorVector4FieldSpec; + using FieldStateType = Widgets::UIEditorVector4FieldState; static constexpr UIEditorPropertyGridFieldKind kFieldKind = UIEditorPropertyGridFieldKind::Vector4; @@ -2810,6 +2855,13 @@ struct Vector4Traits { inputEvents, metrics); } + + static bool HasHoverStateChanged( + const FieldStateType& before, + const FieldStateType& after) { + return before.hoveredTarget != after.hoveredTarget || + before.hoveredComponentIndex != after.hoveredComponentIndex; + } }; template <> diff --git a/new_editor/src/Fields/UIEditorTextField.cpp b/new_editor/src/Fields/UIEditorTextField.cpp index 253fde4c..8dbeac48 100644 --- a/new_editor/src/Fields/UIEditorTextField.cpp +++ b/new_editor/src/Fields/UIEditorTextField.cpp @@ -117,6 +117,7 @@ UIEditorTextFieldLayout BuildUIEditorTextFieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorVector2Field.cpp b/new_editor/src/Fields/UIEditorVector2Field.cpp index 68fa8204..f97accba 100644 --- a/new_editor/src/Fields/UIEditorVector2Field.cpp +++ b/new_editor/src/Fields/UIEditorVector2Field.cpp @@ -200,6 +200,7 @@ UIEditorVector2FieldLayout BuildUIEditorVector2FieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorVector3Field.cpp b/new_editor/src/Fields/UIEditorVector3Field.cpp index a804cd5c..7756786b 100644 --- a/new_editor/src/Fields/UIEditorVector3Field.cpp +++ b/new_editor/src/Fields/UIEditorVector3Field.cpp @@ -203,6 +203,7 @@ UIEditorVector3FieldLayout BuildUIEditorVector3FieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Fields/UIEditorVector4Field.cpp b/new_editor/src/Fields/UIEditorVector4Field.cpp index 21e0731d..9c4f8eea 100644 --- a/new_editor/src/Fields/UIEditorVector4Field.cpp +++ b/new_editor/src/Fields/UIEditorVector4Field.cpp @@ -206,6 +206,7 @@ UIEditorVector4FieldLayout BuildUIEditorVector4FieldLayout( resolvedMetrics.horizontalPadding, resolvedMetrics.labelControlGap, resolvedMetrics.controlColumnStart, + resolvedMetrics.sharedControlColumnMinWidth, resolvedMetrics.controlTrailingInset, resolvedMetrics.controlInsetY, }); diff --git a/new_editor/src/Widgets/UIEditorFieldRowLayout.cpp b/new_editor/src/Widgets/UIEditorFieldRowLayout.cpp index 03fc8afc..f0b3c846 100644 --- a/new_editor/src/Widgets/UIEditorFieldRowLayout.cpp +++ b/new_editor/src/Widgets/UIEditorFieldRowLayout.cpp @@ -74,26 +74,36 @@ UIEditorFieldRowLayout BuildUIEditorFieldRowLayout( const float rowHeight = bounds.height > 0.0f ? bounds.height : metrics.rowHeight; const ::XCEngine::UI::UIRect rowBounds(bounds.x, bounds.y, bounds.width, rowHeight); - const float resolvedMinimumControlWidth = - ClampNonNegative((std::min)(minimumControlWidth, rowBounds.width)); - const float preferredControlX = rowBounds.x + metrics.controlColumnStart; - const float maximumControlX = - rowBounds.x + rowBounds.width - metrics.controlTrailingInset - resolvedMinimumControlWidth; + const float horizontalPadding = ClampNonNegative(metrics.horizontalPadding); + const float trailingInset = ClampNonNegative(metrics.controlTrailingInset); + const float defaultGap = ClampNonNegative(metrics.labelControlGap); + const float contentLeft = rowBounds.x + horizontalPadding; + const float contentRight = + rowBounds.x + ClampNonNegative(rowBounds.width) - trailingInset; + const float contentWidth = ClampNonNegative(contentRight - contentLeft); + const float requestedReservedControlWidth = ClampNonNegative( + metrics.sharedControlColumnMinWidth > 0.0f + ? metrics.sharedControlColumnMinWidth + : minimumControlWidth); + const float reservedControlWidth = + ClampNonNegative((std::min)(requestedReservedControlWidth, contentWidth)); + const float effectiveGap = + (std::min)(defaultGap, ClampNonNegative(contentWidth - reservedControlWidth)); + const float preferredControlX = + (std::clamp)(rowBounds.x + metrics.controlColumnStart, contentLeft, contentRight); + const float maximumControlX = contentRight - reservedControlWidth; const float controlX = - (std::clamp)( - (std::min)(preferredControlX, maximumControlX), - rowBounds.x, - rowBounds.x + rowBounds.width - metrics.controlTrailingInset); + (std::clamp)((std::min)(preferredControlX, maximumControlX), contentLeft, contentRight); const float controlInsetY = (std::min)(metrics.controlInsetY, rowBounds.height * 0.25f); const float controlWidth = - ClampNonNegative(rowBounds.x + rowBounds.width - metrics.controlTrailingInset - controlX); + ClampNonNegative(contentRight - controlX); UIEditorFieldRowLayout layout = {}; layout.bounds = rowBounds; layout.labelRect = ::XCEngine::UI::UIRect( - rowBounds.x + metrics.horizontalPadding, + contentLeft, rowBounds.y, - ClampNonNegative(controlX - metrics.labelControlGap - rowBounds.x - metrics.horizontalPadding), + ClampNonNegative(controlX - effectiveGap - contentLeft), rowBounds.height); layout.controlRect = ::XCEngine::UI::UIRect( controlX,