using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using EnhancedUI;
using EnhancedUI.EnhancedScroller;
namespace EnhancedScrollerDemos.NestedScrollers
{
///
/// This example scene shows one way you could set up nested scrollers.
/// Each MasterCellView in the master scroller contains an EnhancedScroller which in turn contains DetailCellViews.
///
/// Events are passed from the detail cells up to the master scroll rect so that scrolling can be done naturally
/// in both the horizontal and vertical directions.The detail ScrollRectEx is an extension of Unity's ScrollRect
/// that allows this event pass through.
///
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 List _data;
///
/// This is our scroller we will be a delegate for. The master scroller contains mastercellviews which in turn
/// contain EnhancedScrollers
///
public EnhancedScroller masterScroller;
///
/// 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 EnhancedScrollerCellView masterCellViewPrefab;
///
/// 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
masterScroller.Delegate = this;
// load in a large set of data
LoadData();
}
///
/// Populates the data with a lot of records
///
private void LoadData()
{
// set up some simple data. This will be a two-dimensional array,
// specifically a list within a list.
_data = new List();
for (var i = 0; i < 1000; i++)
{
var masterData = new MasterData()
{
normalizedScrollPosition = 0,
childData = new List()
};
_data.Add(masterData);
for (var j = 0; j < 20; j++)
masterData.childData.Add(new DetailData() { someText = i.ToString() + "," + j.ToString() });
}
// tell the scroller to reload now that we have the data
masterScroller.ReloadData();
}
#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.
///
/// 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
return _data.Count;
}
///
/// 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)
{
// in this example, our master cells are 100 pixels tall
return 100f;
}
///
/// 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)
{
// 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.
MasterCellView masterCellView = scroller.GetCellView(masterCellViewPrefab) as MasterCellView;
// 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.
masterCellView.name = "Master Cell " + dataIndex.ToString();
// in this example, we just pass the data to our cell's view which will update its UI
masterCellView.SetData(_data[dataIndex]);
// return the cell to the scroller
return masterCellView;
}
#endregion
}
}