using UnityEngine;
namespace UIWidgets {
///
/// TileView ScrollRect fitter. Resize ScrollRect to fit whole number of items.
///
[RequireComponent(typeof(ListViewBase))]
public class TileViewScrollRectFitter : MonoBehaviour {
ListViewBase tileView;
///
/// Gets the TileView.
///
/// The TileView.
public ListViewBase TileView {
get {
if (tileView==null)
{
tileView = GetComponent();
}
return tileView;
}
}
bool isStarted;
///
/// The base size delta.
///
protected Vector2 BaseSizeDelta;
///
/// The resize listener.
///
protected ResizeListener ResizeListener;
///
/// Start this instance.
///
public virtual void Start()
{
if (isStarted)
{
return ;
}
isStarted = true;
var scrollRect = TileView.GetScrollRect();
if (scrollRect!=null)
{
ResizeListener = scrollRect.GetComponent();
if (ResizeListener==null)
{
ResizeListener = scrollRect.gameObject.AddComponent();
}
BaseSizeDelta = (scrollRect.transform as RectTransform).sizeDelta;
ApplyFitter();
}
}
///
/// Add resize listener.
///
protected void ResizeListenerOn()
{
ResizeListener.OnResize.AddListener(ApplyFitter);
}
///
/// Remove resize listener.
///
protected void ResizeListenerOff()
{
ResizeListener.OnResize.RemoveListener(ApplyFitter);
}
///
/// Applies the fitter.
///
public virtual void ApplyFitter()
{
ResizeListenerOff();
var scrollRect = TileView.GetScrollRect();
var scrollRectTransform = scrollRect.transform as RectTransform;
var size = scrollRectTransform.rect.size;
size += BaseSizeDelta - scrollRectTransform.sizeDelta;
var item_width = TileView.GetDefaultItemWidth();
var items_in_row = Mathf.Max(1, Mathf.FloorToInt(size.x / item_width));
var required_width = items_in_row * (item_width + TileView.GetItemSpacing());
if (size.x!=required_width)
{
scrollRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, required_width);
}
var item_height = TileView.GetDefaultItemHeight();
var items_in_column = Mathf.Max(1, Mathf.FloorToInt(size.y / item_height));
var required_height = items_in_column * (item_height + TileView.GetItemSpacing());
if (size.y!=required_height)
{
scrollRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, required_height);
}
ResizeListenerOn();
}
///
/// This function is called when the MonoBehaviour will be destroyed.
///
public virtual void OnDestroy()
{
if (ResizeListener!=null)
{
ResizeListenerOff();
}
}
}
}