// Copyright 2020 Phyronnaz #include "VoxelOpenAssetsOnStartup.h" #include "VoxelMinimal.h" #include "VoxelUtilities/VoxelConfigUtilities.h" #include "Editor.h" #include "Engine/World.h" #include "GameMapsSettings.h" #include "Containers/Ticker.h" #include "ContentBrowserModule.h" #include "Framework/MultiBox/MultiBoxBuilder.h" void UVoxelOpenAssetsOnStartup::Init() { FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateLambda([=](float) { GetMutableDefault()->ActualInit(); return false; })); } void UVoxelOpenAssetsOnStartup::ActualInit() { FVoxelConfigUtilities::LoadConfig(this, "OpenAssetsOnStartup"); if (bEnableOpenAssetsOnStartup) { for (auto& It : AssetsToOpenOnStartup) { if (!It.Value) { continue; } GEditor->GetEditorSubsystem()->OpenEditorForAsset(It.Key.ToString()); } } FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked(TEXT("ContentBrowser")); ContentBrowserModule.GetAllAssetViewContextMenuExtenders().Add(FContentBrowserMenuExtender_SelectedAssets::CreateLambda([=](const TArray& SelectedAssets) { const auto Extender = MakeShared(); if (bEnableOpenAssetsOnStartup && SelectedAssets.Num() == 1) { const auto Asset = SelectedAssets[0]; const FString Path = Asset.PackagePath.ToString() / Asset.AssetName.ToString(); Extender->AddMenuExtension( "CommonAssetActions", EExtensionHook::After, nullptr, FMenuExtensionDelegate::CreateLambda([=](FMenuBuilder& MenuBuilder) { MenuBuilder.AddMenuEntry( TAttribute::Create(TAttribute::FGetter::CreateLambda([=]() { return AssetsToOpenOnStartup.FindRef(*Path) ? VOXEL_LOCTEXT("Stop opening on startup") : VOXEL_LOCTEXT("Open on startup"); })), TAttribute(), FSlateIcon(NAME_None, NAME_None), FUIAction(FExecuteAction::CreateLambda([=]() { bool& bValue = AssetsToOpenOnStartup.FindOrAdd(*Path); bValue = !bValue; FVoxelConfigUtilities::SaveConfig(this, "OpenAssetsOnStartup"); }))); })); } if (bShowSetAsStartupMap && SelectedAssets.Num() == 1 && SelectedAssets[0].GetClass() == UWorld::StaticClass() && GetDefault()->EditorStartupMap != SelectedAssets[0].ToSoftObjectPath()) { const auto Asset = SelectedAssets[0]; Extender->AddMenuExtension( "CommonAssetActions", EExtensionHook::After, nullptr, FMenuExtensionDelegate::CreateLambda([=](FMenuBuilder& MenuBuilder) { MenuBuilder.AddMenuEntry( VOXEL_LOCTEXT("Set as editor startup map"), TAttribute(), FSlateIcon(NAME_None, NAME_None), FUIAction(FExecuteAction::CreateLambda([=]() { auto* Settings = GetMutableDefault(); Settings->EditorStartupMap = SelectedAssets[0].ToSoftObjectPath(); auto* Property = FindFProperty(UGameMapsSettings::StaticClass(), GET_MEMBER_NAME_CHECKED(UGameMapsSettings, EditorStartupMap)); Settings->UpdateSinglePropertyInConfigFile(Property, Settings->GetDefaultConfigFilename()); }))); })); } return Extender; })); }