Simplification of handlers

This commit is contained in:
2026-04-04 18:12:10 -04:00
parent c006531bd4
commit 47acf1aca4
7 changed files with 23 additions and 21 deletions

View File

@@ -87,7 +87,7 @@ public:
FString FactoryName = WingFactories::DeriveFactoryName(*FoundFactory);
FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName);
FString Doc = FString::Printf(TEXT("Create a new %s asset."), *FactoryName);
UWingServer::AddHandler(this, CommandName, Arg, EWingHandlerKind::Create, Doc);
UWingServer::AddHandler(this, CommandName, Arg, EWingHandlerKind::Create, *FoundFactory, Doc);
}
}
@@ -197,7 +197,7 @@ public:
virtual void Handle() override
{
// Get the configuration.
UWingClassArg *ConfObj = Cast<UWingClassArg>(ConfigurationObject);
UWingClassArg *ConfObj = Cast<UWingClassArg>(Configuration->Config.Get());
if (ConfObj == nullptr)
{
WingOut::Stdout.Print(TEXT("ERROR: Create_ClassArg config object not set properly (bug)\n"));

View File

@@ -29,23 +29,25 @@ public:
FString FactoryName = WingFactories::DeriveFactoryName(Class);
FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName);
FString Doc = FString::Printf(TEXT("Create a new %s asset."), *FactoryName);
UWingServer::AddHandler(this, CommandName, Class, EWingHandlerKind::Create, Doc);
UWingServer::AddHandler(this, CommandName, nullptr, EWingHandlerKind::Create, Class, Doc);
}
UWingServer::AddHandler(this, TEXT("Create_BlueprintFunctionLibrary"),
UBlueprintFunctionLibraryFactory::StaticClass(), EWingHandlerKind::Create,
nullptr, EWingHandlerKind::Create,
UBlueprintFunctionLibraryFactory::StaticClass(),
TEXT("Create a blueprint function library"));
UClass *BlueprintInterfaceFactory = FindObject<UClass>(nullptr, TEXT("/Script/UnrealEd.BlueprintInterfaceFactory"));
if (BlueprintInterfaceFactory)
UWingServer::AddHandler(this, TEXT("Create_BlueprintInterface"),
BlueprintInterfaceFactory, EWingHandlerKind::Create,
nullptr, EWingHandlerKind::Create,
BlueprintInterfaceFactory,
TEXT("Create a blueprint interface"));
}
virtual void Handle() override
{
UClass* FactoryClass = Cast<UClass>(ConfigurationObject);
UClass* FactoryClass = Configuration->FactoryClass.Get();
UFactory* Factory = NewObject<UFactory>(GetTransientPackage(), FactoryClass);
WingFactories::CreateAsset(Path, Factory, WingOut::Stdout);
WingOut::Stdout.Printf(TEXT("Created.\n"));

View File

@@ -4,7 +4,6 @@
#include "WingServer.h"
#include "WingHandler.h"
#include "WingFactories.h"
#include "Create_ClassArg.h"
#include "SysInfo_Factories.generated.h"
@@ -33,9 +32,8 @@ public:
for (const FWingHandlerConfig& H : UWingServer::AllHandlers())
{
if (H.Kind != EWingHandlerKind::Create) continue;
UClass* FactoryClass = Cast<UClass>(H.Config.Get());
if (FactoryClass && FactoryClass->IsChildOf(UFactory::StaticClass()))
SupportedFactories.Add(FactoryClass);
if (H.FactoryClass.IsValid())
SupportedFactories.Add(H.FactoryClass.Get());
}
TArray<UClass*> FactoryClasses;

View File

@@ -8,7 +8,7 @@ void WingManual::PrintHandlerPrototype(const FWingHandlerConfig& Handler)
WingOut::Stdout.Print(Handler.Name);
WingOut::Stdout.Print(TEXT("("));
bool bFirst = true;
for (TFieldIterator<FProperty> PropIt(Handler.Class.Get(), EFieldIterationFlags::None); PropIt; ++PropIt)
for (TFieldIterator<FProperty> PropIt(Handler.HandlerClass.Get(), EFieldIterationFlags::None); PropIt; ++PropIt)
{
if (!bFirst) WingOut::Stdout.Print(TEXT(","));
bFirst = false;
@@ -21,7 +21,7 @@ void WingManual::PrintHandlerPrototype(const FWingHandlerConfig& Handler)
void WingManual::PrintHandlerArguments(const FWingHandlerConfig& Handler)
{
// parameter details
for (TFieldIterator<FProperty> PropIt(Handler.Class.Get(), EFieldIterationFlags::None); PropIt; ++PropIt)
for (TFieldIterator<FProperty> PropIt(Handler.HandlerClass.Get(), EFieldIterationFlags::None); PropIt; ++PropIt)
{
FProperty* Prop = *PropIt;
FString Name = Prop->GetName();
@@ -306,7 +306,7 @@ void WingManual::Commands(EWingHandlerKind Kind, const FString& Query, bool Verb
// Blank line between groups
if (!Verbose)
{
FString Group = WingUtils::GetHandlerGroup(H.Class.Get());
FString Group = WingUtils::GetHandlerGroup(H.HandlerClass.Get());
if (Group != PrevGroup)
{
if (!PrevGroup.IsEmpty())

View File

@@ -326,9 +326,9 @@ void UWingServer::TryCallHandler(const FString &Line)
LastHandler = Found;
// Make an object of the handler class.
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), Found->Class.Get()));
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), Found->HandlerClass.Get()));
UWingHandler* Handler = Cast<UWingHandler>(HandlerObj.Get());
Handler->ConfigurationObject = Found->Config.Get();
Handler->Configuration = Found;
// Populate the handler object with the request parameters.
TArray<FWingProperty> Props = FWingProperty::GetAll(Handler, CPF_Edit);
@@ -458,16 +458,17 @@ void UWingServer::ClientThreadFunc(UWingServer* Server, TSharedPtr<FClientConnec
void UWingServer::AddHandler(UObject* Obj, const FString& Documentation)
{
AddHandler(Obj, WingUtils::GetHandlerName(Obj->GetClass()), nullptr, EWingHandlerKind::Normal, Documentation);
AddHandler(Obj, WingUtils::GetHandlerName(Obj->GetClass()), nullptr, EWingHandlerKind::Normal, nullptr, Documentation);
}
void UWingServer::AddHandler(UObject* Obj, const FString& Name, UObject* Config, EWingHandlerKind Kind, const FString& Documentation)
void UWingServer::AddHandler(UObject* Obj, const FString& Name, UObject* Config, EWingHandlerKind Kind, UClass* FactoryClass, const FString& Documentation)
{
FWingHandlerConfig H;
H.Name = Name;
H.Documentation = Documentation;
H.Class = TStrongObjectPtr<UClass>(Obj->GetClass());
H.HandlerClass = TStrongObjectPtr<UClass>(Obj->GetClass());
H.Config = TStrongObjectPtr<UObject>(Config);
H.FactoryClass = TStrongObjectPtr<UClass>(FactoryClass);
H.Kind = Kind;
GWingServer->WingHandlerRegistry.Add(MoveTemp(H));

View File

@@ -39,8 +39,9 @@ struct FWingHandlerConfig
GENERATED_BODY()
FString Name;
FString Documentation;
TStrongObjectPtr<UClass> Class;
TStrongObjectPtr<UClass> HandlerClass;
TStrongObjectPtr<UObject> Config;
TStrongObjectPtr<UClass> FactoryClass;
EWingHandlerKind Kind = EWingHandlerKind::Normal;
};
@@ -57,7 +58,7 @@ public:
virtual void Handle() {}
// The configuration object.
UObject *ConfigurationObject;
FWingHandlerConfig *Configuration;
public:
};

View File

@@ -61,7 +61,7 @@ public:
// ----- Tool dispatch -----
static void AddHandler(UObject* Obj, const FString& Documentation);
static void AddHandler(UObject* Obj, const FString& Name, UObject* Config, EWingHandlerKind Kind, const FString& Documentation);
static void AddHandler(UObject* Obj, const FString& Name, UObject* Config, EWingHandlerKind Kind, UClass* FactoryClass, const FString& Documentation);
static const TArray<FWingHandlerConfig>& AllHandlers() { return GWingServer->WingHandlerRegistry; }
private: