using UnityEngine; using System.Collections; using EnhancedUI; using EnhancedUI.EnhancedScroller; namespace EnhancedScrollerDemos.GridSelection { /// /// This example shows how to simulate a grid with a fixed number of cells per row /// The data is stored as normal, but the differences in this example are: /// /// 1) The scroller is told the data count is the number of data elements divided by the number of cells per row /// 2) The cell view is passed a reference to the data set with the offset index of the first cell in the row 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. The cell view will /// hold references to each row sub cell /// public EnhancedScrollerCellView cellViewPrefab; public int numberOfCellsPerRow = 3; /// /// 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; // load in a large set of data LoadData(); } /// /// Populates the data with a lot of records /// private void LoadData() { // if the data existed previously, loop through // and remove the selection change handlers before // clearing out the data. if (_data != null) { for (var i = 0; i < _data.Count; i++) { _data[i].selectedChanged = null; } } // set up some simple data _data = new SmallList(); for (var i = 0; i < 1000; i ++) { _data.Add(new Data() { someText = i.ToString() }); } // tell the scroller to reload now that we have the data scroller.ReloadData(); } /// /// This function handles the cell view's button click event /// /// The cell view that had the button clicked private void CellViewSelected(RowCellView cellView) { if (cellView == null) { // nothing was selected } else { // get the selected data index of the cell view var selectedDataIndex = cellView.DataIndex; // loop through each item in the data list and turn // on or off the selection state. This is done so that // any previous selection states are removed and new // ones are added. for (var i = 0; i < _data.Count; i++) { _data[i].Selected = (selectedDataIndex == i); } } } #region EnhancedScroller Handlers /// /// This tells the scroller the number of cells that should have room allocated. /// For this example, the count is the number of data elements divided by the number of cells per row (rounded up using Mathf.CeilToInt) /// /// The scroller that is requesting the data size /// The number of cells public int GetNumberOfCells(EnhancedScroller scroller) { return Mathf.CeilToInt((float)_data.Count / (float)numberOfCellsPerRow); } /// /// 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 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. CellView cellView = scroller.GetCellView(cellViewPrefab) as CellView; // data index of the first sub cell var di = dataIndex * numberOfCellsPerRow; cellView.name = "Cell " + (di).ToString() + " to " + ((di) + numberOfCellsPerRow - 1).ToString(); // pass in a reference to our data set with the offset for this cell cellView.SetData(ref _data, di, CellViewSelected); // return the cell to the scroller return cellView; } #endregion } }