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 FactoryName = WingFactories::DeriveFactoryName(*FoundFactory);
FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName); FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName);
FString Doc = FString::Printf(TEXT("Create a new %s asset."), *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 virtual void Handle() override
{ {
// Get the configuration. // Get the configuration.
UWingClassArg *ConfObj = Cast<UWingClassArg>(ConfigurationObject); UWingClassArg *ConfObj = Cast<UWingClassArg>(Configuration->Config.Get());
if (ConfObj == nullptr) if (ConfObj == nullptr)
{ {
WingOut::Stdout.Print(TEXT("ERROR: Create_ClassArg config object not set properly (bug)\n")); 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 FactoryName = WingFactories::DeriveFactoryName(Class);
FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName); FString CommandName = FString::Printf(TEXT("Create_%s"), *FactoryName);
FString Doc = FString::Printf(TEXT("Create a new %s asset."), *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"), UWingServer::AddHandler(this, TEXT("Create_BlueprintFunctionLibrary"),
UBlueprintFunctionLibraryFactory::StaticClass(), EWingHandlerKind::Create, nullptr, EWingHandlerKind::Create,
UBlueprintFunctionLibraryFactory::StaticClass(),
TEXT("Create a blueprint function library")); TEXT("Create a blueprint function library"));
UClass *BlueprintInterfaceFactory = FindObject<UClass>(nullptr, TEXT("/Script/UnrealEd.BlueprintInterfaceFactory")); UClass *BlueprintInterfaceFactory = FindObject<UClass>(nullptr, TEXT("/Script/UnrealEd.BlueprintInterfaceFactory"));
if (BlueprintInterfaceFactory) if (BlueprintInterfaceFactory)
UWingServer::AddHandler(this, TEXT("Create_BlueprintInterface"), UWingServer::AddHandler(this, TEXT("Create_BlueprintInterface"),
BlueprintInterfaceFactory, EWingHandlerKind::Create, nullptr, EWingHandlerKind::Create,
BlueprintInterfaceFactory,
TEXT("Create a blueprint interface")); TEXT("Create a blueprint interface"));
} }
virtual void Handle() override virtual void Handle() override
{ {
UClass* FactoryClass = Cast<UClass>(ConfigurationObject); UClass* FactoryClass = Configuration->FactoryClass.Get();
UFactory* Factory = NewObject<UFactory>(GetTransientPackage(), FactoryClass); UFactory* Factory = NewObject<UFactory>(GetTransientPackage(), FactoryClass);
WingFactories::CreateAsset(Path, Factory, WingOut::Stdout); WingFactories::CreateAsset(Path, Factory, WingOut::Stdout);
WingOut::Stdout.Printf(TEXT("Created.\n")); WingOut::Stdout.Printf(TEXT("Created.\n"));

View File

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

View File

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

View File

@@ -326,9 +326,9 @@ void UWingServer::TryCallHandler(const FString &Line)
LastHandler = Found; LastHandler = Found;
// Make an object of the handler class. // 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()); UWingHandler* Handler = Cast<UWingHandler>(HandlerObj.Get());
Handler->ConfigurationObject = Found->Config.Get(); Handler->Configuration = Found;
// Populate the handler object with the request parameters. // Populate the handler object with the request parameters.
TArray<FWingProperty> Props = FWingProperty::GetAll(Handler, CPF_Edit); 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) 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; FWingHandlerConfig H;
H.Name = Name; H.Name = Name;
H.Documentation = Documentation; H.Documentation = Documentation;
H.Class = TStrongObjectPtr<UClass>(Obj->GetClass()); H.HandlerClass = TStrongObjectPtr<UClass>(Obj->GetClass());
H.Config = TStrongObjectPtr<UObject>(Config); H.Config = TStrongObjectPtr<UObject>(Config);
H.FactoryClass = TStrongObjectPtr<UClass>(FactoryClass);
H.Kind = Kind; H.Kind = Kind;
GWingServer->WingHandlerRegistry.Add(MoveTemp(H)); GWingServer->WingHandlerRegistry.Add(MoveTemp(H));

View File

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

View File

@@ -61,7 +61,7 @@ public:
// ----- Tool dispatch ----- // ----- Tool dispatch -----
static void AddHandler(UObject* Obj, const FString& Documentation); 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; } static const TArray<FWingHandlerConfig>& AllHandlers() { return GWingServer->WingHandlerRegistry; }
private: private: