/ Source / ReasonablePlanningAIEditor / Private / ComposerBehaviorEditorToolkit.cpp
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  }