using System; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEditor; using UnityEngine; using UnityEngine.UI; using VketCloudGUITools.Utilities; using System.Linq; using VketCloudGUITools.Serialization; namespace VketCloudGUITools.Runtime { [RequireComponent(typeof(VCTransform))] [RequireComponent(typeof(Image))] [RequireComponent(typeof(Button))] public class VCButton : MonoBehaviour, IHasVCTransform, IVCGUIItem, IHasStateToggleList { [SerializeField] private VCLayerList _parentLayer = null; [SerializeField] private VCTransform _vcTransform = null; [SerializeField] private Button _button = null; [SerializeField] private bool _visible = false; [SerializeField] private List _toggleList = new List(); [SerializeField] public List GUIActions = new List(); [SerializeField] public List UVArea = null; [SerializeField] public List ClickAreaSize = null; [SerializeField] public List LTRB = null; [SerializeField] public Sprite ClickAreaImage = null; [SerializeField] public Flick Flick = null; [SerializeField] public List OnKeyDownMulColor = null; [SerializeField] public List UVAreaRate = null; public VCTransform VcTransform => this.GetRequiredComponent(ref _vcTransform); public VCLayerList ParentLayer => _parentLayer; public Button Button => this.GetRequiredComponent(ref _button); public Sprite DefaultImage { get => Button.image.sprite; set => Button.image.sprite = value; } public Sprite OnCursorImage { get => Button.spriteState.highlightedSprite; set { var tempSpriteState = Button.spriteState; tempSpriteState.highlightedSprite = value; Button.spriteState = tempSpriteState; } } public Sprite DownImage { get => Button.spriteState.selectedSprite; set { var tempSpriteState = Button.spriteState; tempSpriteState.selectedSprite = value; Button.spriteState = tempSpriteState; } } public bool IsValid() => false; public bool Visible { get => _visible; private set { if (_visible != value) { _visible = value; OnVisibleChanged(); } } } public bool Show { get => gameObject.activeSelf; set { if (gameObject.activeSelf != value) { gameObject.SetActive(value); UpdateVisible(); } } } public string Name { get => gameObject.name; set => gameObject.name = value; } public Vector2Int Pos { get => VcTransform.Pos; set { VcTransform.Pos = value; VcTransform.ApplyTransform(); } } public Vector2Int Size { get => VcTransform.Size; set { VcTransform.Size = value; VcTransform.ApplyTransform(); } } public int Z { get => VcTransform.Z; set { VcTransform.Z = value; VcTransform.ApplyTransform(); } } public Vector3Int Pos3D { get => VcTransform.Pos3D; set { VcTransform.Pos3D = value; VcTransform.ApplyTransform(); } } public List ToggleList { get => _toggleList; set => _toggleList = value; } private void OnEnable() { Button.onClick.AddListener(OnClick); } private void OnDisable() { Button.onClick.RemoveListener(OnClick); } public void OnClick() { ParentLayer.ParentCanvas.OnButtonPress(this, GUIActions); } public void OnResolveReferences(VCLayerList parentLayer) { _parentLayer = parentLayer; ResolveRequireComponents(); } public void ResolveRequireComponents() { this.GetRequiredComponent(ref _vcTransform); this.GetRequiredComponent(ref _button); } public void ApplyDefaultToButton() { Button.transition = Selectable.Transition.SpriteSwap; } public void OnParentLayerShowChanged() { UpdateVisible(); } public void UpdateVisible() { // Visibleフラグは、heliodorとの互換性のための表示状態管理フラグです。 // https://hikky.atlassian.net/wiki/spaces/VKETCLOUD/pages/530317633/Canvas+Show Visible = Show && ToggleList.IsAllTrue() && (ParentLayer != null ? ParentLayer.Show : true); } private void OnVisibleChanged() { if (_button != null) _button.image.enabled = _visible; } public void ToggleChange(string name) { StateToggleListUtility.CommonToggleChange(this, this, name); } public void ToggleDefault(string name) { StateToggleListUtility.CommonToggleDefault(this, this, name); } #if UNITY_EDITOR /// /// Editor用:AddComponent時、およびInspectorのContextMenuからのReset時 /// 必須コンポーネントの参照を得る /// public void Reset() { this.GetRequiredComponent(ref _vcTransform); this.GetRequiredComponent(ref _button); //GUIActionsのコピーを判定 EditorApplication.delayCall += () => { if(this.GUIActions.Count > 0) { var origin = this.GUIActions; var clone = origin.Select(item => item.Clone() as GUIActionListItem); this.GUIActions = clone.ToList(); } }; } #endif } }