namespace UIWidgets
{
using System;
using System.Collections.Generic;
using UnityEngine;
///
/// Snap grid.
///
public class SnapGrid : SnapGridBase
{
///
/// Margin.
///
[SerializeField]
protected Vector2 padding = new Vector2(0f, 0f);
///
/// Padding.
/// Distance from border to the first line.
///
public Vector2 Padding
{
get
{
return padding;
}
set
{
if (padding != value)
{
padding = value;
UpdateLines();
}
}
}
///
/// Grid step.
///
[SerializeField]
protected Vector2 step = new Vector2(10f, 10f);
///
/// Grid step.
///
public Vector2 Step
{
get
{
return step;
}
set
{
if (step != value)
{
step = value;
UpdateLines();
}
}
}
///
/// Spacing.
///
[SerializeField]
protected Vector2 spacing = Vector2.zero;
///
/// Spacing.
///
public Vector2 Spacing
{
get
{
return spacing;
}
set
{
if (spacing != value)
{
spacing = value;
UpdateLines();
}
}
}
///
/// Snap to spacing.
///
[SerializeField]
protected bool snapToSpacing = false;
///
/// Snap to spacing.
///
public bool SnapToSpacing
{
get
{
return snapToSpacing;
}
set
{
if (snapToSpacing != value)
{
snapToSpacing = value;
UpdateLines();
}
}
}
///
protected override void UpdateLines()
{
var size = RectTransform.rect.size;
LinesX.Clear();
if (SnapToSpacing || (Spacing.x == 0f))
{
CalculateLinesWithSnapSpacing(size.x, Padding.x, Step.x, Spacing.x, LineX.Create, LinesX);
}
else
{
CalculateLines(size.x, Padding.x, Step.x, Spacing.x, LineX.Create, LinesX);
}
LinesY.Clear();
if (SnapToSpacing || (Spacing.y == 0f))
{
CalculateLinesWithSnapSpacing(size.y, Padding.y, Step.y, Spacing.y, LineY.Create, LinesY);
}
else
{
CalculateLines(size.y, Padding.y, Step.y, Spacing.y, LineY.Create, LinesY);
}
OnLinesChanged.Invoke();
}
///
/// Calculate lines.
///
/// Line type.
/// Size.
/// Margin.
/// Step.
/// Spacing.
/// Line constructor.
/// Result list.
protected virtual void CalculateLines(float size, float margin, float step, float spacing, Func constructor, List output)
{
if (step <= 0f)
{
return;
}
var value = 0f;
size -= margin;
if (margin > 0f)
{
value += margin;
if (value < size)
{
output.Add(constructor(value, true, false));
}
value += step;
if (value < size)
{
output.Add(constructor(value, false, true));
}
if (spacing > 0f)
{
value += spacing;
if (value < size)
{
output.Add(constructor(value, true, false));
}
}
}
do
{
value += step;
if (value >= size)
{
break;
}
output.Add(constructor(value, false, true));
if (spacing > 0f)
{
value += spacing;
if (value >= size)
{
break;
}
output.Add(constructor(value, true, false));
}
}
while (true);
}
///
/// Calculate lines with snap spacing.
///
/// Line type.
/// Size.
/// Margin.
/// Step.
/// Spacing.
/// Line constructor.
/// Result list.
protected virtual void CalculateLinesWithSnapSpacing(float size, float margin, float step, float spacing, Func constructor, List output)
{
if (step <= 0f)
{
return;
}
var value = 0f;
size -= margin;
if (margin > 0f)
{
value += margin;
if (value < size)
{
output.Add(constructor(value, true, true));
}
}
do
{
value += step;
if (value >= size)
{
break;
}
output.Add(constructor(value, true, true));
if (spacing > 0)
{
value += spacing;
if (value >= size)
{
break;
}
output.Add(constructor(value, true, true));
}
}
while (true);
}
}
}