171 lines
3.3 KiB
C#
171 lines
3.3 KiB
C#
|
|
using Godot;
|
|
using Rokojori;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Rokojori;
|
|
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class UIAppSettings:UIRegion
|
|
{
|
|
[ExportToolButton( "Create App Settings UI")]
|
|
public Callable createAppSettingsUI => Callable.From(
|
|
()=>
|
|
{
|
|
CreateAppSettingsUI();
|
|
}
|
|
);
|
|
|
|
[Export]
|
|
public AppSettings appSettings;
|
|
|
|
[Export]
|
|
public UIAppSettingsGenerator generator;
|
|
|
|
public enum MenuChangeMode
|
|
{
|
|
None,
|
|
Clamped,
|
|
Wrapped
|
|
}
|
|
|
|
[Export]
|
|
public MenuChangeMode menuChangeMode = MenuChangeMode.Wrapped;
|
|
|
|
[Export]
|
|
public Action onConfirm;
|
|
|
|
[Export]
|
|
public Action onCancel;
|
|
|
|
[Export]
|
|
public Action onReady;
|
|
|
|
|
|
[ExportGroup( "References")]
|
|
|
|
[Export]
|
|
public Node background = null;
|
|
|
|
[Export]
|
|
public UIAppSettingsHeader header = null;
|
|
|
|
[Export]
|
|
public UIAppSettingsCategoryPage[] pages = [];
|
|
|
|
|
|
|
|
public override void _Process( double delta )
|
|
{
|
|
ProcessMenuInputs();
|
|
ProcessMainInputs();
|
|
}
|
|
|
|
void ProcessMenuInputs()
|
|
{
|
|
if ( MenuChangeMode.None == menuChangeMode )
|
|
{
|
|
return;
|
|
}
|
|
|
|
var settings = GetUI().settings;
|
|
var wrapped = MenuChangeMode.Wrapped == menuChangeMode;
|
|
|
|
if ( settings == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( settings.uiPreviousMenu?.isDown ?? false )
|
|
{
|
|
ChangeMenu( -1, wrapped );
|
|
}
|
|
|
|
if ( settings.uiNextMenu?.isDown ?? false )
|
|
{
|
|
ChangeMenu( 1, wrapped );
|
|
}
|
|
|
|
}
|
|
|
|
void ProcessMainInputs()
|
|
{
|
|
var settings = GetUI().settings;
|
|
|
|
if ( settings == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( settings.uiConfirm?.isDown ?? false )
|
|
{
|
|
onConfirm?.Trigger();
|
|
onReady?.Trigger();
|
|
}
|
|
|
|
if ( settings.uiCancel?.isDown ?? false )
|
|
{
|
|
onCancel?.Trigger();
|
|
onReady?.Trigger();
|
|
}
|
|
|
|
}
|
|
|
|
void ChangeMenu( int offset, bool wrap )
|
|
{
|
|
var selectedPageIndex = pages.FindIndex( p => p.Visible );
|
|
var nextIndex = selectedPageIndex + offset;
|
|
|
|
nextIndex = wrap ? MathX.Repeat( nextIndex, pages.Length ) : Mathf.Clamp( nextIndex, 0, pages.Length -1 );
|
|
|
|
|
|
var nextSelectedPage = pages[ nextIndex ];
|
|
var category = nextSelectedPage.category;
|
|
|
|
var selector = header.GetAll<SelectSettingsPage>().Find( selector => selector.category == category );
|
|
// var selector = nextSelectedPage.Get<SelectSettingsPage>();
|
|
|
|
this.LogInfo(
|
|
"SelectedPageIndex:", selectedPageIndex, "nextIndex:", nextIndex,
|
|
HierarchyName.Of( nextSelectedPage ),
|
|
HierarchyName.Of( selector )
|
|
);
|
|
|
|
selector.Trigger();
|
|
}
|
|
|
|
void CreateAppSettingsUI()
|
|
{
|
|
this.DestroyChildren();
|
|
|
|
background = null;
|
|
header = null;
|
|
pages = [];
|
|
|
|
var resolvedSettings = appSettings ?? Unique<App>.Get().settings;
|
|
|
|
background = generator.background.GenerateBackground( this ) as Node;
|
|
|
|
resolvedSettings.categories.ForEach( CreateCategory );
|
|
|
|
CreateHeader( resolvedSettings );
|
|
|
|
|
|
|
|
pages.ForEach( p => p.SetVisibility( p.category == appSettings.categories[ 0 ] ) );
|
|
}
|
|
|
|
void CreateHeader( AppSettings settings )
|
|
{
|
|
header = generator.header.GenerateHeader( this, settings );
|
|
}
|
|
|
|
void CreateCategory( AppSettingsCategory category )
|
|
{
|
|
var page = generator.catergoryPage.GenerateCategoryPage( this, category );
|
|
pages = pages.Add( page );
|
|
}
|
|
}
|