// Copyright Epic Games, Inc. All Rights Reserved. #include "UIComponentUtils.h" #include "Blueprint/UserWidget.h" #include "ClassViewerModule.h" #include "CoreGlobals.h" #include "UIComponentWidgetBlueprintExtension.h" #include "Extensions/UIComponent.h" #include "WidgetBlueprintEditor.h" #include "Extensions/UIComponentUserWidgetExtension.h" #include "Kismet2/BlueprintEditorUtils.h" #include "ScopedTransaction.h" #define LOCTEXT_NAMESPACE "UMG" FClassViewerInitializationOptions FUIComponentUtils::CreateClassViewerInitializationOptions() { FClassViewerInitializationOptions Options; Options.Mode = EClassViewerMode::ClassPicker; TSharedPtr Filter = MakeShared(); Options.ClassFilters.Add(Filter.ToSharedRef()); Filter->DisallowedClassFlags = CLASS_Deprecated | CLASS_NewerVersionExists | CLASS_HideDropDown | CLASS_Abstract; Filter->AllowedChildrenOfClasses.Add(UUIComponent::StaticClass()); return Options; } void FUIComponentUtils::OnWidgetRenamed(const TSharedRef& BlueprintEditor, UWidgetBlueprint* WidgetBlueprint, const FName& OldVarName, const FName& NewVarName) { // On a Widget rename in the Editor we update the Widget names in UI Components extensions if (UUIComponentWidgetBlueprintExtension* Extension = UWidgetBlueprintExtension::GetExtension(WidgetBlueprint)) { Extension->RenameWidget(OldVarName, NewVarName); } if (const UUserWidget* PreviewWidget = BlueprintEditor->GetPreview()) { if(UUIComponentUserWidgetExtension* UserWidgetExtension = PreviewWidget->GetExtension()) { UserWidgetExtension->RenameWidget(OldVarName, NewVarName); } } } void FUIComponentUtils::AddComponent(const TSharedRef& BlueprintEditor, const UClass* ComponentClass, const FName WidgetName) { UWidgetBlueprint* WidgetBlueprint = BlueprintEditor->GetWidgetBlueprintObj(); const FScopedTransaction Transaction(LOCTEXT("AddComponent", "Add Component")); if (UUIComponentWidgetBlueprintExtension* WidgetBlueprintExtension = UUIComponentWidgetBlueprintExtension::RequestExtension(WidgetBlueprint)) { UUIComponent* ComponentArchetype = WidgetBlueprintExtension->AddComponent(ComponentClass, WidgetName); UUserWidget* PreviewWidget = BlueprintEditor->GetPreview(); if (ComponentArchetype && PreviewWidget) { // If the extension do not exist, we create it which will create a copy of the component we just added. if (UUIComponentUserWidgetExtension* UserWidgetExtension = WidgetBlueprintExtension->GetOrCreateExtension(PreviewWidget)) { UserWidgetExtension->CreateAndAddComponent(ComponentArchetype, WidgetName); } } FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(WidgetBlueprint); } } void FUIComponentUtils::RemoveComponent(const TSharedRef& BlueprintEditor, const UClass* ComponentClass, const FName WidgetName) { UWidgetBlueprint* WidgetBlueprint = BlueprintEditor->GetWidgetBlueprintObj(); const FScopedTransaction Transaction(LOCTEXT("RemoveComponent", "Remove Component")); if (UUIComponentWidgetBlueprintExtension* WidgetBlueprintExtension = UWidgetBlueprintExtension::GetExtension(WidgetBlueprint)) { WidgetBlueprintExtension->RemoveComponent(ComponentClass, WidgetName); // Also Remove it from the Preview if (const UUserWidget* PreviewWidget = BlueprintEditor->GetPreview()) { if (UUIComponentUserWidgetExtension* UserWidgetExtension = PreviewWidget->GetExtension()) { UserWidgetExtension->RemoveComponent(ComponentClass, WidgetName); } } FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(WidgetBlueprint); } } bool FUIComponentUtils::FUIComponentClassFilter::IsClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const UClass* InClass, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs) { return !InClass->HasAnyClassFlags(DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed; } bool FUIComponentUtils::FUIComponentClassFilter::IsUnloadedClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const TSharedRef< const IUnloadedBlueprintData > InUnloadedClassData, TSharedRef< FClassViewerFilterFuncs > InFilterFuncs) { return !InUnloadedClassData->HasAnyClassFlags(DisallowedClassFlags) && InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed; } #undef LOCTEXT_NAMESPACE