Add convAI plugin

This commit is contained in:
2026-02-19 12:44:26 +01:00
parent 457cd803c1
commit 61710c9fde
3434 changed files with 955067 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "ConvaiEUWBase.h"

View File

@@ -0,0 +1,103 @@
// Copyright 2022 Convai Inc. All Rights Reserved.
#include "ConvaiEditor.h"
#include "EditorUtilitySubsystem.h"
#include "Widgets/Input/SButton.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "../Convai.h"
#include "EditorUtilityWidgetBlueprint.h"
#include "Utility/Log/ConvaiLogger.h"
#define LOCTEXT_NAMESPACE "FConvaiEditorModule"
void FConvaiEditorModule::StartupModule()
{
// Register settings customization
FPropertyEditorModule& PropertyEditor = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyEditor.RegisterCustomClassLayout(
UConvaiSettings::StaticClass()->GetFName(),
FOnGetDetailCustomizationInstance::CreateStatic(&FConvaiEditorSettingsCustomization::MakeInstance)
);
// Notify customization module
PropertyEditor.NotifyCustomizationModuleChanged();
}
void FConvaiEditorModule::ShutdownModule()
{
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FConvaiEditorModule, ConvaiEditor)
TSharedRef<IDetailCustomization> FConvaiEditorSettingsCustomization::MakeInstance()
{
return MakeShareable(new FConvaiEditorSettingsCustomization);
}
void FConvaiEditorSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
IDetailCategoryBuilder& ParentCategory = DetailBuilder.EditCategory(TEXT("Convai API"), FText::FromString("Convai API"));
ParentCategory.AddCustomRow(FText::FromString(""))
.WholeRowWidget
[
SNew(SHorizontalBox)
];
IDetailCategoryBuilder& SubCategory = DetailBuilder.EditCategory(TEXT("Long Term Memory"), FText::FromString("Long Term Memory"));
// Add a compact button to the category
SubCategory.AddCustomRow(FText::FromString("Spawn Tab"))
.WholeRowWidget
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.HAlign(HAlign_Left)
.VAlign(VAlign_Center)
.AutoWidth()
[
SNew(SButton)
.Text(FText::FromString("Manage Speaker ID"))
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.ContentPadding(FMargin(8.0f, 2.0f))
.OnClicked(this, &FConvaiEditorSettingsCustomization::OnSpawnTabClicked)
]
];
}
FReply FConvaiEditorSettingsCustomization::OnSpawnTabClicked()
{
const FString WidgetPath = TEXT("/ConvAI/Editor/EUW_LTM.EUW_LTM");
UEditorUtilityWidgetBlueprint* WidgetBlueprint = LoadObject<UEditorUtilityWidgetBlueprint>(nullptr, *WidgetPath);
if (WidgetBlueprint)
{
if (UEditorUtilitySubsystem* Subsystem = GEditor->GetEditorSubsystem<UEditorUtilitySubsystem>())
{
Subsystem->SpawnAndRegisterTab(WidgetBlueprint);
CONVAI_LOG(LogTemp, Log, TEXT("Successfully spawned the Editor Utility Widget: %s"), *WidgetPath);
}
else
{
CONVAI_LOG(LogTemp, Warning, TEXT("Failed to get Editor Utility Subsystem."));
}
}
else
{
CONVAI_LOG(LogTemp, Error, TEXT("Failed to load Editor Utility Widget Blueprint at path: %s"), *WidgetPath);
}
return FReply::Handled();
}

View File

@@ -0,0 +1,96 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "ConvaiEditorUtils.h"
#include "EditorUtilityLibrary.h"
#include "../Convai.h"
#include "ISettingsModule.h"
#include "Kismet/KismetSystemLibrary.h"
#include "EditorAssetLibrary.h"
#include "Utility/Log/ConvaiLogger.h"
void UConvaiEditorUtils::ConvaiAddSpeakerID(const FConvaiSpeakerInfo& Speaker)
{
UConvaiSettings* Settings = GetMutableDefault<UConvaiSettings>();
if (!Settings)
{
CONVAI_LOG(LogTemp, Warning, TEXT("ConvaiSettings not found."));
return;
}
int32 Index = Settings->SpeakerIDs.IndexOfByPredicate([&](const FConvaiSpeakerInfo& Info)
{
return Info.SpeakerID == Speaker.SpeakerID;
});
if (Index == INDEX_NONE)
{
Settings->SpeakerIDs.Add(Speaker);
//CONVAI_LOG(LogTemp, Log, TEXT("Added Speaker: ID=%s, Name=%s"), *Speaker.SpeakerID, *Speaker.Name);
}
Settings->SaveConfig(CPF_Config, *Settings->GetDefaultConfigFilename());
RefreshConvaiSettings();
}
void UConvaiEditorUtils::ConvaiRemoveSpeakerID(const FString& SpeakerID)
{
UConvaiSettings* Settings = GetMutableDefault<UConvaiSettings>();
if (!Settings)
{
CONVAI_LOG(LogTemp, Warning, TEXT("ConvaiSettings not found."));
return;
}
int32 Index = Settings->SpeakerIDs.IndexOfByPredicate([&](const FConvaiSpeakerInfo& Info)
{
return Info.SpeakerID == SpeakerID;
});
if (Index != INDEX_NONE)
{
Settings->SpeakerIDs.RemoveAt(Index);
//CONVAI_LOG(LogTemp, Log, TEXT("Removed Speaker: ID=%s"), *SpeakerID);
}
else
{
CONVAI_LOG(LogTemp, Warning, TEXT("Speaker ID not found: %s"), *SpeakerID);
}
Settings->SaveConfig(CPF_Config, *Settings->GetDefaultConfigFilename());
RefreshConvaiSettings();
}
#define LOCTEXT_NAMESPACE "Convai"
void UConvaiEditorUtils::RefreshConvaiSettings()
{
if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
{
// Unregister the settings
SettingsModule->UnregisterSettings("Project", "Plugins", "Convai");
// Re-register the settings
UConvaiSettings* Settings = GetMutableDefault<UConvaiSettings>();
SettingsModule->RegisterSettings("Project", "Plugins", "Convai",
LOCTEXT("RuntimeSettingsName", "Convai"),
LOCTEXT("RuntimeSettingsDescription", "Configure Convai settings"),
Settings);
}
}
TArray<UObject*> UConvaiEditorUtils::BeginTransactionAndGetSelectedAssets(const FString& Context, const FText& Description)
{
UKismetSystemLibrary::BeginTransaction(Context, Description, nullptr);
return UEditorUtilityLibrary::GetSelectedAssets();
}
void UConvaiEditorUtils::SaveLoadedAssetAndEndTransaction(const TArray<UObject*>& LoadedAssets)
{
UEditorAssetLibrary::CheckoutLoadedAssets(LoadedAssets);
UEditorAssetLibrary::SaveLoadedAssets(LoadedAssets);
UKismetSystemLibrary::EndTransaction();
}
#undef LOCTEXT_NAMESPACE