Files
VPDevtemplate/Plugins/NDIIO/Source/Editor/Classes/NDIIOEditorModule.cpp

136 lines
5.4 KiB
C++
Raw Normal View History

2025-08-25 13:16:29 +03:00
/*
Copyright (C) 2024 Vizrt NDI AB. All rights reserved.
This file and its use within a Product is bound by the terms of NDI SDK license that was provided
as part of the NDI SDK. For more information, please review the license and the NDI SDK documentation.
*/
#include <NDIIOEditorModule.h>
#include <Editor.h>
#include <PropertyEditorModule.h>
#include <IPlacementModeModule.h>
#include <Interfaces/IPluginManager.h>
#include <Styling/SlateStyleRegistry.h>
#include <Actors/NDIReceiveActor.h>
#include <Actors/NDIBroadcastActor.h>
#include <Framework/Application/SlateApplication.h>
#include <Misc/EngineVersionComparison.h>
#include "Widgets/NDIWidgets.h"
#define LOCTEXT_NAMESPACE "FNDIEditorModule"
#define IMAGE_BRUSH(RelativePath, ...) FSlateImageBrush(StyleInstance->RootToContentDir(RelativePath, TEXT(".png")), __VA_ARGS__)
#define PLACEMENT_CATEGORY TEXT("NDI(R)")
#define PLACEMENT_LOCTEXT NSLOCTEXT("Vizrt", "NDI", "NDI(R)")
#define PLACEMENT_TEXT TEXT("PMNDI")
void FNDIIOEditorModule::StartupModule()
{
const FName& CategoryName = PLACEMENT_CATEGORY;
IPlacementModeModule& PlacementModeModule = IPlacementModeModule::Get();
const FVector2D Icon20x20(20.0f, 20.0f);
const FVector2D Icon64x64(64.0f, 64.0f);
this->StyleInstance = MakeUnique<FSlateStyleSet>("NDIEditorStyle");
if (IPlugin* NDIIOPlugin = IPluginManager::Get().FindPlugin("NDIIOPlugin").Get())
{
StyleInstance->SetContentRoot(FPaths::Combine(NDIIOPlugin->GetContentDir(), TEXT("Editor/Icons")));
StyleInstance->Set("ClassThumbnail.NDIBroadcastActor", new IMAGE_BRUSH("NDIBroadcastActorIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIBroadcastActor", new IMAGE_BRUSH("NDIBroadcastActorIcon_x20", Icon20x20));
StyleInstance->Set("ClassThumbnail.NDIReceiveActor", new IMAGE_BRUSH("NDIReceiveActorIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIReceiveActor", new IMAGE_BRUSH("NDIReceiveActorIcon_x20", Icon20x20));
StyleInstance->Set("ClassThumbnail.NDIMediaReceiver", new IMAGE_BRUSH("NDIReceiverIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIMediaReceiver", new IMAGE_BRUSH("NDIReceiverIcon_x20", Icon20x20));
StyleInstance->Set("ClassThumbnail.NDIMediaSender", new IMAGE_BRUSH("NDISenderIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIMediaSender", new IMAGE_BRUSH("NDISenderIcon_x20", Icon20x20));
StyleInstance->Set("ClassThumbnail.NDIMediaSoundWave", new IMAGE_BRUSH("NDISoundWaveIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIMediaSoundWave", new IMAGE_BRUSH("NDISoundWaveIcon_x20", Icon20x20));
StyleInstance->Set("ClassThumbnail.NDIMediaTexture2D", new IMAGE_BRUSH("NDIVideoTextureIcon_x64", Icon64x64));
StyleInstance->Set("ClassIcon.NDIMediaTexture2D", new IMAGE_BRUSH("NDIVideoTextureIcon_x20", Icon20x20));
FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance.Get());
PlacementModeModule.RegisterPlacementCategory(
FPlacementCategoryInfo(
PLACEMENT_LOCTEXT,
CategoryName,
PLACEMENT_TEXT,
41, // FBuiltInPlacementCategories::Volumes() == 40
true
)
);
}
// Get the Registered Placement Category
if (const FPlacementCategoryInfo* PlacementCategoryInformation = PlacementModeModule.GetRegisteredPlacementCategory(CategoryName))
{
// Register the NDI Broadcast Actor a placeable item within the editor
PlacementModeModule.RegisterPlaceableItem(PlacementCategoryInformation->UniqueHandle, MakeShareable(
new FPlaceableItem(
*UActorFactory::StaticClass(),
#if (ENGINE_MAJOR_VERSION > 5) || ((ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 6)) // 5.6 or later
FAssetData(GetDefault<ANDIBroadcastActor>()),
#else
FAssetData(ANDIBroadcastActor::StaticClass()->ClassDefaultObject),
#endif
FName("ClassThumbnail.NDIBroadcastActor"),
NAME_None,
TOptional<FLinearColor>(),
10,
NSLOCTEXT("Vizrt", "NDIBroadcastActor", "NDI Broadcast Actor")
))
);
// Register the NDI Receive Actor a placeable item within the editor
PlacementModeModule.RegisterPlaceableItem(PlacementCategoryInformation->UniqueHandle, MakeShareable(
new FPlaceableItem(
*UActorFactory::StaticClass(),
#if (ENGINE_MAJOR_VERSION > 5) || ((ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 6)) // 5.6 or later
FAssetData(GetDefault<ANDIReceiveActor>()),
#else
FAssetData(ANDIReceiveActor::StaticClass()->ClassDefaultObject),
#endif
FName("ClassThumbnail.NDIReceiveActor"),
NAME_None,
TOptional<FLinearColor>(),
20,
NSLOCTEXT("Vizrt", "NDIReceiveActor", "NDI Receive Actor")
))
);
}
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.RegisterCustomPropertyTypeLayout(FNDIConnectionInformation::StaticStruct()->GetFName(), FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FNDIConnectionInformationCustomization::MakeInstance));
}
void FNDIIOEditorModule::ShutdownModule()
{
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.UnregisterCustomPropertyTypeLayout(FNDIConnectionInformation::StaticStruct()->GetFName());
FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance.Get());
StyleInstance.Reset();
IPlacementModeModule& PlacementModeModule = IPlacementModeModule::Get();
PlacementModeModule.UnregisterPlacementCategory(PLACEMENT_CATEGORY);
}
#undef PLACEMENT_CATEGORY
#undef PLACEMENT_LOCTEXT
#undef PLACEMENT_TEXT
#undef IMAGE_BRUSH
#undef LOCTEXT_NAMESPACE