Merge upstream fixes from develop_5.2

--HG--
branch : develop_5.3
release
Simon (darkside) Jackson 2015-10-22 14:47:00 +01:00
commit 9134297ec4
3 changed files with 268 additions and 177 deletions

View File

@ -4,6 +4,7 @@ This is an extension project for the new Unity UI system which can be found at:
[Unity UI Source](https://bitbucket.org/Unity-Technologies/ui)
#Updated for 5.2.1P+/5.3 - new asset package#
#For Unity 5.2.2 - Use the new 5.3 package!#
##Intro##
For more info, here's a little introduction video for the project:

View File

@ -1,6 +1,5 @@
///Credit Martin Nerurkar // www.martin.nerurkar.de // www.sharkbombs.com
///Sourced from - http://www.sharkbombs.com/2015/02/10/tooltips-with-the-new-unity-ui-ugui/
using UnityEngine.EventSystems;
namespace UnityEngine.UI.Extensions
@ -8,20 +7,35 @@ namespace UnityEngine.UI.Extensions
[AddComponentMenu("UI/Extensions/Bound Tooltip/Tooltip Trigger")]
public class BoundTooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler
{
[TextAreaAttribute]
public string text;
public bool useMousePosition = false;
public Vector3 offset;
public void OnPointerEnter(PointerEventData eventData)
{
if (useMousePosition)
{
StartHover(new Vector3(eventData.position.x, eventData.position.y, 0f));
}
else
{
StartHover(transform.position + offset);
}
}
public void OnSelect(BaseEventData eventData)
{
StartHover(transform.position);
}
public void OnPointerExit(PointerEventData eventData)
{
StopHover();
}
public void OnDeselect(BaseEventData eventData)
{
StopHover();
@ -31,6 +45,7 @@ namespace UnityEngine.UI.Extensions
{
BoundTooltipItem.Instance.ShowTooltip(text, position);
}
void StopHover()
{
BoundTooltipItem.Instance.HideTooltip();

View File

@ -9,7 +9,6 @@
/// if you dont wish to use this auto resize turn of autoLayoutItems
/// - fixed current page made it independant from pivot
/// - replaced pagination with delegate function
using System;
using UnityEngine.EventSystems;
@ -22,10 +21,11 @@ namespace UnityEngine.UI.Extensions
{
// needed becouse of reversed behavior of axis Y compared to X
// (positions of children lower in children list in horizontal directions grows when in vertical it gets smaller)
public enum ScrollDirection {
public enum ScrollDirection
{
Horizontal,
Vertical
};
}
public delegate void PageSnapChange(int page);
@ -34,11 +34,12 @@ namespace UnityEngine.UI.Extensions
public ScrollDirection direction = ScrollDirection.Horizontal;
protected ScrollRect scrollRect;
protected RectTransform scrollRectTransform;
protected Transform listContainerTransform;
protected RectTransform rectTransform;
protected int items = 0;
protected RectTransform scrollRectTransform;
protected Transform listContainerTransform;
protected RectTransform rectTransform;
int pages;
@ -46,22 +47,31 @@ namespace UnityEngine.UI.Extensions
// anchor points to lerp to to see child on certain indexes
protected Vector3[] pageAnchorPositions;
protected Vector3 lerpTarget;
protected bool lerp;
// item list related
protected float listContainerMinPosition;
protected float listContainerMaxPosition;
protected float listContainerSize;
protected RectTransform listContainerRectTransform;
protected Vector2 listContainerCachedSize;
protected float itemSize;
protected int itemsCount = 0;
[Tooltip("Button to go to the next page. (optional)")]
public GameObject nextButton;
public Button nextButton;
[Tooltip("Button to go to the previous page. (optional)")]
public GameObject prevButton;
public Button prevButton;
[Tooltip("Number of items visible in one page of scroll frame.")]
[RangeAttribute(1,100)]
@ -73,73 +83,96 @@ namespace UnityEngine.UI.Extensions
[Tooltip("If you wish to update scrollbar numberOfSteps to number of active children on list.")]
public bool linkScrolbarSteps = false;
[Tooltip("If you wish to update scrollrect sensitivity to size of list element.")]
public bool linkScrolrectScrollSensitivity = false;
public Boolean useFastSwipe = true;
public int fastSwipeThreshold = 100;
// drag related
protected bool startDrag = true;
protected Vector3 positionOnDragStart = new Vector3();
protected int pageOnDragStart;
protected bool fastSwipeTimer = false;
protected int fastSwipeCounter = 0;
protected int fastSwipeTarget = 10;
// Use this for initialization
void Start()
void Awake()
{
lerp = false;
scrollRect = gameObject.GetComponent<ScrollRect> ();
scrollRectTransform = gameObject.GetComponent<RectTransform> ();
scrollRect = gameObject.GetComponent<ScrollRect>();
scrollRectTransform = gameObject.GetComponent<RectTransform>();
listContainerTransform = scrollRect.content;
listContainerRectTransform = listContainerTransform.GetComponent<RectTransform> ();
listContainerRectTransform = listContainerTransform.GetComponent<RectTransform>();
rectTransform = listContainerTransform.gameObject.GetComponent<RectTransform> ();
rectTransform = listContainerTransform.gameObject.GetComponent<RectTransform>();
UpdateListItemsSize();
UpdateListItemPositions();
ChangePage (CurrentPage ());
PageChanged(CurrentPage());
if (nextButton)
{
nextButton.GetComponent<Button> ().onClick.AddListener (() => { NextScreen (); });
nextButton.GetComponent<Button>().onClick.AddListener(() => {
NextScreen(); });
}
if (prevButton)
{
prevButton.GetComponent<Button> ().onClick.AddListener (() => { PreviousScreen (); });
prevButton.GetComponent<Button>().onClick.AddListener(() => {
PreviousScreen(); });
}
}
void Start()
{
Awake();
}
public void UpdateListItemsSize()
{
float size = 0;
float currentSize = 0;
if (direction == ScrollSnap.ScrollDirection.Horizontal)
{
size = scrollRectTransform.rect.width / itemsVisibleAtOnce;
currentSize = listContainerRectTransform.rect.width / itemsCount;
}
else
{
size = scrollRectTransform.rect.height / itemsVisibleAtOnce;
currentSize = listContainerRectTransform.rect.height / itemsCount;
}
itemSize = size;
if (autoLayoutItems && size != itemSize)
if (linkScrolrectScrollSensitivity)
{
scrollRect.scrollSensitivity = itemSize;
}
if (autoLayoutItems && currentSize != size && itemsCount > 0)
{
if (direction == ScrollSnap.ScrollDirection.Horizontal)
{
foreach (var tr in listContainerTransform)
{
GameObject child = ((Transform)tr).gameObject;
GameObject child = ((Transform) tr).gameObject;
if (child.activeInHierarchy)
{
var childLayout = child.GetComponent<LayoutElement> ();
var childLayout = child.GetComponent<LayoutElement>();
if (childLayout == null)
{
childLayout = child.AddComponent<LayoutElement> ();
childLayout = child.AddComponent<LayoutElement>();
}
childLayout.minWidth = itemSize;
@ -150,14 +183,14 @@ namespace UnityEngine.UI.Extensions
{
foreach (var tr in listContainerTransform)
{
GameObject child = ((Transform)tr).gameObject;
GameObject child = ((Transform) tr).gameObject;
if (child.activeInHierarchy)
{
var childLayout = child.GetComponent<LayoutElement> ();
var childLayout = child.GetComponent<LayoutElement>();
if (childLayout == null)
{
childLayout = child.AddComponent<LayoutElement> ();
childLayout = child.AddComponent<LayoutElement>();
}
childLayout.minHeight = itemSize;
@ -174,22 +207,25 @@ namespace UnityEngine.UI.Extensions
// checking how many children of list are active
int activeCount = 0;
foreach (var tr in listContainerTransform) {
if (((Transform)tr).gameObject.activeInHierarchy) {
foreach (var tr in listContainerTransform)
{
if (((Transform) tr).gameObject.activeInHierarchy)
{
activeCount++;
}
}
// if anything changed since last check reinitialize anchors list
items = 0;
itemsCount = 0;
Array.Resize(ref pageAnchorPositions, activeCount);
if (activeCount > 0)
{
pages = Mathf.Max (activeCount - itemsVisibleAtOnce + 1, 1);
pages = Mathf.Max(activeCount - itemsVisibleAtOnce + 1, 1);
if (direction == ScrollDirection.Horizontal)
{
//Debug.Log ("-------------looking for list spanning range----------------");
// looking for list spanning range min/max
scrollRect.horizontalNormalizedPosition = 0;
listContainerMaxPosition = listContainerTransform.localPosition.x;
@ -197,6 +233,8 @@ namespace UnityEngine.UI.Extensions
listContainerMinPosition = listContainerTransform.localPosition.x;
listContainerSize = listContainerMaxPosition - listContainerMinPosition;
//itemSize = pages > 1 ? listContainerSize / (float)(pages - 1) : listContainerSize / activeCount;
//itemSize *= (pages + itemsVisibleAtOnce) / (pages + 1);
for (var i = 0; i < pages; i ++)
{
@ -206,9 +244,12 @@ namespace UnityEngine.UI.Extensions
listContainerTransform.localPosition.z
);
}
//Debug.Log (String.Format("min:{0:0.0}, max:{1:0.0}, pages: {2:0}, width: {3:0}", listContainerMinPosition, listContainerMaxPosition, pages, listContainerSize/pages));
}
else
{
//Debug.Log ("-------------looking for list spanning range----------------");
// looking for list spanning range
scrollRect.verticalNormalizedPosition = 1;
listContainerMinPosition = listContainerTransform.localPosition.y;
@ -216,6 +257,8 @@ namespace UnityEngine.UI.Extensions
listContainerMaxPosition = listContainerTransform.localPosition.y;
listContainerSize = listContainerMaxPosition - listContainerMinPosition;
//itemSize = pages > 1 ? listContainerSize / (float)(pages - 1) : listContainerSize / activeCount;
//itemSize *= (pages + itemsVisibleAtOnce) / (pages + 1);
for (var i = 0; i < pages; i ++)
{
@ -224,22 +267,24 @@ namespace UnityEngine.UI.Extensions
listContainerMinPosition + itemSize * i,
listContainerTransform.localPosition.z
);
//Debug.Log (String.Format("pos[{0:0}]={1} {2:0%}", i, pageAnchorPositions[i], pages > 1 ? i/(float)(pages-1) : (float)i));
}
foreach (var tr in listContainerTransform) {
if (((Transform)tr).gameObject.activeInHierarchy) {
activeCount++;
}
}
//Debug.Log (String.Format("min:{0:0.0}, max:{1:0.0}, pages: {2:0}, width: {3:0}", listContainerMinPosition, listContainerMaxPosition, pages, listContainerSize/pages));
}
UpdateScrollbar(linkScrolbarSteps);
startingPage = Mathf.Min(startingPage, pages);
ResetPage();
}
items = activeCount;
listContainerCachedSize.Set (listContainerRectTransform.rect.size.x, listContainerRectTransform.rect.size.y);
if (itemsCount != activeCount)
{
PageChanged(CurrentPage());
}
itemsCount = activeCount;
listContainerCachedSize.Set(listContainerRectTransform.rect.size.x, listContainerRectTransform.rect.size.y);
}
}
@ -248,11 +293,11 @@ namespace UnityEngine.UI.Extensions
{
if (direction == ScrollDirection.Horizontal)
{
scrollRect.horizontalNormalizedPosition = pages > 1 ? (float)startingPage / (float)(pages - 1) : 0;
scrollRect.horizontalNormalizedPosition = pages > 1 ? (float) startingPage / (float) (pages - 1) : 0;
}
else
{
scrollRect.verticalNormalizedPosition = pages > 1 ? (float)(pages - startingPage - 1) / (float)(pages - 1) : 0;
scrollRect.verticalNormalizedPosition = pages > 1 ? (float) (pages - startingPage - 1) / (float) (pages - 1) : 0;
}
}
@ -294,7 +339,7 @@ namespace UnityEngine.UI.Extensions
}
}
void Update()
void LateUpdate()
{
UpdateListItemsSize();
UpdateListItemPositions();
@ -311,12 +356,14 @@ namespace UnityEngine.UI.Extensions
lerp = false;
UpdateScrollbar(linkScrolbarSteps);
//Debug.Log(String.Format("Lerp: {0}/{1} page: {2:0}", lerpTarget, listContainerTransform.localPosition, CurrentPage()));
}
//change the info bullets at the bottom of the screen. Just for visual effect
if (Vector3.Distance(listContainerTransform.localPosition, lerpTarget) < 10f)
{
ChangePage(CurrentPage());
PageChanged(CurrentPage());
}
}
@ -324,6 +371,8 @@ namespace UnityEngine.UI.Extensions
{
fastSwipeCounter++;
}
//Debug.Log(String.Format("Update: {0}", listContainerTransform.localPosition));
}
private bool fastSwipe = false; //to determine if a fast swipe was performed
@ -332,28 +381,28 @@ namespace UnityEngine.UI.Extensions
//Function for switching screens with buttons
public void NextScreen()
{
UpdateListItemPositions ();
UpdateListItemPositions();
if (CurrentPage() < pages - 1)
{
lerp = true;
lerpTarget = pageAnchorPositions[CurrentPage() + 1];
ChangePage(CurrentPage() + 1);
PageChanged(CurrentPage() + 1);
}
}
//Function for switching screens with buttons
public void PreviousScreen()
{
UpdateListItemPositions ();
UpdateListItemPositions();
if (CurrentPage() > 0)
{
lerp = true;
lerpTarget = pageAnchorPositions[CurrentPage() - 1];
ChangePage(CurrentPage() - 1);
PageChanged(CurrentPage() - 1);
}
}
@ -367,7 +416,7 @@ namespace UnityEngine.UI.Extensions
lerpTarget = pageAnchorPositions[targetPage];
ChangePage(targetPage);
PageChanged(targetPage);
}
}
@ -381,7 +430,7 @@ namespace UnityEngine.UI.Extensions
lerpTarget = pageAnchorPositions[targetPage];
ChangePage(targetPage);
PageChanged(targetPage);
}
}
@ -404,14 +453,38 @@ namespace UnityEngine.UI.Extensions
float page = pos / itemSize;
//Debug.Log (String.Format("min:{0:0.0}, max:{1:0.0}, current:{2:0.0}/{4:0.0}, page:{3:0.0}, target:{5}", listContainerMinPosition, listContainerMaxPosition, pos, page, listContainerTransform.localPosition.x, pageAnchorPositions[Mathf.RoundToInt(page)]));
return Mathf.Clamp(Mathf.RoundToInt(page), 0, pages);
}
public void ChangePage(int page)
{
if (0 <= page && page < pages)
{
lerp = true;
lerpTarget = pageAnchorPositions[page];
PageChanged(page);
}
}
//changes the bullets on the bottom of the page - pagination
private void ChangePage(int currentPage)
private void PageChanged(int currentPage)
{
startingPage = currentPage;
if (nextButton)
{
nextButton.interactable = currentPage < pages - 1;
}
if (prevButton)
{
prevButton.interactable = currentPage > 0;
}
if (onPageChange != null)
{
onPageChange(currentPage);
@ -428,6 +501,8 @@ namespace UnityEngine.UI.Extensions
positionOnDragStart = eventData.position;
pageOnDragStart = CurrentPage();
//Debug.Log (String.Format("pageOnDragStart:{0:0}", pageOnDragStart));
}
public void OnEndDrag(PointerEventData eventData)