namespace Editor.ProjectSettingPages;
[Title( "Project Setup" )]
internal sealed class ProjectPage : ProjectInspector.Category
{
private class SelectorProperties
{
public string GameSupport { get; set; }
public string ParentGame { get; set; }
public string TargetGame { get; set; }
}
private SelectorProperties Properties { get; set; }
// These are used to screen the Package Ident before saving
[Title( "Title" )]
public string CurrentPackageTitle { get; set; }
[Title( "Package Ident" )]
public string CurrentPackageIdent { get; set; }
[Title( "Organization Ident" ), Editor( "organization" )]
public string CurrentPackageOrgIdent { get; set; }
///
/// Have we changed the parent package? If so, on save / exit we want to restart the editor
///
private bool HasChangedParentPackage { get; set; }
[Editor( "package:game" ), Title( "Supported Games" )]
public string GameSupport
{
get => Properties.GameSupport;
set
{
Properties.GameSupport = value;
Project.Config.Metadata["GameSupport"] = Properties.GameSupport
.Replace( "#local", "" )
.Split( ';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries ).ToList();
StateHasChanged();
}
}
[Editor( "package:game" ), Title( "Parent Game" )]
public string ParentGame
{
get => Properties.ParentGame;
set
{
Properties.ParentGame = value;
HasChangedParentPackage = true;
Project.Config.Metadata["ParentPackage"] = Properties.ParentGame;
StateHasChanged();
}
}
[Editor( "package:game" ), Title( "Target Game" )]
public string TargetGame
{
get => Properties.TargetGame;
set
{
Properties.TargetGame = value;
HasChangedParentPackage = true;
// Further down references will always favour the local version
Project.Config.Metadata["ParentPackage"] = Properties.TargetGame.Replace( "#local", "" );
StateHasChanged();
}
}
public override void OnInit( Project project )
{
base.OnInit( project );
CurrentPackageTitle = project.Config.Title;
CurrentPackageIdent = project.Config.Ident;
CurrentPackageOrgIdent = project.Config.Org;
Properties = new();
var cs = new ControlSheet();
{
{
var thisSerialized = this.GetSerialized();
cs.AddRow( thisSerialized.GetProperty( nameof( CurrentPackageTitle ) ) );
cs.AddRow( thisSerialized.GetProperty( nameof( CurrentPackageIdent ) ) );
cs.AddRow( thisSerialized.GetProperty( nameof( CurrentPackageOrgIdent ) ) );
ListenForChanges( thisSerialized );
}
}
//
// For targetting specific games or maps.
//
if ( project.Config.Type == "map" )
{
if ( project.Config.TryGetMeta>( "GameSupport", out var value ) )
{
Properties.GameSupport = string.Join( ';', value );
}
var section = StartSection( "Target Information" );
cs.AddProperty( this, x => x.GameSupport );
}
//
// Forking hell
//
if ( project.Config.Type == "game" )
{
if ( project.Config.TryGetMeta( "ParentPackage", out var value ) )
{
Properties.ParentGame = value;
}
cs.AddProperty( this, x => x.ParentGame );
}
BodyLayout.Add( cs );
//
// Game targeting extension
//
if ( project.Config.Type == "addon" )
{
if ( project.Config.TryGetMeta( "ParentPackage", out var value ) )
{
Properties.TargetGame = value;
}
BodyLayout.Add( new InformationBox( "Are you targeting a specific game? If so you can select a target game or put the ident of the target game here." ) );
var sheet = new ControlSheet();
sheet.AddProperty( this, x => x.TargetGame );
BodyLayout.Add( sheet );
}
}
public override void OnSave()
{
var type = Project.Config.Type;
if ( (type == "game" || type == "library") && CurrentPackageIdent != Project.Config.Ident )
{
bool sharesIdent = false;
// Make sure Libraries don't have the same ident as the game
if ( type == "library" ) sharesIdent = CurrentPackageIdent.ToLower() == Project.Current.Package.Ident.ToLower();
// Make sure Game/Libraries don't have the same ident as another library
if ( !sharesIdent ) sharesIdent = LibrarySystem.All.Any( x => x.Project.Package.Ident.ToLower() == CurrentPackageIdent.ToLower() );
if ( sharesIdent )
{
Dialog.AskConfirm( () =>
{
CurrentPackageIdent = Project.Config.Ident;
base.OnSave();
},
$"This Package cannot share it's Ident with another Package. Would you like to continue with the ident \"{Project.Config.Ident}\"?", "Error changing Package Ident", "OK", "Cancel" );
return;
}
}
Project.Config.Title = CurrentPackageTitle;
Project.Config.Ident = CurrentPackageIdent;
Project.Config.Org = CurrentPackageOrgIdent;
base.OnSave();
if ( HasChangedParentPackage )
{
EditorUtility.RestartEditorPrompt( "You need to restart the editor after changing the parent package." );
}
}
}