From 47acf1aca40c5861d4d59c9ce5f48d27de7891e3 Mon Sep 17 00:00:00 2001 From: jyelon Date: Sat, 4 Apr 2026 18:12:10 -0400 Subject: [PATCH] Simplification of handlers --- .../Source/UEWingman/Handlers/Create_ClassArg.h | 4 ++-- .../Source/UEWingman/Handlers/Create_NoArgs.h | 10 ++++++---- .../Source/UEWingman/Handlers/SysInfo_Factories.h | 6 ++---- .../UEWingman/Source/UEWingman/Private/WingManual.cpp | 6 +++--- .../UEWingman/Source/UEWingman/Private/WingServer.cpp | 11 ++++++----- .../UEWingman/Source/UEWingman/Public/WingHandler.h | 5 +++-- .../UEWingman/Source/UEWingman/Public/WingServer.h | 2 +- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/Create_ClassArg.h b/Plugins/UEWingman/Source/UEWingman/Handlers/Create_ClassArg.h index 1f6515fd..97ec1f42 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/Create_ClassArg.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/Create_ClassArg.h @@ -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(ConfigurationObject); + UWingClassArg *ConfObj = Cast(Configuration->Config.Get()); if (ConfObj == nullptr) { WingOut::Stdout.Print(TEXT("ERROR: Create_ClassArg config object not set properly (bug)\n")); diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/Create_NoArgs.h b/Plugins/UEWingman/Source/UEWingman/Handlers/Create_NoArgs.h index 036bf0cb..b831f9b0 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/Create_NoArgs.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/Create_NoArgs.h @@ -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(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(ConfigurationObject); + UClass* FactoryClass = Configuration->FactoryClass.Get(); UFactory* Factory = NewObject(GetTransientPackage(), FactoryClass); WingFactories::CreateAsset(Path, Factory, WingOut::Stdout); WingOut::Stdout.Printf(TEXT("Created.\n")); diff --git a/Plugins/UEWingman/Source/UEWingman/Handlers/SysInfo_Factories.h b/Plugins/UEWingman/Source/UEWingman/Handlers/SysInfo_Factories.h index 9b6bd449..e0154a4b 100644 --- a/Plugins/UEWingman/Source/UEWingman/Handlers/SysInfo_Factories.h +++ b/Plugins/UEWingman/Source/UEWingman/Handlers/SysInfo_Factories.h @@ -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(H.Config.Get()); - if (FactoryClass && FactoryClass->IsChildOf(UFactory::StaticClass())) - SupportedFactories.Add(FactoryClass); + if (H.FactoryClass.IsValid()) + SupportedFactories.Add(H.FactoryClass.Get()); } TArray FactoryClasses; diff --git a/Plugins/UEWingman/Source/UEWingman/Private/WingManual.cpp b/Plugins/UEWingman/Source/UEWingman/Private/WingManual.cpp index 77b34458..f9153a76 100644 --- a/Plugins/UEWingman/Source/UEWingman/Private/WingManual.cpp +++ b/Plugins/UEWingman/Source/UEWingman/Private/WingManual.cpp @@ -8,7 +8,7 @@ void WingManual::PrintHandlerPrototype(const FWingHandlerConfig& Handler) WingOut::Stdout.Print(Handler.Name); WingOut::Stdout.Print(TEXT("(")); bool bFirst = true; - for (TFieldIterator PropIt(Handler.Class.Get(), EFieldIterationFlags::None); PropIt; ++PropIt) + for (TFieldIterator 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 PropIt(Handler.Class.Get(), EFieldIterationFlags::None); PropIt; ++PropIt) + for (TFieldIterator 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()) diff --git a/Plugins/UEWingman/Source/UEWingman/Private/WingServer.cpp b/Plugins/UEWingman/Source/UEWingman/Private/WingServer.cpp index 881d2140..9a94f3a4 100644 --- a/Plugins/UEWingman/Source/UEWingman/Private/WingServer.cpp +++ b/Plugins/UEWingman/Source/UEWingman/Private/WingServer.cpp @@ -326,9 +326,9 @@ void UWingServer::TryCallHandler(const FString &Line) LastHandler = Found; // Make an object of the handler class. - TStrongObjectPtr HandlerObj(NewObject(GetTransientPackage(), Found->Class.Get())); + TStrongObjectPtr HandlerObj(NewObject(GetTransientPackage(), Found->HandlerClass.Get())); UWingHandler* Handler = Cast(HandlerObj.Get()); - Handler->ConfigurationObject = Found->Config.Get(); + Handler->Configuration = Found; // Populate the handler object with the request parameters. TArray Props = FWingProperty::GetAll(Handler, CPF_Edit); @@ -458,16 +458,17 @@ void UWingServer::ClientThreadFunc(UWingServer* Server, TSharedPtrGetClass()), 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(Obj->GetClass()); + H.HandlerClass = TStrongObjectPtr(Obj->GetClass()); H.Config = TStrongObjectPtr(Config); + H.FactoryClass = TStrongObjectPtr(FactoryClass); H.Kind = Kind; GWingServer->WingHandlerRegistry.Add(MoveTemp(H)); diff --git a/Plugins/UEWingman/Source/UEWingman/Public/WingHandler.h b/Plugins/UEWingman/Source/UEWingman/Public/WingHandler.h index 4e75b01a..f3f8c8ad 100644 --- a/Plugins/UEWingman/Source/UEWingman/Public/WingHandler.h +++ b/Plugins/UEWingman/Source/UEWingman/Public/WingHandler.h @@ -39,8 +39,9 @@ struct FWingHandlerConfig GENERATED_BODY() FString Name; FString Documentation; - TStrongObjectPtr Class; + TStrongObjectPtr HandlerClass; TStrongObjectPtr Config; + TStrongObjectPtr FactoryClass; EWingHandlerKind Kind = EWingHandlerKind::Normal; }; @@ -57,7 +58,7 @@ public: virtual void Handle() {} // The configuration object. - UObject *ConfigurationObject; + FWingHandlerConfig *Configuration; public: }; diff --git a/Plugins/UEWingman/Source/UEWingman/Public/WingServer.h b/Plugins/UEWingman/Source/UEWingman/Public/WingServer.h index 0ea57cdd..fc1dd44e 100644 --- a/Plugins/UEWingman/Source/UEWingman/Public/WingServer.h +++ b/Plugins/UEWingman/Source/UEWingman/Public/WingServer.h @@ -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& AllHandlers() { return GWingServer->WingHandlerRegistry; } private: