using UnityEngine;
using System.Collections;
using EnhancedUI;
using EnhancedUI.EnhancedScroller;
using System;
namespace EnhancedScrollerDemos.Pagination
{
///
/// This demo shows how you can load small chunks of data when the user reaches the end of the scroller
///
public class Controller : MonoBehaviour, IEnhancedScrollerDelegate
{
///
/// Internal representation of our data. Note that the scroller will never see
/// this, so it separates the data from the layout using MVC principles.
///
private SmallList _data;
///
/// This is our scroller we will be a delegate for
///
public EnhancedScroller scroller;
///
/// This will be the prefab of each cell in our scroller. Note that you can use more
/// than one kind of cell, but this example just has the one type.
///
public CellView cellViewPrefab;
///
/// Loading cell view prefab displayed at the bottom of the scroller
///
public LoadingCellView loadingCellViewPrefab;
///
/// Height of the cells
///
public int cellHeight;
///
/// The number of elements per page
///
public int pageCount;
///
/// Used to determine if the scroller is already loading new data.
/// If so, then we don't want to call again to avoid an infinite loop.
///
private bool _loadingNew;
///
/// Be sure to set up your references to the scroller after the Awake function. The
/// scroller does some internal configuration in its own Awake function. If you need to
/// do this in the Awake function, you can set up the script order through the Unity editor.
/// In this case, be sure to set the EnhancedScroller's script before your delegate.
///
/// In this example, we are calling our initializations in the delegate's Start function,
/// but it could have been done later, perhaps in the Update function.
///
void Start()
{
// set the application frame rate.
// this improves smoothness on some devices
Application.targetFrameRate = 60;
// tell the scroller that this script will be its delegate
scroller.Delegate = this;
scroller.scrollerScrolled = ScrollerScrolled;
// initialize the data
_data = new SmallList();
// load in the first page of data
LoadData(0);
}
///
/// Populates the data with a lot of records
///
private void LoadData(int pageStartIndex)
{
// grab the last index of the data to jump to when we are finished
var previousLastIndex = _data.Count;
// calculate the last index of the new list
var lastIndex = _data.Count + pageCount;
// add data to the list
for (var i = pageStartIndex; i < lastIndex; i++)
{
_data.Add(new Data() { someText = "Cell Data Index " + i.ToString() });
}
// cache the scroller's position so that we can set it back after the reload
var scrollPosition = scroller.ScrollPosition;
// tell the scroller to reload now that we have the data.
scroller.ReloadData();
// set the scroller's position back to the cached position
scroller.ScrollPosition = scrollPosition;
// toggle off loading new so that we can load again at the bottom of the scroller
_loadingNew = false;
}
#region EnhancedScroller Handlers
///
/// This tells the scroller the number of cells that should have room allocated.
/// This should be the length of your data array plus one for the loading cell.
///
/// The scroller that is requesting the data size
/// The number of cells
public int GetNumberOfCells(EnhancedScroller scroller)
{
// in this example, we just pass the number of our data elements
// plus one for the loading cell
return _data.Count + 1;
}
///
/// This tells the scroller what the size of a given cell will be. Cells can be any size and do not have
/// to be uniform. For vertical scrollers the cell size will be the height. For horizontal scrollers the
/// cell size will be the width.
///
/// The scroller requesting the cell size
/// The index of the data that the scroller is requesting
/// The size of the cell
public float GetCellViewSize(EnhancedScroller scroller, int dataIndex)
{
return cellHeight;
}
///
/// Gets the cell to be displayed. You can have numerous cell types, allowing variety in your list.
/// Some examples of this would be headers, footers, and other grouping cells.
///
/// The scroller requesting the cell
/// The index of the data that the scroller is requesting
/// The index of the list. This will likely be different from the dataIndex if the scroller is looping
/// The cell for the scroller to use
public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex)
{
if (dataIndex == _data.Count)
{
LoadingCellView loadingCellView = scroller.GetCellView(loadingCellViewPrefab) as LoadingCellView;
loadingCellView.name = "Loading...";
return loadingCellView;
}
else
{
// first, we get a cell from the scroller by passing a prefab.
// if the scroller finds one it can recycle it will do so, otherwise
// it will create a new cell.
CellView cellView = scroller.GetCellView(cellViewPrefab) as CellView;
// set the name of the game object to the cell's data index.
// this is optional, but it helps up debug the objects in
// the scene hierarchy.
cellView.name = "Cell " + dataIndex.ToString();
// in this example, we just pass the data to our cell's view which will update its UI
cellView.SetData(_data[dataIndex]);
// return the cell to the scroller
return cellView;
}
}
///
/// This is called when the scroller fires a scrolled event
///
/// the scroller that fired the event
/// scroll amount
/// new scroll position
private void ScrollerScrolled(EnhancedScroller scroller, Vector2 val, float scrollPosition)
{
// if the scroller is at the end of the list and not already loading
if (scroller.NormalizedScrollPosition >= 1f && !_loadingNew)
{
// toggle on loading so that we don't get stuck in a loading loop
_loadingNew = true;
// for this example, we fake a delay that would simulate getting new data in a real application.
// normally you would just call LoadData(_data.Count) directly here, instead of adding the fake
// 1 second delay.
StartCoroutine(FakeDelay());
}
}
///
/// This is a method to fake a real world delay in gathering data.
/// This should not be used in your application
///
/// The delay
IEnumerator FakeDelay()
{
// wait for one second
yield return new WaitForSeconds(1f);
// load the data
LoadData(_data.Count);
}
#endregion
}
}