using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using VketCloudGUITools.Utilities;
namespace VketCloudGUITools.Runtime
{
///
/// HeliodorのCSlider相当
/// UnityのSliderの機能制限によって実装
///
[RequireComponent(typeof(VCTransform))]
[RequireComponent(typeof(Slider))]
public class VCSlider : MonoBehaviour, IVCGUIItem, IHasStateToggleList, IHasVCTransform
{
[SerializeField] private VCLayerList _parentLayer;
[SerializeField] protected VCTransform _vcTransform;
[SerializeField] private bool _visible = false;
[SerializeField] protected Slider _slider = null;
[SerializeField] private bool _sliderEnable = true;
[SerializeField] protected List _toggleList = new List();
public VCTransform VcTransform => this.GetRequiredComponent(ref _vcTransform);
protected VCLayerList ParentLayer => _parentLayer;
public Slider Slider => this.GetRequiredComponent(ref _slider);
public bool Visible
{
get => _visible;
set
{
if (_visible != value)
{
_visible = value;
OnVisibleChanged();
}
}
}
public bool SliderEnable
{
get => _sliderEnable;
set
{
if (_sliderEnable != value)
{
_sliderEnable = value;
OnVisualStateChanged();
}
}
}
public List ToggleList
{
get => _toggleList;
set => _toggleList = value;
}
///
/// スライダーの背景画像
///
public Sprite BaseSprite
{
get => unityBaseImage != null ? unityBaseImage.sprite : null;
set
{
if (unityBaseImage != null)
unityBaseImage.sprite = value;
}
}
///
/// スライダーの伸びる棒の画像
///
public Sprite FrontSprite
{
get => unityFrontImage != null ? unityFrontImage.sprite : null;
set
{
if (unityFrontImage != null)
unityFrontImage.sprite = value;
}
}
///
/// スライダーが操作可能なときの画像
///
public Sprite OnHandleSprite
{
get => unityHandleImage != null ? unityHandleImage.sprite : null;
set
{
if (unityHandleImage != null)
unityHandleImage.sprite = value;
}
}
///
/// スライダーが操作不能なときの画像
///
[SerializeField] public Sprite OffHandleSprite;
///
/// 背景画像コンポーネント
///
[SerializeField] public Image unityBaseImage;
///
/// 前景(スライダーの伸びる棒)画像コンポーネント
///
[SerializeField] public Image unityFrontImage;
///
/// 掴むところ画像コンポーネント
///
[SerializeField] public Image unityHandleImage;
///
/// 連動する変数名
///
[Tooltip("連動する変数名")]
[SerializeField] public string DriveField;
public float Value
{
get => Slider.value;
set => Slider.value = value;
}
private Sprite _onHandleSpriteBackup = null;
///
/// 有効化時
///
private void OnEnable()
{
Slider.onValueChanged.AddListener(OnValueChanged);
if (unityHandleImage != null)
{
_onHandleSpriteBackup = unityHandleImage.sprite;
}
}
///
/// 無効化時
///
private void OnDisable()
{
Slider.onValueChanged.RemoveListener(OnValueChanged);
}
private void OnValueChanged(float value)
{
if (ParentLayer.ParentCanvas != null)
ParentLayer.ParentCanvas.OnSliderValueChanged(this, value);
}
public void InitializePostAddComponent(Image backgroundImage, Image fillImage, Image handleImage, RectTransform fillRect, RectTransform handleRect)
{
this.Slider.fillRect = fillRect;
this.Slider.handleRect = handleRect;
this.Slider.targetGraphic = handleImage;
this.Slider.direction = Slider.Direction.LeftToRight;
this.Slider.transition = Selectable.Transition.SpriteSwap;
unityBaseImage = backgroundImage;
unityFrontImage = fillImage;
unityHandleImage = handleImage;
_onHandleSpriteBackup = unityHandleImage.sprite;
}
///
/// 必須Component参照を解決
///
public virtual void ResolveRequireComponents()
{
this.GetRequiredComponent(ref _vcTransform);
}
public void OnResolveReferences(VCLayerList parentLayer)
{
_parentLayer = parentLayer;
ResolveRequireComponents();
}
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);
}
public void OnParentLayerShowChanged()
{
UpdateVisible();
}
private void OnVisibleChanged()
{
OnVisualStateChanged();
}
internal void OnVisualStateChanged()
{
if (unityBaseImage != null)
unityBaseImage.enabled = _visible && Show;
if (unityFrontImage != null)
unityFrontImage.enabled = _visible && Show && SliderEnable;
if (unityHandleImage != null)
unityHandleImage.enabled = _visible && Show && SliderEnable;
if (Visible)
{
if (unityHandleImage != null)
unityHandleImage.overrideSprite = SliderEnable ? _onHandleSpriteBackup : OffHandleSprite;
}
}
#if UNITY_EDITOR
protected virtual void Reset()
{
ResolveRequireComponents();
}
#endif
public virtual bool IsValid()
{
return false;
}
public bool Show
{
get => gameObject.activeSelf;
set
{
if (gameObject.activeSelf != value)
{
gameObject.SetActive(value);
UpdateVisible();
}
}
}
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 void ToggleChange(string name)
{
StateToggleListUtility.CommonToggleChange(this, this, name);
}
public void ToggleDefault(string name)
{
StateToggleListUtility.CommonToggleDefault(this, this, name);
}
}
}