TSharedRef<SWidget> UPropertyEditor::RebuildWidget() { if (IsDesignTime()) { return BuildDesignTimeWidget(SNew(SBox) .HAlign(HAlign_Center) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(LOCTEXT("PropertyEditor", "PropertyEditor")) ]); } else { FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); FDetailsViewArgs DetailsViewArgs(/*bUpdateFromSelection=*/ false, /*bLockable=*/ false, /*bAllowSearch=*/ false, /*InNameAreaSettings=*/ FDetailsViewArgs::HideNameArea, /*bHideSelectionTip=*/ true); View = EditModule.CreateDetailView(DetailsViewArgs); if (ObjectToInspect.IsValid()) { View->SetObject(ObjectToInspect.Get()); } View->OnFinishedChangingProperties().AddUObject(this, &UPropertyEditor::OnFinishedChangingProperties); return View.ToSharedRef(); } }
void SFacialAnimationBulkImporter::Construct(const FArguments& InArgs) { FDetailsViewArgs DetailsViewArgs(false, false, true, FDetailsViewArgs::HideNameArea); FPropertyEditorModule& PropertyEditorModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); TSharedRef<IDetailsView> DetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs); DetailsView->SetObject(GetMutableDefault<UFacialAnimationBulkImporterSettings>()); ChildSlot [ SNew(SVerticalBox) +SVerticalBox::Slot() .FillHeight(1.0f) [ DetailsView ] +SVerticalBox::Slot() .AutoHeight() .HAlign(HAlign_Right) .Padding(4.0f) [ SNew(SButton) .ButtonStyle(FEditorStyle::Get(), "FlatButton.Success") .ForegroundColor(FLinearColor::White) .ContentPadding(FMargin(6, 2)) .IsEnabled(this, &SFacialAnimationBulkImporter::IsImportButtonEnabled) .OnClicked(this, &SFacialAnimationBulkImporter::HandleImportClicked) [ SNew(STextBlock) .TextStyle(FEditorStyle::Get(), "ContentBrowser.TopBar.Font") .Text(LOCTEXT("ImportAllButton", "Import All")) ] ] ]; }
void SSingleObjectDetailsPanel::Construct(const FArguments& InArgs, bool bAutomaticallyObserveViaGetObjectToObserve) { // Create a property view FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); FDetailsViewArgs DetailsViewArgs(/*bUpdateFromSelection=*/ false, /*bLockable=*/ false, /*bAllowSearch=*/ false, /*bObjectsUseNameArea=*/ true, /*bHideSelectionTip=*/ true); DetailsViewArgs.bHideActorNameArea = true; PropertyView = EditModule.CreateDetailView(DetailsViewArgs); bAutoObserveObject = bAutomaticallyObserveViaGetObjectToObserve; // Create the border that all of the content will get stuffed into ChildSlot [ SNew(SVerticalBox) +SVerticalBox::Slot() .FillHeight(1.0f) .Padding( 3.0f, 2.0f ) [ PopulateSlot(PropertyView.ToSharedRef()) ] ]; }
void SBehaviorTreeDiff::FBehaviorTreeDiffPanel::GeneratePanel(UEdGraph* Graph, UEdGraph* GraphToDiff) { TSharedPtr<SWidget> Widget = SNew(SBorder) .HAlign(HAlign_Center) .VAlign(VAlign_Center) [ SNew(STextBlock).Text( LOCTEXT("BTDifPanelNoGraphTip", "Graph does not exist in this revision")) ]; FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>( "PropertyEditor" ); FDetailsViewArgs DetailsViewArgs( false, false, true, FDetailsViewArgs::ObjectsUseNameArea, false ); DetailsViewArgs.DefaultsOnlyVisibility = FDetailsViewArgs::EEditDefaultsOnlyNodeVisibility::Hide; DetailsView = PropertyEditorModule.CreateDetailView( DetailsViewArgs ); DetailsView->SetObject( NULL ); DetailsView->SetIsPropertyEditingEnabledDelegate(FIsPropertyEditingEnabled::CreateRaw(this, &SBehaviorTreeDiff::FBehaviorTreeDiffPanel::IsPropertyEditable)); if(Graph) { SGraphEditor::FGraphEditorEvents InEvents; InEvents.OnSelectionChanged = SGraphEditor::FOnSelectionChanged::CreateRaw(this, &SBehaviorTreeDiff::FBehaviorTreeDiffPanel::OnSelectionChanged); FGraphAppearanceInfo AppearanceInfo; AppearanceInfo.CornerText = LOCTEXT("AppearanceCornerText_BehaviorDif", "DIFF"); if (!GraphEditorCommands.IsValid()) { GraphEditorCommands = MakeShareable(new FUICommandList()); GraphEditorCommands->MapAction(FGenericCommands::Get().Copy, FExecuteAction::CreateRaw(this, &FBehaviorTreeDiffPanel::CopySelectedNodes), FCanExecuteAction::CreateRaw(this, &FBehaviorTreeDiffPanel::CanCopyNodes)); } auto Editor = SNew(SGraphEditor) .AdditionalCommands(GraphEditorCommands) .GraphToEdit(Graph) .GraphToDiff(GraphToDiff) .IsEditable(false) .TitleBar(SNew(SBorder).HAlign(HAlign_Center) [ SNew(STextBlock).Text(GetTitle()) ]) .Appearance(AppearanceInfo) .GraphEvents(InEvents); const FSlateBrush* ContentAreaBrush = FEditorStyle::GetBrush( "Docking.Tab", ".ContentAreaBrush" ); auto NewWidget = SNew(SSplitter) .Orientation(Orient_Vertical) +SSplitter::Slot() .Value(0.8f) [ Editor ] +SSplitter::Slot() .Value(0.2f) [ SNew( SBorder ) .Visibility( EVisibility::Visible ) .BorderImage( ContentAreaBrush ) [ DetailsView.ToSharedRef() ] ]; GraphEditor = Editor; Widget = NewWidget; } GraphEditorBorder->SetContent(Widget.ToSharedRef()); }
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SLandscapeEditor::Construct(const FArguments& InArgs, TSharedRef<FLandscapeToolKit> InParentToolkit) { TSharedRef<FUICommandList> CommandList = InParentToolkit->GetToolkitCommands(); // Modes: FToolBarBuilder ModeSwitchButtons(CommandList, FMultiBoxCustomization::None); { ModeSwitchButtons.AddToolBarButton(FLandscapeEditorCommands::Get().ManageMode, NAME_None, LOCTEXT("Mode.Manage", "Manage"), LOCTEXT("Mode.Manage.Tooltip", "Contains tools to add a new landscape, import/export landscape, add/remove components and manage streaming")); ModeSwitchButtons.AddToolBarButton(FLandscapeEditorCommands::Get().SculptMode, NAME_None, LOCTEXT("Mode.Sculpt", "Sculpt"), LOCTEXT("Mode.Sculpt.Tooltip", "Contains tools that modify the shape of a landscape")); ModeSwitchButtons.AddToolBarButton(FLandscapeEditorCommands::Get().PaintMode, NAME_None, LOCTEXT("Mode.Paint", "Paint"), LOCTEXT("Mode.Paint.Tooltip", "Contains tools that paint materials on to a landscape")); } FPropertyEditorModule& PropertyEditorModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor"); FDetailsViewArgs DetailsViewArgs(false, false, false,FDetailsViewArgs::HideNameArea); DetailsPanel = PropertyEditorModule.CreateDetailView(DetailsViewArgs); DetailsPanel->SetIsPropertyVisibleDelegate(FIsPropertyVisible::CreateSP(this, &SLandscapeEditor::GetIsPropertyVisible)); FEdModeLandscape* LandscapeEdMode = GetEditorMode(); if (LandscapeEdMode) { DetailsPanel->SetObject(LandscapeEdMode->UISettings); } IIntroTutorials& IntroTutorials = FModuleManager::LoadModuleChecked<IIntroTutorials>(TEXT("IntroTutorials")); ChildSlot [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(0, 0, 0, 5) [ SAssignNew(Error, SErrorText) ] + SVerticalBox::Slot() .Padding(0) [ SNew(SVerticalBox) .IsEnabled(this, &SLandscapeEditor::GetLandscapeEditorIsEnabled) + SVerticalBox::Slot() .AutoHeight() .Padding(4, 0, 4, 5) [ SNew(SOverlay) + SOverlay::Slot() [ SNew(SBorder) .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) .HAlign(HAlign_Center) [ ModeSwitchButtons.MakeWidget() ] ] // Tutorial link + SOverlay::Slot() .HAlign(HAlign_Right) .VAlign(VAlign_Bottom) .Padding(4) [ IntroTutorials.CreateTutorialsWidget(TEXT("LandscapeMode")) ] ] + SVerticalBox::Slot() .Padding(0) [ DetailsPanel.ToSharedRef() ] ] ]; }
void SAnimationCompressionPanel::Construct(const FArguments& InArgs) { ParentWindow = InArgs._ParentWindow.Get(); AnimSequences = InArgs._AnimSequences; CompressionHolder = NewObject<UCompressionHolder>(); CompressionHolder->AddToRoot(); if (AnimSequences.Num() == 1) { UAnimSequence* Seq = AnimSequences[0].Get(); CompressionHolder->Compression = static_cast<UAnimCompress*>(StaticDuplicateObject(Seq->CompressionScheme, CompressionHolder)); } FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); const bool bAllowSearch = true; FDetailsViewArgs DetailsViewArgs(/*bUpdateFromSelection=*/ false, /*bLockable=*/ false, bAllowSearch, FDetailsViewArgs::HideNameArea, /*bHideSelectionTip=*/ true); TSharedPtr<class IDetailsView> PropertyView = EditModule.CreateDetailView(DetailsViewArgs); TArray<UObject*> SelectedObjects; SelectedObjects.Add(CompressionHolder); PropertyView->SetObjects(SelectedObjects); TSharedRef<SVerticalBox> Box = SNew(SVerticalBox) + SVerticalBox::Slot() .FillHeight(1.f) .Padding(8.0f, 4.0f, 8.0f, 4.0f) [ PropertyView.ToSharedRef() ] +SVerticalBox::Slot() .AutoHeight() .Padding(8.0f, 4.0f, 4.0f, 8.0f) [ SNew(SSeparator) ] +SVerticalBox::Slot() .Padding(4.0f) .HAlign(HAlign_Right) .VAlign(VAlign_Bottom) .AutoHeight() [ SNew(SUniformGridPanel) .SlotPadding(FEditorStyle::GetMargin("StandardDialog.SlotPadding")) .MinDesiredSlotWidth(FEditorStyle::GetFloat("StandardDialog.MinDesiredSlotWidth")) .MinDesiredSlotHeight(FEditorStyle::GetFloat("StandardDialog.MinDesiredSlotHeight")) + SUniformGridPanel::Slot(0, 0) [ SNew(SButton) .Text(LOCTEXT("AnimCompressionApply", "Apply")) .HAlign(HAlign_Center) .ContentPadding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) .OnClicked(this, &SAnimationCompressionPanel::ApplyClicked) ] ]; this->ChildSlot[Box]; }
void SPaperExtractSpritesDialog::Construct(const FArguments& InArgs, UTexture2D* InSourceTexture) { SourceTexture = InSourceTexture; ExtractSpriteSettings = NewObject<UPaperExtractSpritesSettings>(); ExtractSpriteSettings->GridWidth = InSourceTexture->GetSizeX(); ExtractSpriteSettings->GridHeight = InSourceTexture->GetSizeY(); PreviewExtractedSprites(); FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); FDetailsViewArgs DetailsViewArgs(/*bUpdateFromSelection=*/ false, /*bLockable=*/ false, /*bAllowSearch=*/ false, /*InNameAreaSettings=*/ FDetailsViewArgs::HideNameArea, /*bHideSelectionTip=*/ true); PropertyView = EditModule.CreateDetailView(DetailsViewArgs); PropertyView->SetObject(ExtractSpriteSettings); PropertyView->OnFinishedChangingProperties().AddSP(this, &SPaperExtractSpritesDialog::OnFinishedChangingProperties); TSharedRef<SPaperExtractSpritesViewport> Viewport = SNew(SPaperExtractSpritesViewport, SourceTexture, ExtractedSprites, ExtractSpriteSettings, this); ChildSlot [ SNew(SBorder) .BorderImage(FEditorStyle::GetBrush("DetailsView.CategoryTop")) .Padding(FMargin(0.0f, 3.0f, 1.0f, 0.0f)) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(1.0f) [ Viewport ] + SHorizontalBox::Slot() .AutoWidth() [ SNew(SVerticalBox) + SVerticalBox::Slot() .Padding(2.0f) [ PropertyView.ToSharedRef() ] + SVerticalBox::Slot() .FillHeight(1.0f) + SVerticalBox::Slot() .Padding(2.0f) .AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(LOCTEXT("PaperExtractSpritesExtractButton", "Extract...")) .OnClicked(this, &SPaperExtractSpritesDialog::ExtractClicked) ] + SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(LOCTEXT("PaperExtractSpritesCancelButton", "Cancel")) .OnClicked(this, &SPaperExtractSpritesDialog::CancelClicked) ] ] ] ] ]; }
void SKismetInspector::Construct(const FArguments& InArgs) { bShowInspectorPropertyView = true; PublicViewState = ECheckBoxState::Unchecked; bComponenetDetailsCustomizationEnabled = false; bRefreshOnTick = false; BlueprintEditorPtr = InArgs._Kismet2; bShowPublicView = InArgs._ShowPublicViewControl; bShowTitleArea = InArgs._ShowTitleArea; TSharedPtr<FBlueprintEditor> Kismet2 = BlueprintEditorPtr.Pin(); // Create a property view FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); FNotifyHook* NotifyHook = NULL; if(InArgs._SetNotifyHook) { NotifyHook = Kismet2.Get(); } FDetailsViewArgs::ENameAreaSettings NameAreaSettings = InArgs._HideNameArea ? FDetailsViewArgs::HideNameArea : FDetailsViewArgs::ObjectsUseNameArea; FDetailsViewArgs DetailsViewArgs( /*bUpdateFromSelection=*/ false, /*bLockable=*/ false, /*bAllowSearch=*/ true, NameAreaSettings, /*bHideSelectionTip=*/ true, /*InNotifyHook=*/ NotifyHook, /*InSearchInitialKeyFocus=*/ false, /*InViewIdentifier=*/ InArgs._ViewIdentifier ); PropertyView = EditModule.CreateDetailView( DetailsViewArgs ); //@TODO: .IsEnabled( FSlateApplication::Get().GetNormalExecutionAttribute() ); PropertyView->SetIsPropertyVisibleDelegate( FIsPropertyVisible::CreateSP(this, &SKismetInspector::IsPropertyVisible) ); PropertyView->SetIsPropertyEditingEnabledDelegate(InArgs._IsPropertyEditingEnabledDelegate); UserOnFinishedChangingProperties = InArgs._OnFinishedChangingProperties; TWeakPtr<SMyBlueprint> MyBlueprint = Kismet2.IsValid() ? Kismet2->GetMyBlueprintWidget() : InArgs._MyBlueprintWidget; if( MyBlueprint.IsValid() ) { FOnGetDetailCustomizationInstance LayoutDelegateDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintDelegateActionDetails::MakeInstance, MyBlueprint); PropertyView->RegisterInstancedCustomPropertyLayout(UMulticastDelegateProperty::StaticClass(), LayoutDelegateDetails); // Register function and variable details customization FOnGetDetailCustomizationInstance LayoutGraphDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintGraphActionDetails::MakeInstance, MyBlueprint); PropertyView->RegisterInstancedCustomPropertyLayout(UEdGraph::StaticClass(), LayoutGraphDetails); PropertyView->RegisterInstancedCustomPropertyLayout(UK2Node_EditablePinBase::StaticClass(), LayoutGraphDetails); PropertyView->RegisterInstancedCustomPropertyLayout(UK2Node_CallFunction::StaticClass(), LayoutGraphDetails); FOnGetDetailCustomizationInstance LayoutVariableDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintVarActionDetails::MakeInstance, MyBlueprint); PropertyView->RegisterInstancedCustomPropertyLayout(UProperty::StaticClass(), LayoutVariableDetails); PropertyView->RegisterInstancedCustomPropertyLayout(UK2Node_VariableGet::StaticClass(), LayoutVariableDetails); PropertyView->RegisterInstancedCustomPropertyLayout(UK2Node_VariableSet::StaticClass(), LayoutVariableDetails); } if (Kismet2.IsValid() && Kismet2->IsEditingSingleBlueprint()) { FOnGetDetailCustomizationInstance LayoutOptionDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintGlobalOptionsDetails::MakeInstance, BlueprintEditorPtr); PropertyView->RegisterInstancedCustomPropertyLayout(UBlueprint::StaticClass(), LayoutOptionDetails); FOnGetDetailCustomizationInstance LayoutFormatTextDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FFormatTextDetails::MakeInstance); PropertyView->RegisterInstancedCustomPropertyLayout(UK2Node_FormatText::StaticClass(), LayoutFormatTextDetails); FOnGetDetailCustomizationInstance LayoutDocumentationDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintDocumentationDetails::MakeInstance, BlueprintEditorPtr); PropertyView->RegisterInstancedCustomPropertyLayout(UEdGraphNode_Documentation::StaticClass(), LayoutDocumentationDetails); FOnGetDetailCustomizationInstance GraphNodeDetails = FOnGetDetailCustomizationInstance::CreateStatic(&FBlueprintGraphNodeDetails::MakeInstance, BlueprintEditorPtr); PropertyView->RegisterInstancedCustomPropertyLayout(UEdGraphNode::StaticClass(), GraphNodeDetails); PropertyView->RegisterInstancedCustomPropertyLayout(UChildActorComponent::StaticClass(), FOnGetDetailCustomizationInstance::CreateStatic(&FChildActorComponentDetails::MakeInstance, BlueprintEditorPtr)); } // Create the border that all of the content will get stuffed into ChildSlot [ SNew(SVerticalBox) .AddMetaData<FTagMetaData>(FTagMetaData(TEXT("BlueprintInspector"))) + SVerticalBox::Slot() .FillHeight(1.0f) [ SAssignNew( ContextualEditingBorderWidget, SBorder ) .Padding(0) .BorderImage( FEditorStyle::GetBrush("NoBorder") ) ] ]; // Update based on the current (empty) selection set TArray<UObject*> InitialSelectedObjects; FKismetSelectionInfo SelectionInfo; UpdateFromObjects(InitialSelectedObjects, SelectionInfo, SKismetInspector::FShowDetailsOptions(FText::GetEmpty(), true)); }