ComposerBehaviorEditorToolkit.cpp
1 // Copyright (C) 2025 Radaway Software LLC. All Rights Reserved. 2 3 4 #include "ComposerBehaviorEditorToolkit.h" 5 #include "Widgets/Docking/SDockTab.h" 6 #include "Modules/ModuleManager.h" 7 8 void FComposerBehaviorEditorToolkit::InitEditor(const TArray<UObject*>& InObjects) 9 { 10 if(InObjects.Num() <= 0) 11 { 12 return; 13 } 14 15 Behavior = Cast<URpaiComposerBehavior>(InObjects[0]); 16 17 const TSharedRef<FTabManager::FLayout> Layout = FTabManager::NewLayout("RpaiComposerBehaviorEditorLayout") 18 ->AddArea 19 ( 20 FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical) 21 ->Split 22 ( 23 FTabManager::NewSplitter() 24 ->SetSizeCoefficient(0.6f) 25 ->SetOrientation(Orient_Horizontal) 26 ->Split 27 ( 28 FTabManager::NewStack() 29 ->SetSizeCoefficient(0.8f) 30 ->AddTab("RpaiComposerBehaviorExperimentTab", ETabState::OpenedTab) 31 ) 32 ->Split 33 ( 34 FTabManager::NewStack() 35 ->SetSizeCoefficient(0.2f) 36 ->AddTab("RpaiComposerBehaviorDetailsTab", ETabState::OpenedTab) 37 ) 38 ) 39 ); 40 FAssetEditorToolkit::InitAssetEditor(EToolkitMode::Standalone, {}, "RpaiComposerBehaviorEditor", Layout, true, true, InObjects); 41 } 42 43 void FComposerBehaviorEditorToolkit::RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager) 44 { 45 FAssetEditorToolkit::RegisterTabSpawners(InTabManager); 46 47 WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(INVTEXT("RPAI Composer Behavior Editor")); 48 49 InTabManager->RegisterTabSpawner("RpaiComposerBehaviorExperimentTab", FOnSpawnTab::CreateLambda([this](const FSpawnTabArgs&) 50 { 51 return SNew(SDockTab) 52 [ 53 SAssignNew(ExperimentWidget, SComposerBehaviorWidget) 54 .ComposerBehavior(Behavior) 55 ]; 56 })) 57 .SetDisplayName(INVTEXT("Experiment")) 58 .SetGroup(WorkspaceMenuCategory.ToSharedRef()); 59 60 FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor"); 61 FDetailsViewArgs DetailsViewArgs; 62 DetailsViewArgs.NameAreaSettings = FDetailsViewArgs::HideNameArea; 63 DetailsViewArgs.NotifyHook = this; 64 TSharedRef<IDetailsView> DetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs); 65 DetailsView->SetObjects(TArray<UObject*>{ Behavior }); 66 InTabManager->RegisterTabSpawner("RpaiComposerBehaviorDetailsTab", FOnSpawnTab::CreateLambda([=](const FSpawnTabArgs&) 67 { 68 return SNew(SDockTab) 69 [ 70 DetailsView 71 ]; 72 })) 73 .SetDisplayName(INVTEXT("Details")) 74 .SetGroup(WorkspaceMenuCategory.ToSharedRef()); 75 } 76 77 void FComposerBehaviorEditorToolkit::UnregisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager) 78 { 79 FAssetEditorToolkit::UnregisterTabSpawners(InTabManager); 80 InTabManager->UnregisterTabSpawner("RpaiComposerBehaviorExperimentTab"); 81 InTabManager->UnregisterTabSpawner("RpaiComposerBehaviorDetailsTab"); 82 } 83 84 void FComposerBehaviorEditorToolkit::NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged) 85 { 86 if(PropertyChangedEvent.GetPropertyName().IsEqual("ConstructedStateType")) 87 { 88 if(ExperimentWidget) 89 { 90 ExperimentWidget->NotifyStateTypePropertyChanged(); 91 } 92 } 93 else if(PropertyChangedEvent.GetPropertyName().IsEqual("Goals")) 94 { 95 if(ExperimentWidget) 96 { 97 ExperimentWidget->NotifyGoalsPropertyChanged(); 98 } 99 } 100 } 101 102 void FComposerBehaviorEditorToolkit::NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FEditPropertyChain* PropertyThatChanged) 103 { 104 if(PropertyChangedEvent.GetPropertyName().IsEqual("ConstructedStateType")) 105 { 106 if(ExperimentWidget) 107 { 108 ExperimentWidget->NotifyStateTypePropertyChanged(); 109 } 110 } 111 else if(PropertyChangedEvent.GetPropertyName().IsEqual("Goals")) 112 { 113 if(ExperimentWidget) 114 { 115 ExperimentWidget->NotifyGoalsPropertyChanged(); 116 } 117 } 118 } 119 120 void FComposerBehaviorEditorToolkit::NotifyPreChange(FProperty* PropertyChangedEvent) 121 { 122 } 123 124 void FComposerBehaviorEditorToolkit::NotifyPreChange(FEditPropertyChain* PropertyThatChanged) 125 { 126 }