void FWidgetBlueprintEditor::UpdatePreview(UBlueprint* InBlueprint, bool bInForceFullUpdate) { UUserWidget* PreviewActor = GetPreview(); // Signal that we're going to be constructing editor components if ( InBlueprint != nullptr && InBlueprint->SimpleConstructionScript != nullptr ) { InBlueprint->SimpleConstructionScript->BeginEditorComponentConstruction(); } // If the Blueprint is changing if ( InBlueprint != PreviewBlueprint || bInForceFullUpdate ) { // Destroy the previous actor instance DestroyPreview(); // Save the Blueprint we're creating a preview for PreviewBlueprint = Cast<UWidgetBlueprint>(InBlueprint); // Update the generated class'es widget tree to match the blueprint tree. That way the preview can update // without needing to do a full recompile. Cast<UWidgetBlueprintGeneratedClass>(PreviewBlueprint->GeneratedClass)->DesignerWidgetTree = DuplicateObject<UWidgetTree>(PreviewBlueprint->WidgetTree, PreviewBlueprint->GeneratedClass); PreviewActor = CreateWidget<UUserWidget>(PreviewScene.GetWorld(), PreviewBlueprint->GeneratedClass); PreviewActor->SetFlags(RF_Transactional); // Configure all the widgets to be set to design time. PreviewActor->SetDesignerFlags(GetCurrentDesignerFlags()); // Store a reference to the preview actor. PreviewWidgetPtr = PreviewActor; } OnWidgetPreviewUpdated.Broadcast(); }
void FWidgetBlueprintEditor::MigrateFromChain(FEditPropertyChain* PropertyThatChanged, bool bIsModify) { UWidgetBlueprint* Blueprint = GetWidgetBlueprintObj(); UUserWidget* PreviewActor = GetPreview(); if ( PreviewActor != nullptr ) { for ( FWidgetReference& WidgetRef : SelectedWidgets ) { UWidget* PreviewWidget = WidgetRef.GetPreview(); if ( PreviewWidget ) { FName PreviewWidgetName = PreviewWidget->GetFName(); UWidget* TemplateWidget = Blueprint->WidgetTree->FindWidget(PreviewWidgetName); if ( TemplateWidget ) { FEditPropertyChain::TDoubleLinkedListNode* PropertyChainNode = PropertyThatChanged->GetHead(); MigratePropertyValue(PreviewWidget, TemplateWidget, PropertyChainNode, PropertyChainNode->GetValue(), bIsModify); } } } } }
void FWidgetBlueprintEditor::AddReferencedObjects( FReferenceCollector& Collector ) { FBlueprintEditor::AddReferencedObjects( Collector ); UUserWidget* Preview = GetPreview(); Collector.AddReferencedObject( Preview ); }
bool FWidgetReference::IsValid() const { if ( TemplateHandle.IsValid() ) { return TemplateHandle->Widget.Get() != NULL && GetPreview(); } return false; }
void FWidgetBlueprintEditor::DestroyPreview() { UUserWidget* PreviewActor = GetPreview(); if ( PreviewActor != nullptr ) { check(PreviewScene.GetWorld()); PreviewActor->MarkPendingKill(); } }
FWidgetReference FWidgetBlueprintEditor::GetReferenceFromPreview(UWidget* PreviewWidget) { UUserWidget* PreviewRoot = GetPreview(); if ( PreviewRoot ) { UWidgetBlueprint* Blueprint = GetWidgetBlueprintObj(); if ( PreviewWidget ) { FName Name = PreviewWidget->GetFName(); return GetReferenceFromTemplate(Blueprint->WidgetTree->FindWidget(Name)); } } return FWidgetReference(SharedThis(this), TSharedPtr<FWidgetHandle>()); }
TSharedRef<SWidget> FWidgetBlueprintEditor::OnGetAnimationAddMenuContent(TSharedRef<ISequencer> InSequencer) { TArray<FObjectAndDisplayName> BindableObjects; { GetBindableObjects(GetPreview()->GetRootWidget(), BindableObjects); BindableObjects.Sort(); } FMenuBuilder AddMenuBuilder(true, nullptr); for (FObjectAndDisplayName& BindableObject : BindableObjects) { FGuid BoundObjectGuid = SequencerObjectBindingManager->FindGuidForObject(*InSequencer->GetFocusedMovieScene(), *BindableObject.Object); if (!BoundObjectGuid.IsValid()) { FUIAction AddMenuAction(FExecuteAction::CreateSP(this, &FWidgetBlueprintEditor::AddObjectToAnimation, BindableObject.Object)); AddMenuBuilder.AddMenuEntry(BindableObject.DisplayName, FText(), FSlateIcon(), AddMenuAction); } } return AddMenuBuilder.MakeWidget(); }