You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#jira UE-191438 #rb adam.kinge, zack.neyland [CL 31138198 by calvin zheng in ue5-main branch]
165 lines
7.0 KiB
C++
165 lines
7.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "XcodeProjectSettingsDetailsCustomization.h"
|
|
#include "XcodeProjectSettings.h"
|
|
#include "HAL/FileManager.h"
|
|
#include "DetailCategoryBuilder.h"
|
|
#include "DetailLayoutBuilder.h"
|
|
#include "DetailWidgetRow.h"
|
|
#include "Widgets/Input/SButton.h"
|
|
#include "SourceControlHelpers.h"
|
|
#include "Framework/Notifications/NotificationManager.h"
|
|
#include "Widgets/Notifications/SNotificationList.h"
|
|
#include "PropertyHandle.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "XcodeProjectSettings"
|
|
|
|
static constexpr FStringView kDefaultMacResourcesFolder(TEXTVIEW("Build/Mac/Resources/"));
|
|
static constexpr FStringView kDefaultIOSGeneratedFolder(TEXTVIEW("Build/IOS/UBTGenerated/"));
|
|
|
|
TSharedRef<IDetailCustomization> FXcodeProjectSettingsDetailsCustomization::MakeInstance()
|
|
{
|
|
return MakeShareable(new FXcodeProjectSettingsDetailsCustomization);
|
|
}
|
|
|
|
void FXcodeProjectSettingsDetailsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailLayout)
|
|
{
|
|
TemplateMacPlist = DetailLayout.GetProperty(GET_MEMBER_NAME_CHECKED(UXcodeProjectSettings, TemplateMacPlist));
|
|
TemplateIOSPlist = DetailLayout.GetProperty(GET_MEMBER_NAME_CHECKED(UXcodeProjectSettings, TemplateIOSPlist));
|
|
PremadeMacEntitlements = DetailLayout.GetProperty(GET_MEMBER_NAME_CHECKED(UXcodeProjectSettings, PremadeMacEntitlements));
|
|
ShippingEntitlements = DetailLayout.GetProperty(GET_MEMBER_NAME_CHECKED(UXcodeProjectSettings, ShippingSpecificMacEntitlements));
|
|
|
|
IDetailCategoryBuilder& PlistCategory = DetailLayout.EditCategory(TEXT("Plist Files"));
|
|
PlistCategory.AddCustomRow(LOCTEXT("InfoPlist", "Info.plist"), false)
|
|
.WholeRowWidget
|
|
[
|
|
SNew(SHorizontalBox)
|
|
+ SHorizontalBox::Slot()
|
|
.Padding(FMargin(0, 5, 0, 10))
|
|
.AutoWidth()
|
|
[
|
|
SNew(SButton)
|
|
.Text(LOCTEXT("RestoreInfoPlist", "Restore Info.plist to default"))
|
|
.ToolTipText(LOCTEXT("RestoreInfoPlistTooltip", "Revert to use default templates copied from Engine"))
|
|
.OnClicked(this, &FXcodeProjectSettingsDetailsCustomization::OnRestorePlistClicked)
|
|
]
|
|
];
|
|
|
|
IDetailCategoryBuilder& ShipEntitlementCategory = DetailLayout.EditCategory(TEXT("Entitlements"));
|
|
ShipEntitlementCategory.AddCustomRow(LOCTEXT("Entitlement", "Entitlement"), false)
|
|
.WholeRowWidget
|
|
[
|
|
SNew(SHorizontalBox)
|
|
+ SHorizontalBox::Slot()
|
|
.Padding(FMargin(0, 5, 0, 10))
|
|
.AutoWidth()
|
|
[
|
|
SNew(SButton)
|
|
.Text(LOCTEXT("RestoreEntitlements", "Restore entitlements to default"))
|
|
.ToolTipText(LOCTEXT("RestoreEntitlementsTooltip", "Revert to use default entitlements copied from Engine"))
|
|
.OnClicked(this, &FXcodeProjectSettingsDetailsCustomization::OnRestoreEntitlementClicked)
|
|
]
|
|
];
|
|
|
|
DetailLayout.SortCategories([](const TMap<FName, IDetailCategoryBuilder*>& CategoryMap)
|
|
{
|
|
for (const TPair<FName, IDetailCategoryBuilder*>& Pair : CategoryMap)
|
|
{
|
|
int32 SortOrder = Pair.Value->GetSortOrder();
|
|
const FName CategoryName = Pair.Key;
|
|
|
|
if (CategoryName == "Xcode")
|
|
{
|
|
SortOrder = 0;
|
|
}
|
|
else if(CategoryName == "Plist Files")
|
|
{
|
|
SortOrder = 1;
|
|
}
|
|
else if(CategoryName == "Entitlements")
|
|
{
|
|
SortOrder = 2;
|
|
}
|
|
else if(CategoryName == "Code Signing")
|
|
{
|
|
SortOrder = 3;
|
|
}
|
|
else if(CategoryName == "Privacy Manifests")
|
|
{
|
|
SortOrder = 4;
|
|
}
|
|
else
|
|
{
|
|
// Unknown category, should explicitly set order
|
|
ensureMsgf(false, TEXT("Unknown category %s in XcodeProjectSttings"), *CategoryName.ToString());
|
|
SortOrder = 999;
|
|
}
|
|
|
|
Pair.Value->SetSortOrder(SortOrder);
|
|
}
|
|
|
|
return;
|
|
});
|
|
}
|
|
|
|
FReply FXcodeProjectSettingsDetailsCustomization::OnRestorePlistClicked()
|
|
{
|
|
const UXcodeProjectSettings* Settings = GetDefault<UXcodeProjectSettings>();
|
|
|
|
// Copy the default plist template from Engine
|
|
FText ErrorMessage;
|
|
if (!SourceControlHelpers::CopyFileUnderSourceControl(FPaths::ProjectDir() + kDefaultMacResourcesFolder + TEXT("Info.Template.plist"),
|
|
FPaths::EngineDir() + kDefaultMacResourcesFolder + TEXT("Info.Template.plist"),
|
|
FText::FromString(TEXT("Info.Template.plist")),
|
|
/*out*/ ErrorMessage))
|
|
{
|
|
FNotificationInfo Info(ErrorMessage);
|
|
Info.ExpireDuration = 3.0f;
|
|
FSlateNotificationManager::Get().AddNotification(Info);
|
|
}
|
|
|
|
TemplateMacPlist->SetValueFromFormattedString(TEXT("(FilePath=\"/Game/") + (FString)kDefaultMacResourcesFolder + TEXT("Info.Template.plist\")"));
|
|
|
|
// No need to copy iOS template, it uses generated plist
|
|
|
|
TemplateIOSPlist->SetValueFromFormattedString(TEXT("(FilePath=\"/Game/") + (FString)kDefaultIOSGeneratedFolder + TEXT("Info.Template.plist\")"));
|
|
|
|
return FReply::Handled();
|
|
}
|
|
|
|
FReply FXcodeProjectSettingsDetailsCustomization::OnRestoreEntitlementClicked()
|
|
{
|
|
const UXcodeProjectSettings* Settings = GetDefault<UXcodeProjectSettings>();
|
|
|
|
// Copy the default entitlememt from Engine
|
|
FText ErrorMessage;
|
|
if (!SourceControlHelpers::CopyFileUnderSourceControl(FPaths::ProjectDir() + kDefaultMacResourcesFolder + TEXT("Sandbox.Server.entitlements"),
|
|
FPaths::EngineDir() + kDefaultMacResourcesFolder + TEXT("Sandbox.Server.entitlements"),
|
|
FText::FromString(TEXT("Sandbox.Server.entitlements")),
|
|
/*out*/ ErrorMessage))
|
|
{
|
|
FNotificationInfo Info(ErrorMessage);
|
|
Info.ExpireDuration = 3.0f;
|
|
FSlateNotificationManager::Get().AddNotification(Info);
|
|
}
|
|
|
|
PremadeMacEntitlements->SetValueFromFormattedString(TEXT("(FilePath=\"/Game/") + (FString)kDefaultMacResourcesFolder + TEXT("Sandbox.Server.entitlements\")"));
|
|
|
|
// Copy the default entitlememt from Engine
|
|
if (!SourceControlHelpers::CopyFileUnderSourceControl(FPaths::ProjectDir() + kDefaultMacResourcesFolder + TEXT("Sandbox.NoNet.entitlements"),
|
|
FPaths::EngineDir() + kDefaultMacResourcesFolder + TEXT("Sandbox.NoNet.entitlements"),
|
|
FText::FromString(TEXT("Sandbox.NoNet.entitlements")),
|
|
/*out*/ ErrorMessage))
|
|
{
|
|
FNotificationInfo Info(ErrorMessage);
|
|
Info.ExpireDuration = 3.0f;
|
|
FSlateNotificationManager::Get().AddNotification(Info);
|
|
}
|
|
|
|
ShippingEntitlements->SetValueFromFormattedString(TEXT("(FilePath=\"/Game/") + (FString)kDefaultMacResourcesFolder + TEXT("Sandbox.NoNet.entitlements\")"));
|
|
|
|
return FReply::Handled();
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE
|