You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.2 KiB
C#
115 lines
2.2 KiB
C#
4 weeks ago
|
using System;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
namespace Projectiles.UI
|
||
|
{
|
||
|
public sealed class UIListItem : UIListItemBase<MonoBehaviour>
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public abstract class UIListItemBase<T> : UIBehaviour where T : MonoBehaviour
|
||
|
{
|
||
|
// PUBLIC MEMBERS
|
||
|
|
||
|
public int Id { get; set; }
|
||
|
public T Content => _content;
|
||
|
public bool IsSelectable => _button != null;
|
||
|
public bool IsSelected { get { return _isSelected; } set { SetIsSelected(value); } }
|
||
|
public bool IsInteractable { get { return GetIsInteractable(); } set { SetIsInteractable(value); } }
|
||
|
|
||
|
public Action<int> Clicked;
|
||
|
|
||
|
// PRIVATE MEMBERS
|
||
|
|
||
|
[SerializeField]
|
||
|
private Button _button;
|
||
|
[SerializeField]
|
||
|
private Animator _animator;
|
||
|
[SerializeField]
|
||
|
private T _content;
|
||
|
[SerializeField]
|
||
|
private string _selectedAnimatorParameter = "IsSelected";
|
||
|
[SerializeField]
|
||
|
private CanvasGroup _selectedGroup;
|
||
|
[SerializeField]
|
||
|
private CanvasGroup _deselectedGroup;
|
||
|
|
||
|
private bool _isSelected;
|
||
|
|
||
|
// MONOBEHAVIOR
|
||
|
|
||
|
protected virtual void Awake()
|
||
|
{
|
||
|
SetIsSelected(false, true);
|
||
|
|
||
|
if (_button != null)
|
||
|
{
|
||
|
_button.onClick.AddListener(OnClick);
|
||
|
}
|
||
|
|
||
|
if (_button != null && _button.transition == Selectable.Transition.Animation)
|
||
|
{
|
||
|
_animator = _button.animator;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected virtual void OnDestroy()
|
||
|
{
|
||
|
Clicked = null;
|
||
|
|
||
|
if (_button != null)
|
||
|
{
|
||
|
_button.onClick.RemoveListener(OnClick);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// PRIVATE METHODS
|
||
|
|
||
|
private void SetIsSelected(bool value, bool force = false)
|
||
|
{
|
||
|
if (_isSelected == value && force == false)
|
||
|
return;
|
||
|
|
||
|
_isSelected = value;
|
||
|
|
||
|
_selectedGroup.SetVisibility(value);
|
||
|
_deselectedGroup.SetVisibility(value == false);
|
||
|
|
||
|
UpdateAnimator();
|
||
|
}
|
||
|
|
||
|
private bool GetIsInteractable()
|
||
|
{
|
||
|
return _button != null ? _button.interactable : false;
|
||
|
}
|
||
|
|
||
|
private void SetIsInteractable(bool value)
|
||
|
{
|
||
|
if (_button == null)
|
||
|
return;
|
||
|
|
||
|
_button.interactable = value;
|
||
|
}
|
||
|
|
||
|
private void OnClick()
|
||
|
{
|
||
|
Clicked?.Invoke(Id);
|
||
|
}
|
||
|
|
||
|
private void UpdateAnimator()
|
||
|
{
|
||
|
if (_animator == null)
|
||
|
return;
|
||
|
|
||
|
if (_selectedAnimatorParameter.HasValue() == false)
|
||
|
return;
|
||
|
|
||
|
if (_animator != null)
|
||
|
{
|
||
|
_animator.SetBool(_selectedAnimatorParameter, _isSelected);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|