rokojori_action_library/Runtime/UI/UIAppSettings/UIAppSettings.cs

171 lines
3.3 KiB
C#
Raw Normal View History

2026-02-26 14:06:27 +00:00
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 );
}
}