// Copyright Epic Games, Inc. All Rights Reserved. #include "AssetTypeActions_Base.h" #include "AssetToolsModule.h" #include "IAssetTools.h" #include "Modules/ModuleManager.h" #include "PropertyEditorModule.h" #include "QwenTTSPresetDataAsset.h" #include "QwenTTSPresetDetailsCustomization.h" #include "QwenTTSStreamingSettingsDataAsset.h" #define LOCTEXT_NAMESPACE "FQwenTTSStreamingEditorModule" namespace { class FQwenTTSSettingsAssetTypeActions : public FAssetTypeActions_Base { public: explicit FQwenTTSSettingsAssetTypeActions(EAssetTypeCategories::Type InCategory) : Category(InCategory) { } virtual FText GetName() const override { return LOCTEXT("QwenTTSSettingsName", "Qwen TTS Streaming Settings"); } virtual FColor GetTypeColor() const override { return FColor(86, 182, 194); } virtual UClass* GetSupportedClass() const override { return UQwenTTSStreamingSettingsDataAsset::StaticClass(); } virtual uint32 GetCategories() override { return Category; } virtual FText GetAssetDescription(const FAssetData& AssetData) const override { return LOCTEXT("QwenTTSSettingsDescription", "Gateway and playback settings for Qwen TTS streaming."); } private: EAssetTypeCategories::Type Category; }; class FQwenTTSPresetAssetTypeActions : public FAssetTypeActions_Base { public: explicit FQwenTTSPresetAssetTypeActions(EAssetTypeCategories::Type InCategory) : Category(InCategory) { } virtual FText GetName() const override { return LOCTEXT("QwenTTSPresetName", "Qwen TTS Preset"); } virtual FColor GetTypeColor() const override { return FColor(120, 176, 96); } virtual UClass* GetSupportedClass() const override { return UQwenTTSPresetDataAsset::StaticClass(); } virtual uint32 GetCategories() override { return Category; } virtual FText GetAssetDescription(const FAssetData& AssetData) const override { return LOCTEXT("QwenTTSPresetDescription", "Voice preset and generation parameters for Qwen TTS streaming."); } private: EAssetTypeCategories::Type Category; }; } class FQwenTTSStreamingEditorModule : public IModuleInterface { public: virtual void StartupModule() override { IAssetTools& AssetTools = FModuleManager::LoadModuleChecked("AssetTools").Get(); AudioCategory = AssetTools.FindAdvancedAssetCategory(FName("Audio")); if (AudioCategory == EAssetTypeCategories::None) { AudioCategory = AssetTools.RegisterAdvancedAssetCategory(FName("Audio"), LOCTEXT("AudioCategory", "Audio")); } RegisterAssetTypeAction(AssetTools, MakeShared(AudioCategory)); RegisterAssetTypeAction(AssetTools, MakeShared(AudioCategory)); FPropertyEditorModule& PropertyEditor = FModuleManager::LoadModuleChecked("PropertyEditor"); PropertyEditor.RegisterCustomClassLayout( UQwenTTSPresetDataAsset::StaticClass()->GetFName(), FOnGetDetailCustomizationInstance::CreateStatic(&FQwenTTSPresetDetailsCustomization::MakeInstance)); PropertyEditor.NotifyCustomizationModuleChanged(); } virtual void ShutdownModule() override { if (FModuleManager::Get().IsModuleLoaded("AssetTools")) { IAssetTools& AssetTools = FModuleManager::GetModuleChecked("AssetTools").Get(); for (const TSharedRef& Action : RegisteredAssetTypeActions) { AssetTools.UnregisterAssetTypeActions(Action); } } RegisteredAssetTypeActions.Empty(); if (FModuleManager::Get().IsModuleLoaded("PropertyEditor")) { FPropertyEditorModule& PropertyEditor = FModuleManager::GetModuleChecked("PropertyEditor"); PropertyEditor.UnregisterCustomClassLayout(UQwenTTSPresetDataAsset::StaticClass()->GetFName()); PropertyEditor.NotifyCustomizationModuleChanged(); } } private: void RegisterAssetTypeAction(IAssetTools& AssetTools, TSharedRef Action) { AssetTools.RegisterAssetTypeActions(Action); RegisteredAssetTypeActions.Add(Action); } EAssetTypeCategories::Type AudioCategory = EAssetTypeCategories::Sounds; TArray> RegisteredAssetTypeActions; }; IMPLEMENT_MODULE(FQwenTTSStreamingEditorModule, QwenTTSStreamingEditor) #undef LOCTEXT_NAMESPACE