/** * Called to recompile the out of date blueprint for the current selection set */ void RecompileOutOfDateKismetForSelection() { int32 BlueprintFailures = 0; // Run thru all selected actors, looking for out of date blueprints FSelectionIterator SelectedActorItr( GEditor->GetSelectedActorIterator() ); for ( ; SelectedActorItr; ++SelectedActorItr) { AActor* CurrentActor = Cast<AActor>(*SelectedActorItr); UBlueprint* Blueprint = Cast<UBlueprint>(CurrentActor->GetClass()->ClassGeneratedBy); if ((Blueprint != NULL) && (!Blueprint->IsUpToDate())) { FKismetEditorUtilities::CompileBlueprint(Blueprint); if (Blueprint->Status == BS_Error) { ++BlueprintFailures; } } } if (BlueprintFailures) { UE_LOG(LogViewportBlueprintMenu, Warning, TEXT("%d blueprints failed to be recompiled"), BlueprintFailures); } }
/** * Fills the Blueprint menu with extra options */ void FillBlueprintOptions(FMenuBuilder& MenuBuilder, TArray<AActor*> SelectedActors) { // Gather Blueprint classes for this actor TArray< FMenuBlueprintClass > BlueprintClasses; GatherBlueprintsForActors( SelectedActors, BlueprintClasses ); MenuBuilder.BeginSection("ActorBlueprint", LOCTEXT("BlueprintsHeading", "Blueprints") ); // Adds the "Create Blueprint..." menu option if valid. { int NumBlueprintableActors = 0; bool IsBlueprintBased = BlueprintClasses.Num() > 1; if(!BlueprintClasses.Num()) { for(auto It(SelectedActors.CreateIterator());It;++It) { AActor* Actor = *It; if( FKismetEditorUtilities::CanCreateBlueprintOfClass(Actor->GetClass())) { NumBlueprintableActors++; } } } const bool bCanHarvestComponentsForBlueprint = (!IsBlueprintBased && (NumBlueprintableActors > 0)); if(bCanHarvestComponentsForBlueprint) { AActor* ActorOverride = nullptr; FUIAction CreateBlueprintAction( FExecuteAction::CreateStatic( &FCreateBlueprintFromActorDialog::OpenDialog, true, ActorOverride ) ); MenuBuilder.AddMenuEntry(LOCTEXT("CreateBlueprint", "Create Blueprint..."), LOCTEXT("CreateBlueprint_Tooltip", "Harvest Components from Selected Actors and create Blueprint"), FSlateIcon(FEditorStyle::GetStyleSetName(), "Kismet.HarvestBlueprintFromActors"), CreateBlueprintAction); } } // Check to see if we have any classes with functions to display if( BlueprintClasses.Num() > 0 ) { { UBlueprint* FirstBlueprint = Cast<UBlueprint>(BlueprintClasses[0].Blueprint.Get()); // Determine if the selected objects that have blueprints are all of the same class, and if they are all up to date bool bAllAreSameType = true; bool bAreAnyNotUpToDate = false; for (int32 ClassIndex = 0; ClassIndex < BlueprintClasses.Num(); ++ClassIndex) { UBlueprint* CurrentBlueprint = Cast<UBlueprint>(BlueprintClasses[ClassIndex].Blueprint.Get()); bAllAreSameType = bAllAreSameType && (CurrentBlueprint == FirstBlueprint); if (CurrentBlueprint != NULL) { bAreAnyNotUpToDate |= !CurrentBlueprint->IsUpToDate(); } } // For a single selected class, we show a top level item (saves 2 clicks); otherwise we show the full hierarchy if (bAllAreSameType && (FirstBlueprint != NULL)) { // Shortcut to edit the blueprint directly, saves two clicks FUIAction UIAction; UIAction.ExecuteAction.BindStatic( &EditKismetCodeFor, /*Blueprint=*/ TWeakObjectPtr<UBlueprint>(FirstBlueprint) ); const FText Label = LOCTEXT("EditBlueprint", "Edit Blueprint"); const FText Description = FText::Format( LOCTEXT("EditBlueprint_ToolTip", "Opens {0} in the Blueprint editor"), FText::FromString( FirstBlueprint->GetName() ) ); MenuBuilder.AddMenuEntry( Label, Description, FSlateIcon(), UIAction ); } else { // More than one type of blueprint is selected, so add a sub-menu for "Edit Kismet Code" MenuBuilder.AddSubMenu( LOCTEXT("EditBlueprintSubMenu", "Edit Blueprint"), LOCTEXT("EditBlueprintSubMenu_ToolTip", "Shows Blueprints that can be opened for editing"), FNewMenuDelegate::CreateStatic( &FillEditCodeMenu, BlueprintClasses ) ); } // For any that aren't up to date, we offer a compile blueprints button if (bAreAnyNotUpToDate) { // Shortcut to edit the blueprint directly, saves two clicks FUIAction UIAction; UIAction.ExecuteAction.BindStatic(&RecompileOutOfDateKismetForSelection); const FText Label = LOCTEXT("CompileOutOfDateBPs", "Compile Out-of-Date Blueprints"); const FText Description = LOCTEXT("CompileOutOfDateBPs_ToolTip", "Compiles out-of-date blueprints for selected actors"); MenuBuilder.AddMenuEntry( Label, Description, FSlateIcon(), UIAction ); } } } MenuBuilder.EndSection(); }