using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace TheraBytes.BetterUi
{
[HelpURL("https://documentation.therabytes.de/better-ui/BetterScrollRect.html")]
[AddComponentMenu("Better UI/Controls/Better Scroll Rect", 30)]
public class BetterScrollRect : ScrollRect, IResolutionDependency
{
#if UNITY_5_5_OR_NEWER
///
/// Exposes the "m_ContentStartPosition" variable which is used as reference position during drag.
/// It is a variable of the base ScrollRect class which is not accessible by default.
/// Use the setter at your own risk.
///
public Vector2 DragStartPosition
{
get { return base.m_ContentStartPosition; }
set { base.m_ContentStartPosition = value; }
}
///
/// Exposes the "m_ContentBounds" variable which is used to evaluate the size of the content.
/// It is a variable of the base ScrollRect class which is not accessible by default.
/// Use ther setter at your own risk.
///
public Bounds ContentBounds
{
get { return base.m_ContentBounds; }
set { base.m_ContentBounds = value; }
}
#endif
public float HorizontalStartPosition
{
get { return this.horizontalStartPosition; }
set { this.horizontalStartPosition = value; }
}
public float VerticalStartPosition
{
get { return this.verticalStartPosition; }
set { this.verticalStartPosition = value; }
}
public new float horizontalScrollbarSpacing
{
get { return base.horizontalScrollbarSpacing; }
set { Config.Set(value, (o) => base.horizontalScrollbarSpacing = o, (o) => HorizontalSpacingSizer.SetSize(this, o)); }
}
public new float verticalScrollbarSpacing
{
get { return base.verticalScrollbarSpacing; }
set { Config.Set(value, (o) => base.verticalScrollbarSpacing = o, (o) => VerticalSpacingSizer.SetSize(this, o)); }
}
public FloatSizeModifier HorizontalSpacingSizer { get { return customHorizontalSpacingSizers.GetCurrentItem(horizontalSpacingFallback); } }
public FloatSizeModifier VerticalSpacingSizer { get { return customVerticalSpacingSizers.GetCurrentItem(verticalSpacingFallback); } }
[SerializeField]
[Range(0, 1)]
float horizontalStartPosition = 0;
[SerializeField]
[Range(0, 1)]
float verticalStartPosition = 1;
[SerializeField]
FloatSizeModifier horizontalSpacingFallback = new FloatSizeModifier(-3, -500, 500);
[SerializeField]
FloatSizeConfigCollection customHorizontalSpacingSizers = new FloatSizeConfigCollection();
[SerializeField]
FloatSizeModifier verticalSpacingFallback = new FloatSizeModifier(-3, -500, 500);
[SerializeField]
FloatSizeConfigCollection customVerticalSpacingSizers = new FloatSizeConfigCollection();
protected override void OnEnable()
{
base.OnEnable();
CalculateSize();
}
public void OnResolutionChanged()
{
CalculateSize();
}
protected override void Start()
{
base.Start();
if(Application.isPlaying)
{
ResetToStartPosition();
}
}
public void ResetToStartPosition()
{
if (horizontalScrollbar != null)
{
horizontalScrollbar.value = horizontalStartPosition;
}
else if (horizontal)
{
horizontalNormalizedPosition = horizontalStartPosition;
}
if (verticalScrollbar != null)
{
verticalScrollbar.value = verticalStartPosition;
}
else if (vertical)
{
verticalNormalizedPosition = verticalStartPosition;
}
}
private void CalculateSize()
{
base.horizontalScrollbarSpacing = HorizontalSpacingSizer.CalculateSize(this);
base.verticalScrollbarSpacing = VerticalSpacingSizer.CalculateSize(this);
}
#if UNITY_EDITOR
protected override void OnValidate()
{
CalculateSize();
base.OnValidate();
}
#endif
}
}