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().Find( selector => selector.category == category ); // var selector = nextSelectedPage.Get(); 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.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 ); } }