void UCanvasPanelSlot::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) { SynchronizeProperties(); static FName AnchorsProperty(TEXT("Anchors")); FEditPropertyChain::TDoubleLinkedListNode* AnchorNode = PropertyChangedEvent.PropertyChain.GetHead()->GetNextNode(); if ( !AnchorNode ) { return; } FEditPropertyChain::TDoubleLinkedListNode* LayoutDataNode = AnchorNode->GetNextNode(); if ( !LayoutDataNode ) { return; } UProperty* AnchorProperty = LayoutDataNode->GetValue(); if ( AnchorProperty && AnchorProperty->GetFName() == AnchorsProperty ) { RebaseLayout(); } Super::PostEditChangeProperty(PropertyChangedEvent); }
void USizeBoxSlot::BuildSlot(TSharedRef<SBox> InSizeBox) { SizeBox = InSizeBox; SynchronizeProperties(); SizeBox->SetContent(Content ? Content->TakeWidget() : SNullWidget::NullWidget); }
void UCanvasPanelSlot::BuildSlot(TSharedRef<SConstraintCanvas> Canvas) { Slot = &Canvas->AddSlot() [ Content == nullptr ? SNullWidget::NullWidget : Content->TakeWidget() ]; SynchronizeProperties(); }
/** * Synchronizes a DFM tree with a VMT tree. * @param dfmres DFM tree. * @param vmtdir VMT tree. **/ void synchronize(DFMData& dfmres, const VMTDir& vmtdir) { std::vector<std::string*> objectnames; std::deque<DFMResource*> dfms; fill(dfmres, dfms); std::for_each(dfms.begin(), dfms.end(), SynchronizeName(vmtdir)); std::for_each(dfms.begin(), dfms.end(), SynchronizeClassName(vmtdir)); std::for_each(dfms.begin(), dfms.end(), SynchronizeProperties(vmtdir, dfmres)); }
void UCanvasPanelSlot::RebaseLayout(bool PreserveSize) { // Ensure we have a parent canvas if ( UCanvasPanel* Canvas = Cast<UCanvasPanel>(Parent) ) { FGeometry Geometry; if ( Canvas->GetGeometryForSlot(this, Geometry) ) { // Calculate the default anchor offset, ie where would this control be laid out if no offset were provided. FVector2D CanvasSize = Canvas->GetCanvasWidget()->GetCachedGeometry().Size; FMargin AnchorPositions = FMargin( LayoutData.Anchors.Minimum.X * CanvasSize.X, LayoutData.Anchors.Minimum.Y * CanvasSize.Y, LayoutData.Anchors.Maximum.X * CanvasSize.X, LayoutData.Anchors.Maximum.Y * CanvasSize.Y); FVector2D DefaultAnchorPosition = FVector2D(AnchorPositions.Left, AnchorPositions.Top); // Determine the amount that would be offset from the anchor position if alignment was applied. FVector2D AlignmentOffset = LayoutData.Alignment * PreEditGeometry.Size; FVector2D MoveDelta = Geometry.Position - PreEditGeometry.Position; // Determine where the widget's new position needs to be to maintain a stable location when the anchors change. FVector2D LeftTopDelta = PreEditGeometry.Position - DefaultAnchorPosition; const bool bAnchorsMoved = PreEditLayoutData.Anchors.Minimum != LayoutData.Anchors.Minimum || PreEditLayoutData.Anchors.Maximum != LayoutData.Anchors.Maximum; const bool bMoved = PreEditLayoutData.Offsets.Left != LayoutData.Offsets.Left || PreEditLayoutData.Offsets.Top != LayoutData.Offsets.Top; if ( bAnchorsMoved ) { // Adjust the size to remain constant if ( !LayoutData.Anchors.IsStretchedHorizontal() && PreEditLayoutData.Anchors.IsStretchedHorizontal() ) { // Adjust the position to remain constant LayoutData.Offsets.Left = LeftTopDelta.X + AlignmentOffset.X; LayoutData.Offsets.Right = PreEditGeometry.Size.X; } else if ( !PreserveSize && LayoutData.Anchors.IsStretchedHorizontal() && !PreEditLayoutData.Anchors.IsStretchedHorizontal() ) { // Adjust the position to remain constant LayoutData.Offsets.Left = 0; LayoutData.Offsets.Right = 0; } else if ( LayoutData.Anchors.IsStretchedHorizontal() ) { // Adjust the position to remain constant LayoutData.Offsets.Left = LeftTopDelta.X; LayoutData.Offsets.Right = AnchorPositions.Right - ( AnchorPositions.Left + LayoutData.Offsets.Left + PreEditGeometry.Size.X ); } else { // Adjust the position to remain constant LayoutData.Offsets.Left = LeftTopDelta.X + AlignmentOffset.X; } if ( !LayoutData.Anchors.IsStretchedVertical() && PreEditLayoutData.Anchors.IsStretchedVertical() ) { // Adjust the position to remain constant LayoutData.Offsets.Top = LeftTopDelta.Y + AlignmentOffset.Y; LayoutData.Offsets.Bottom = PreEditGeometry.Size.Y; } else if ( !PreserveSize && LayoutData.Anchors.IsStretchedVertical() && !PreEditLayoutData.Anchors.IsStretchedVertical() ) { // Adjust the position to remain constant LayoutData.Offsets.Top = 0; LayoutData.Offsets.Bottom = 0; } else if ( LayoutData.Anchors.IsStretchedVertical() ) { // Adjust the position to remain constant LayoutData.Offsets.Top = LeftTopDelta.Y; LayoutData.Offsets.Bottom = AnchorPositions.Bottom - ( AnchorPositions.Top + LayoutData.Offsets.Top + PreEditGeometry.Size.Y ); } else { // Adjust the position to remain constant LayoutData.Offsets.Top = LeftTopDelta.Y + AlignmentOffset.Y; } } else if ( DesiredPosition.IsSet() ) { FVector2D NewLocalPosition = DesiredPosition.GetValue(); LayoutData.Offsets.Left = NewLocalPosition.X - AnchorPositions.Left; LayoutData.Offsets.Top = NewLocalPosition.Y - AnchorPositions.Top; if ( LayoutData.Anchors.IsStretchedHorizontal() ) { LayoutData.Offsets.Right -= LayoutData.Offsets.Left - PreEditLayoutData.Offsets.Left; } else { LayoutData.Offsets.Left += AlignmentOffset.X; } if ( LayoutData.Anchors.IsStretchedVertical() ) { LayoutData.Offsets.Bottom -= LayoutData.Offsets.Top - PreEditLayoutData.Offsets.Top; } else { LayoutData.Offsets.Top += AlignmentOffset.Y; } DesiredPosition.Reset(); } else if ( bMoved ) { //LayoutData.Offsets.Left += LeftTopDelta.X; //LayoutData.Offsets.Top += LeftTopDelta.Y; LayoutData.Offsets.Left -= DefaultAnchorPosition.X; LayoutData.Offsets.Top -= DefaultAnchorPosition.Y; // If the slot is stretched horizontally we need to move the right side as it no longer represents width, but // now represents margin from the right stretched side. if ( LayoutData.Anchors.IsStretchedHorizontal() ) { //LayoutData.Offsets.Right = PreEditLayoutData.Offsets.Top; } else { LayoutData.Offsets.Left += AlignmentOffset.X; } // If the slot is stretched vertically we need to move the bottom side as it no longer represents width, but // now represents margin from the bottom stretched side. if ( LayoutData.Anchors.IsStretchedVertical() ) { //LayoutData.Offsets.Bottom -= MoveDelta.Y; } else { LayoutData.Offsets.Top += AlignmentOffset.Y; } } } // Apply the changes to the properties. SynchronizeProperties(); } }