Minor fixes and additions

Updates to resolve reports in Issue #80

--HG--
branch : develop_5.3
release
Simon Jackson 2016-12-29 22:03:04 +00:00
parent 3e0d105646
commit f0ba3cfae5
6 changed files with 98 additions and 134 deletions

View File

@ -7,8 +7,8 @@ using UnityEngine.EventSystems;
namespace UnityEngine.UI.Extensions
{
[AddComponentMenu("UI/BoxSlider", 35)]
[RequireComponent(typeof(RectTransform))]
[AddComponentMenu("UI/Extensions/BoxSlider")]
public class BoxSlider : Selectable, IDragHandler, IInitializePotentialDragHandler, ICanvasElement
{
public enum Direction
@ -30,15 +30,15 @@ namespace UnityEngine.UI.Extensions
[SerializeField]
private float m_MinValue = 0;
public float MinValue { get { return m_MinValue; } set { if (SetStruct(ref m_MinValue, value)) { Set(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
public float MinValue { get { return m_MinValue; } set { if (SetStruct(ref m_MinValue, value)) { SetX(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
[SerializeField]
private float m_MaxValue = 1;
public float MaxValue { get { return m_MaxValue; } set { if (SetStruct(ref m_MaxValue, value)) { Set(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
public float MaxValue { get { return m_MaxValue; } set { if (SetStruct(ref m_MaxValue, value)) { SetX(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
[SerializeField]
private bool m_WholeNumbers = false;
public bool WholeNumbers { get { return m_WholeNumbers; } set { if (SetStruct(ref m_WholeNumbers, value)) { Set(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
public bool WholeNumbers { get { return m_WholeNumbers; } set { if (SetStruct(ref m_WholeNumbers, value)) { SetX(m_ValueX); SetY(m_ValueY); UpdateVisuals(); } } }
[SerializeField]
private float m_ValueX = 1f;
@ -52,7 +52,7 @@ namespace UnityEngine.UI.Extensions
}
set
{
Set(value);
SetX(value);
}
}
@ -109,9 +109,6 @@ namespace UnityEngine.UI.Extensions
// Private fields
//private Image m_FillImage;
//private Transform m_FillTransform;
//private RectTransform m_FillContainerRect;
private Transform m_HandleTransform;
private RectTransform m_HandleContainerRect;
@ -137,7 +134,7 @@ namespace UnityEngine.UI.Extensions
m_MaxValue = Mathf.Round(m_MaxValue);
}
UpdateCachedReferences();
Set(m_ValueX, false);
SetX(m_ValueX, false);
SetY(m_ValueY, false);
// Update rects since other things might affect them even if value didn't change.
UpdateVisuals();
@ -189,7 +186,7 @@ namespace UnityEngine.UI.Extensions
{
base.OnEnable();
UpdateCachedReferences();
Set(m_ValueX, false);
SetX(m_ValueX, false);
SetY(m_ValueY, false);
// Update rects since they need to be initialized correctly.
UpdateVisuals();
@ -217,12 +214,12 @@ namespace UnityEngine.UI.Extensions
}
// Set the valueUpdate the visible Image.
void Set(float input)
void SetX(float input)
{
Set(input, true);
SetX(input, true);
}
void Set(float input, bool sendCallback)
void SetX(float input, bool sendCallback)
{
// Clamp the input
float newValue = Mathf.Clamp(input, MinValue, MaxValue);
@ -320,14 +317,14 @@ namespace UnityEngine.UI.Extensions
}
}
private bool MayDrag(PointerEventData eventData)
private bool CanDrag(PointerEventData eventData)
{
return IsActive() && IsInteractable() && eventData.button == PointerEventData.InputButton.Left;
}
public override void OnPointerDown(PointerEventData eventData)
{
if (!MayDrag(eventData))
if (!CanDrag(eventData))
return;
base.OnPointerDown(eventData);
@ -349,85 +346,12 @@ namespace UnityEngine.UI.Extensions
public virtual void OnDrag(PointerEventData eventData)
{
if (!MayDrag(eventData))
if (!CanDrag(eventData))
return;
UpdateDrag(eventData, eventData.pressEventCamera);
}
//public override void OnMove(AxisEventData eventData)
//{
// if (!IsActive() || !IsInteractable())
// {
// base.OnMove(eventData);
// return;
// }
// switch (eventData.moveDir)
// {
// case MoveDirection.Left:
// if (axis == Axis.Horizontal && FindSelectableOnLeft() == null) {
// Set(reverseValue ? value + stepSize : value - stepSize);
// SetY (reverseValue ? valueY + stepSize : valueY - stepSize);
// }
// else
// base.OnMove(eventData);
// break;
// case MoveDirection.Right:
// if (axis == Axis.Horizontal && FindSelectableOnRight() == null) {
// Set(reverseValue ? value - stepSize : value + stepSize);
// SetY(reverseValue ? valueY - stepSize : valueY + stepSize);
// }
// else
// base.OnMove(eventData);
// break;
// case MoveDirection.Up:
// if (axis == Axis.Vertical && FindSelectableOnUp() == null) {
// Set(reverseValue ? value - stepSize : value + stepSize);
// SetY(reverseValue ? valueY - stepSize : valueY + stepSize);
// }
// else
// base.OnMove(eventData);
// break;
// case MoveDirection.Down:
// if (axis == Axis.Vertical && FindSelectableOnDown() == null) {
// Set(reverseValue ? value + stepSize : value - stepSize);
// SetY(reverseValue ? valueY + stepSize : valueY - stepSize);
// }
// else
// base.OnMove(eventData);
// break;
// }
//}
//public override Selectable FindSelectableOnLeft()
//{
// if (navigation.mode == Navigation.Mode.Automatic && axis == Axis.Horizontal)
// return null;
// return base.FindSelectableOnLeft();
//}
//public override Selectable FindSelectableOnRight()
//{
// if (navigation.mode == Navigation.Mode.Automatic && axis == Axis.Horizontal)
// return null;
// return base.FindSelectableOnRight();
//}
//public override Selectable FindSelectableOnUp()
//{
// if (navigation.mode == Navigation.Mode.Automatic && axis == Axis.Vertical)
// return null;
// return base.FindSelectableOnUp();
//}
//public override Selectable FindSelectableOnDown()
//{
// if (navigation.mode == Navigation.Mode.Automatic && axis == Axis.Vertical)
// return null;
// return base.FindSelectableOnDown();
//}
public virtual void OnInitializePotentialDrag(PointerEventData eventData)
{
eventData.useDragThreshold = false;

View File

@ -14,10 +14,11 @@ namespace UnityEngine.UI.Extensions
void Start()
{
isVertical = false;
childAnchorPoint = new Vector2(0, 0.5f);
DistributePages();
if(MaskArea) CalculateVisible();
_lerp = false;
_currentPage = StartingScreen - 1;
_currentPage = StartingScreen;
SetScrollContainerPosition();
}
@ -51,10 +52,10 @@ namespace UnityEngine.UI.Extensions
}
}
//used for changing between screen resolutions
private void DistributePages()
{
_screens = _screensContainer.childCount;
_scroll_rect.horizontalNormalizedPosition = 0;
int _offset = 0;
float _dimension = 0;
@ -69,9 +70,7 @@ namespace UnityEngine.UI.Extensions
currentXPosition = _offset + (int)(i * pageStepValue);
child.sizeDelta = new Vector2(panelDimensions.width, panelDimensions.height);
child.anchoredPosition = new Vector2(currentXPosition, 0f);
child.anchorMin = new Vector2(0f, child.anchorMin.y);
child.anchorMax = new Vector2(0f, child.anchorMax.y);
child.pivot = new Vector2(0f, child.pivot.y);
child.anchorMin = child.anchorMax = child.pivot = childAnchorPoint;
}
_dimension = currentXPosition + _offset * -1;
@ -129,6 +128,16 @@ namespace UnityEngine.UI.Extensions
_scroll_rect.horizontalNormalizedPosition = (float)(_currentPage) / (_screens - 1);
}
/// <summary>
/// used for changing / updating between screen resolutions
/// </summary>
public void UpdateLayout()
{
_lerp = false;
DistributePages();
SetScrollContainerPosition();
}
#region Interfaces
/// <summary>
/// Release screen to swipe

View File

@ -14,6 +14,7 @@ namespace UnityEngine.UI.Extensions
internal float _scrollStartPosition;
internal float _childSize;
private float _childPos;
internal Vector2 childAnchorPoint;
internal ScrollRect _scroll_rect;
internal Vector3 _lerp_target;
internal bool _lerp;
@ -22,6 +23,7 @@ namespace UnityEngine.UI.Extensions
[Tooltip("The currently active page")]
internal int _currentPage;
internal int _previousPage;
internal int HalfNoVisibleItems;
[Serializable]
public class SelectionChangeStartEvent : UnityEvent { }
@ -30,37 +32,41 @@ namespace UnityEngine.UI.Extensions
[Serializable]
public class SelectionChangeEndEvent : UnityEvent { }
[Tooltip("The visible bounds area, controls which items are visible/enabled. *Note Should use a RectMask. (optional)")]
public RectTransform MaskArea;
[Tooltip("Pixel size to buffer arround Mask Area. (optional)")]
public float MaskBuffer = 1;
public int HalfNoVisibleItems;
[Tooltip("The screen / page to start the control on\n*Note, this is a 0 indexed array")]
[SerializeField]
public int StartingScreen = 0;
[Tooltip("The distance between two pages based on page height, by default pages are next to each other")]
[SerializeField]
[Range(1, 8)]
public float PageStep = 1;
[Tooltip("The gameobject that contains toggles which suggest pagination. (optional)")]
public GameObject Pagination;
[Tooltip("Button to go to the next page. (optional)")]
public GameObject NextButton;
[Tooltip("Button to go to the previous page. (optional)")]
public GameObject PrevButton;
[Tooltip("Transition speed between pages. (optional)")]
public float transitionSpeed = 7.5f;
[Tooltip("Fast Swipe makes swiping page next / previous (optional)")]
public Boolean UseFastSwipe = false;
[Tooltip("How far swipe has to travel to initiate a page change (optional)")]
public int FastSwipeThreshold = 100;
[Tooltip("Speed at which the ScrollRect will keep scrolling before slowing down and stopping (optional)")]
public int SwipeVelocityThreshold = 200;
[Tooltip("The screen / page to start the control on")]
[SerializeField]
public int StartingScreen = 1;
[Tooltip("The visible bounds area, controls which items are visible/enabled. *Note Should use a RectMask. (optional)")]
public RectTransform MaskArea;
[Tooltip("The distance between two pages based on page height, by default pages are next to each other")]
[SerializeField]
[Range(1, 8)]
public float PageStep = 1;
[Tooltip("Pixel size to buffer arround Mask Area. (optional)")]
public float MaskBuffer = 1;
public int CurrentPage
{
@ -80,6 +86,9 @@ namespace UnityEngine.UI.Extensions
}
}
[Tooltip("Scroll Snap children. (optional)\nEither place objects in the scene as children OR\nPrefabs in this array, NOT BOTH")]
public GameObject[] ChildObjects;
[SerializeField]
private SelectionChangeStartEvent m_OnSelectionChangeStartEvent = new SelectionChangeStartEvent();
public SelectionChangeStartEvent OnSelectionChangeStartEvent { get { return m_OnSelectionChangeStartEvent; } set { m_OnSelectionChangeStartEvent = value; } }
@ -92,7 +101,6 @@ namespace UnityEngine.UI.Extensions
private SelectionChangeEndEvent m_OnSelectionChangeEndEvent = new SelectionChangeEndEvent();
public SelectionChangeEndEvent OnSelectionChangeEndEvent { get { return m_OnSelectionChangeEndEvent; } set { m_OnSelectionChangeEndEvent = value; } }
public GameObject[] ChildObjects;
// Use this for initialization
void Awake()
@ -104,6 +112,11 @@ namespace UnityEngine.UI.Extensions
Debug.LogWarning("Warning, using scrollbars with the Scroll Snap controls is not advised as it causes unpredictable results");
}
if (StartingScreen < 0)
{
StartingScreen = 0;
}
_screensContainer = _scroll_rect.content;
if (ChildObjects != null && ChildObjects.Length > 0)
{
@ -168,6 +181,9 @@ namespace UnityEngine.UI.Extensions
internal void UpdateVisible()
{
//If there are no objects in the scene, exit
if (ChildObjects == null || ChildObjects.Length < 1 || _screensContainer.childCount < 1) return;
int BottomItem = _currentPage - HalfNoVisibleItems < 0 ? 0 : HalfNoVisibleItems;
int TopItem = _screensContainer.childCount - _currentPage < HalfNoVisibleItems ? _screensContainer.childCount - _currentPage : HalfNoVisibleItems;
@ -266,6 +282,8 @@ namespace UnityEngine.UI.Extensions
}
private void OnValidate()
{
if (_screensContainer || ChildObjects != null)
{
var childCount = ChildObjects == null ? _screensContainer.childCount : ChildObjects.Length;
if (StartingScreen > childCount - 1)
@ -277,6 +295,11 @@ namespace UnityEngine.UI.Extensions
StartingScreen = 0;
}
}
if (MaskBuffer <= 0)
{
MaskBuffer = 1;
}
}
internal void StartScreenChange()
{

View File

@ -14,10 +14,11 @@ namespace UnityEngine.UI.Extensions
void Start()
{
isVertical = true;
childAnchorPoint = new Vector2(0.5f,0);
DistributePages();
if(MaskArea) CalculateVisible();
_lerp = false;
_currentPage = StartingScreen - 1;
_currentPage = StartingScreen;
SetScrollContainerPosition();
}
@ -52,10 +53,10 @@ namespace UnityEngine.UI.Extensions
}
//used for changing between screen resolutions
public void DistributePages()
{
_screens = _screensContainer.childCount;
_scroll_rect.verticalNormalizedPosition = 0;
float _offset = 0;
float _dimension = 0;
@ -69,9 +70,7 @@ namespace UnityEngine.UI.Extensions
currentYPosition = _offset + i * pageStepValue;
child.sizeDelta = new Vector2(panelDimensions.width, panelDimensions.height);
child.anchoredPosition = new Vector2(0f, currentYPosition);
child.anchorMin = new Vector2(child.anchorMin.x, 0f);
child.anchorMax = new Vector2(child.anchorMax.x, 0f);
child.pivot = new Vector2(child.pivot.x, 0f);
child.anchorMin = child.anchorMax = child.pivot = childAnchorPoint;
}
_dimension = currentYPosition + _offset * -1;
@ -130,6 +129,15 @@ namespace UnityEngine.UI.Extensions
_scroll_rect.verticalNormalizedPosition = (float)(_currentPage) / (_screens - 1);
}
/// <summary>
/// used for changing / updating between screen resolutions
/// </summary>
public void UpdateLayout()
{
_lerp = false;
DistributePages();
SetScrollContainerPosition();
}
#region Interfaces
/// <summary>
/// Release screen to swipe

View File

@ -130,7 +130,7 @@ namespace UnityEngine.UI
protected override void OnDidApplyAnimationProperties()
{
// Check if isOn has been changed by the animation.
// Unfortunately there is no way to check if we don�t have a graphic.
// Unfortunately there is no way to check if we don't have a graphic.
if (graphic != null)
{
bool oldValue = !Mathf.Approximately(graphic.canvasRenderer.GetColor().a, 0);
@ -194,7 +194,7 @@ namespace UnityEngine.UI
m_IsOn = value;
if (m_Group != null && IsActive())
{
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.allowSwitchOff))
if (m_IsOn || (!m_Group.AnyTogglesOn() && !m_Group.AllowSwitchOff))
{
m_IsOn = true;
m_Group.NotifyToggleOn(this);

View File

@ -12,7 +12,7 @@ namespace UnityEngine.UI
{
[SerializeField]
private bool m_AllowSwitchOff = false;
public bool allowSwitchOff { get { return m_AllowSwitchOff; } set { m_AllowSwitchOff = value; } }
public bool AllowSwitchOff { get { return m_AllowSwitchOff; } set { m_AllowSwitchOff = value; } }
private List<ExtensionsToggle> m_Toggles = new List<ExtensionsToggle>();