Files
wyatt 648386cd73 Lua向C#逻辑迁移 一期 #13
将整个插件代码上传
2025-10-26 21:48:39 +08:00

157 lines
4.7 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
#include "Containers/Ticker.h"
#ifdef __clang__
#pragma clang diagnostic ignored "-Wignored-attributes"
#endif
class UCSAssembly;
struct FPluginTemplateDescription;
enum ECSLoggerVerbosity : uint8;
class UCSInterface;
class UCSEnum;
class UCSClass;
class UCSScriptStruct;
class UCSManager;
class IAssetTools;
class FCSScriptBuilder;
enum HotReloadStatus
{
// Not Hot Reloading
Inactive,
// When the DirectoryWatcher picks up on new code changes that haven't been Hot Reloaded yet
PendingReload,
// Actively Hot Reloading
Active,
// Failed to unload an assembly during Hot Reload
FailedToUnload
};
struct FCSManagedUnrealSharpEditorCallbacks
{
FCSManagedUnrealSharpEditorCallbacks() : Build(nullptr), ForceManagedGC(nullptr), OpenSolution(nullptr), AddProjectToCollection(nullptr)
{
}
using FBuildProject = bool(__stdcall*)(const TCHAR*, const TCHAR*, const TCHAR*, ECSLoggerVerbosity, void*, bool);
using FForceManagedGC = void(__stdcall*)();
using FOpenSolution = bool(__stdcall*)(const TCHAR*, void*);
using FAddProjectToCollection = void(__stdcall*)(const TCHAR*);
FBuildProject Build;
FForceManagedGC ForceManagedGC;
FOpenSolution OpenSolution;
FAddProjectToCollection AddProjectToCollection;
};
DECLARE_LOG_CATEGORY_EXTERN(LogUnrealSharpEditor, Log, All);
class FUnrealSharpEditorModule : public IModuleInterface
{
public:
static FUnrealSharpEditorModule& Get();
// IModuleInterface interface begin
virtual void StartupModule() override;
virtual void ShutdownModule() override;
// End
void OnCSharpCodeModified(const TArray<struct FFileChangeData>& ChangedFiles);
void StartHotReload(bool bRebuild = true, bool bPromptPlayerWithNewProject = true);
void InitializeUnrealSharpEditorCallbacks(FCSManagedUnrealSharpEditorCallbacks Callbacks);
bool IsHotReloading() const { return HotReloadStatus == Active; }
bool HasPendingHotReloadChanges() const { return HotReloadStatus == PendingReload; }
bool HasHotReloadFailed() const { return bHotReloadFailed; }
FUICommandList& GetUnrealSharpCommands() const { return *UnrealSharpCommands; }
void OpenSolution();
void AddDirectoryToWatch(const FString& Directory);
void AddNewProject(const FString& ModuleName, const FString& ProjectParentFolder, const FString& ProjectRoot, const TMap<FString, FString>& Arguments = {});
FCSManagedUnrealSharpEditorCallbacks& GetManagedUnrealSharpEditorCallbacks()
{
return ManagedUnrealSharpEditorCallbacks;
}
static bool FillTemplateFile(const FString& TemplateName, TMap<FString, FString>& Replacements, const FString& Path);
static void RepairComponents();
private:
static FString SelectArchiveDirectory();
static void RunGame(FString ExecutablePath);
static void CopyProperties(UActorComponent* Source, UActorComponent* Target);
static void OnCreateNewProject();
static void OnCompileManagedCode();
static void OnReloadManagedCode();
void OnRegenerateSolution();
void OnOpenSolution();
static void OnPackageProject();
static void OnMergeManagedSlnAndNativeSln();
static void OnOpenSettings();
static void OnOpenDocumentation();
static void OnReportBug();
static void OnRefreshRuntimeGlue();
static void OnRepairComponents();
static void OnExploreArchiveDirectory(FString ArchiveDirectory);
static void PackageProject();
TSharedRef<SWidget> GenerateUnrealSharpMenu();
static void OpenNewProjectDialog();
static void SuggestProjectSetup();
bool Tick(float DeltaTime);
void RegisterCommands();
void RegisterMenu();
void RegisterPluginTemplates();
void UnregisterPluginTemplates();
void OnPIEShutdown(bool IsSimulating);
void OnStructRebuilt(UCSScriptStruct* NewStruct);
void OnClassRebuilt(UCSClass* NewClass);
void OnEnumRebuilt(UCSEnum* NewEnum);
bool IsPinAffectedByReload(const FEdGraphPinType& PinType) const;
bool IsNodeAffectedByReload(UEdGraphNode* Node) const;
void RefreshAffectedBlueprints();
FSlateIcon GetMenuIcon() const;
FCSManagedUnrealSharpEditorCallbacks ManagedUnrealSharpEditorCallbacks;
HotReloadStatus HotReloadStatus = Inactive;
bool bHotReloadFailed = false;
bool bHasQueuedHotReload = false;
UCSAssembly* EditorAssembly;
FTickerDelegate TickDelegate;
FTSTicker::FDelegateHandle TickDelegateHandle;
TSharedPtr<FUICommandList> UnrealSharpCommands;
TArray<TSharedRef<FPluginTemplateDescription>> PluginTemplates;
TSet<UCSScriptStruct*> RebuiltStructs;
TSet<UCSClass*> RebuiltClasses;
TSet<UCSEnum*> RebuiltEnums;
UCSManager* Manager = nullptr;
TArray<FString> WatchingDirectories;
};