using Godot; using System.Collections.Generic; namespace Rokojori { [Tool] [GlobalClass, Icon("res://addons/rokojori_action_library/Icons/UIInputIcon.svg")] public partial class UIInputInfo: UIRegion { InputIcon[] _inputIcons = new InputIcon[ 0 ]; [Export] public InputIcon[] inputIcons { get => _inputIcons; set { _inputIcons = value; UpdateInfo(); } } [Export] public LocalizedString locale; [Export] public bool upperCase; [Export] public bool updateInfo { get => false; set { if ( value ){ UpdateInfo(); }} } [Export] public DeviceFilter deviceFilter; // public override void _Ready() // { // UpdateInfo(); // } void UpdateInfo() { Nodes.RemoveAndDeleteChildren( this ); if ( inputIcons == null ) { return; } var iiLib = GetInputIconsLibrary(); if ( iiLib == null ) { this.LogInfo( "No Input lib!" ); return; } var icons = iiLib.ResolveIcons( inputIcons ); this.LogInfo( "Resolved Icons:\n", inputIcons, "\n>>\n", icons ); if ( deviceFilter != null ) { var iconsBefore = Lists.From( icons ); icons = Lists.Filter( icons, i => deviceFilter.BelongsToDevice( i ) ); this.LogInfo( "Device Filtered Icons:\n", iconsBefore, "\n>>\n", icons ); } icons = iiLib.ResolveIcons( icons.ToArray() ); icons.ForEach( i => AddIcon( i ) ); if ( locale != null ) { var localeText = this.CreateChild( "Locale" ); localeText.locale = locale; localeText.font = iiLib.font; localeText.fontSize = iiLib.fontSize; localeText.Uppercase = upperCase; localeText.marginLeft = UINumber.EM( 0.25f ); } } InputIconsLibrary GetInputIconsLibrary() { var ui = Unique.Get(); if ( ui == null ) { ui = this.FindParentThatIs(); if ( ui == null ) { this.LogInfo( "No UI in parents >", ui ); return null; } } var lib = ui.inputIconsLibrary; return lib; } void AddIcon( InputIcon inputIcon ) { if ( inputIcon == null ) { return; } var lib = GetInputIconsLibrary(); var id = lib.GetInputIconDefinition( inputIcon ); if ( id == null ) { this.LogInfo( "No definition found >> ", inputIcon ); return; } this.LogInfo( "Definition found >> ", inputIcon ); var iconRegion = this.CreateChild(); var elements = id.GetIconElementsForIcon( inputIcon ); elements.ForEach( e => AddElement( iconRegion, e, e == elements[ 0 ] ) ); } void AddElement( UIRegion iconRegion, IconElement element, bool isBG ) { var lib = GetInputIconsLibrary(); if ( element is TextureIconElement textureIconElement ) { var uiImage = iconRegion.CreateChild(); uiImage.Texture = textureIconElement.texture; uiImage.ExpandMode = TextureRect.ExpandModeEnum.IgnoreSize; uiImage.StretchMode = TextureRect.StretchModeEnum.Scale; uiImage.height = UINumber.EM( lib.iconHeightInEm ); if ( isBG ) { uiImage.width = UINumber.EM( lib.iconHeightInEm * textureIconElement.widthScale ); if ( textureIconElement.hasBorders ) { var ninePatchType = new NinePatchUIImageType(); ninePatchType.leftPixelOffset = textureIconElement.borderLeft; ninePatchType.rightPixelOffset = textureIconElement.borderRight; ninePatchType.topPixelOffset = textureIconElement.borderTop; ninePatchType.bottomPixelOffset = textureIconElement.borderBottom; uiImage.imageType = ninePatchType; } } else { var size = textureIconElement.texture.GetSize(); var ratio = size.X / size.Y; uiImage.width = UINumber.EM( lib.iconHeightInEm ).GetMultiplied( ratio ); uiImage.top = UINumber.EM( 0f ); uiImage.position = UIPosition.Parent_Anchor; if ( TextureIconOverlayAlignment.Left == textureIconElement.alignment ) { uiImage.left = UINumber.EM( 0f ); } if ( TextureIconOverlayAlignment.Right == textureIconElement.alignment ) { uiImage.right = UINumber.EM( 0f ); } } if ( textureIconElement.rotation != 0 ) { uiImage.rotation = UINumber.Create( textureIconElement.rotation ); } } else if ( element is LabelIconElement labelIconElement ) { var uiText = iconRegion.CreateChild(); uiText.font = lib.font; uiText.fontSize = labelIconElement.fontScale == 1 ? lib.fontSize : lib.fontSize.GetMultiplied( labelIconElement.fontScale ); uiText.locale = labelIconElement.locale; uiText.width = UINumber.PW( 100 ); uiText.height = UINumber.PH( 100 ); uiText.left = UINumber.EM( 0f ); uiText.top = UINumber.EM( 0f ); uiText.position = UIPosition.Parent_Anchor; uiText.alwaysMinimumSize = false; uiText.HorizontalAlignment = HorizontalAlignment.Center; uiText.VerticalAlignment = VerticalAlignment.Center; uiText.Uppercase = labelIconElement.fontIsUpperCase; } } } }