|  |  | using System;
 | 
						
						
						
							|  |  | using System.Collections.Generic;
 | 
						
						
						
							|  |  | using FairyGUI.Utils;
 | 
						
						
						
							|  |  | using UnityEngine;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | namespace FairyGUI
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// Callback function when an item is needed to update its look.
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     /// <param name="index">Item index.</param>
 | 
						
						
						
							|  |  |     /// <param name="item">Item object.</param>
 | 
						
						
						
							|  |  |     public delegate void ListItemRenderer(int index, GObject item);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// 
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     /// <param name="index"></param>
 | 
						
						
						
							|  |  |     /// <returns></returns>
 | 
						
						
						
							|  |  |     public delegate string ListItemProvider(int index);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// GList class.
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     public class GList : GComponent
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Resource url of the default item.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public string defaultItem;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 如果true,当item不可见时自动折叠,否则依然占位
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public bool foldInvisibleItems = false;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// List selection mode
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <seealso cref="ListSelectionMode"/>
 | 
						
						
						
							|  |  |         public ListSelectionMode selectionMode;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Callback function when an item is needed to update its look.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public ListItemRenderer itemRenderer;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Callback funtion to return item resource url.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public ListItemProvider itemProvider;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public bool scrollItemToViewOnClick;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         ListLayoutType _layout;
 | 
						
						
						
							|  |  |         int _lineCount;
 | 
						
						
						
							|  |  |         int _columnCount;
 | 
						
						
						
							|  |  |         int _lineGap;
 | 
						
						
						
							|  |  |         int _columnGap;
 | 
						
						
						
							|  |  |         AlignType _align;
 | 
						
						
						
							|  |  |         VertAlignType _verticalAlign;
 | 
						
						
						
							|  |  |         bool _autoResizeItem;
 | 
						
						
						
							|  |  |         Controller _selectionController;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         GObjectPool _pool;
 | 
						
						
						
							|  |  |         int _lastSelectedIndex;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         EventListener _onClickItem;
 | 
						
						
						
							|  |  |         EventListener _onRightClickItem;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         //Virtual List support
 | 
						
						
						
							|  |  |         bool _virtual;
 | 
						
						
						
							|  |  |         bool _loop;
 | 
						
						
						
							|  |  |         int _numItems;
 | 
						
						
						
							|  |  |         int _realNumItems;
 | 
						
						
						
							|  |  |         int _firstIndex; //the top left index
 | 
						
						
						
							|  |  |         int _curLineItemCount; //item count in one line
 | 
						
						
						
							|  |  |         int _curLineItemCount2; //只用在页面模式,表示垂直方向的项目数
 | 
						
						
						
							|  |  |         Vector2 _itemSize;
 | 
						
						
						
							|  |  |         int _virtualListChanged; //1-content changed, 2-size changed
 | 
						
						
						
							|  |  |         uint itemInfoVer; //用来标志item是否在本次处理中已经被重用了
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         int _miscFlags; //1-event locked, 2-focus events registered
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         class ItemInfo
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             public Vector2 size;
 | 
						
						
						
							|  |  |             public GObject obj;
 | 
						
						
						
							|  |  |             public uint updateFlag;
 | 
						
						
						
							|  |  |             public bool selected;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         List<ItemInfo> _virtualItems;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         EventCallback1 _itemClickDelegate;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public GList()
 | 
						
						
						
							|  |  |             : base()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _trackBounds = true;
 | 
						
						
						
							|  |  |             this.opaque = true;
 | 
						
						
						
							|  |  |             scrollItemToViewOnClick = true;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             container = new Container();
 | 
						
						
						
							|  |  |             rootContainer.AddChild(container);
 | 
						
						
						
							|  |  |             rootContainer.gameObject.name = "GList";
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _pool = new GObjectPool(container.cachedTransform);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _itemClickDelegate = __clickItem;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public override void Dispose()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _pool.Clear();
 | 
						
						
						
							|  |  |             if (_virtualListChanged != 0)
 | 
						
						
						
							|  |  |                 Timers.inst.Remove(this.RefreshVirtualList);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _selectionController = null;
 | 
						
						
						
							|  |  |             scrollItemToViewOnClick = false;
 | 
						
						
						
							|  |  |             itemRenderer = null;
 | 
						
						
						
							|  |  |             itemProvider = null;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             base.Dispose();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Dispatched when a list item being clicked.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public EventListener onClickItem
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _onClickItem ?? (_onClickItem = new EventListener(this, "onClickItem")); }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Dispatched when a list item being clicked with right button.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public EventListener onRightClickItem
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _onRightClickItem ?? (_onRightClickItem = new EventListener(this, "onRightClickItem")); }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// List layout type.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public ListLayoutType layout
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _layout; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_layout != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _layout = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int lineCount
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _lineCount; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_lineCount != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _lineCount = value;
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.FlowVertical || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                             SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int columnCount
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _columnCount; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_columnCount != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _columnCount = value;
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                             SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int lineGap
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _lineGap; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_lineGap != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _lineGap = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int columnGap
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _columnGap; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_columnGap != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _columnGap = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public AlignType align
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _align; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_align != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _align = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public VertAlignType verticalAlign
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _verticalAlign; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_verticalAlign != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _verticalAlign = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// If the item will resize itself to fit the list width/height.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public bool autoResizeItem
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _autoResizeItem; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_autoResizeItem != value)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     _autoResizeItem = value;
 | 
						
						
						
							|  |  |                     SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |                     if (_virtual)
 | 
						
						
						
							|  |  |                         SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <value></value>
 | 
						
						
						
							|  |  |         public Vector2 defaultItemSize
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _itemSize; }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _itemSize = value;
 | 
						
						
						
							|  |  |                 if (_virtual)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                         this.scrollPane.scrollStep = _itemSize.y;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         this.scrollPane.scrollStep = _itemSize.x;
 | 
						
						
						
							|  |  |                     SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public GObjectPool itemPool
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _pool; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="url"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public GObject GetFromPool(string url)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (string.IsNullOrEmpty(url))
 | 
						
						
						
							|  |  |                 url = defaultItem;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             GObject ret = _pool.GetObject(url);
 | 
						
						
						
							|  |  |             if (ret != null)
 | 
						
						
						
							|  |  |                 ret.visible = true;
 | 
						
						
						
							|  |  |             return ret;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void ReturnToPool(GObject obj)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _pool.ReturnObject(obj);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Add a item to list, same as GetFromPool+AddChild
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <returns>Item object</returns>
 | 
						
						
						
							|  |  |         public GObject AddItemFromPool()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GObject obj = GetFromPool(null);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return AddChild(obj);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Add a item to list, same as GetFromPool+AddChild
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="url">Item resource url</param>
 | 
						
						
						
							|  |  |         /// <returns>Item object</returns>
 | 
						
						
						
							|  |  |         public GObject AddItemFromPool(string url)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GObject obj = GetFromPool(url);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return AddChild(obj);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="child"></param>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         override public GObject AddChildAt(GObject child, int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.AddChildAt(child, index);
 | 
						
						
						
							|  |  |             if (child is GButton)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GButton button = (GButton)child;
 | 
						
						
						
							|  |  |                 button.selected = false;
 | 
						
						
						
							|  |  |                 button.changeStateOnClick = false;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             child.onClick.Add(_itemClickDelegate);
 | 
						
						
						
							|  |  |             child.onRightClick.Add(_itemClickDelegate);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return child;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         /// <param name="dispose"></param>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         override public GObject RemoveChildAt(int index, bool dispose)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GObject child = base.RemoveChildAt(index, dispose);
 | 
						
						
						
							|  |  |             child.onClick.Remove(_itemClickDelegate);
 | 
						
						
						
							|  |  |             child.onRightClick.Remove(_itemClickDelegate);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return child;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         public void RemoveChildToPoolAt(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GObject child = base.RemoveChildAt(index);
 | 
						
						
						
							|  |  |             ReturnToPool(child);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="child"></param>
 | 
						
						
						
							|  |  |         public void RemoveChildToPool(GObject child)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.RemoveChild(child);
 | 
						
						
						
							|  |  |             ReturnToPool(child);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void RemoveChildrenToPool()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             RemoveChildrenToPool(0, -1);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="beginIndex"></param>
 | 
						
						
						
							|  |  |         /// <param name="endIndex"></param>
 | 
						
						
						
							|  |  |         public void RemoveChildrenToPool(int beginIndex, int endIndex)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (endIndex < 0 || endIndex >= _children.Count)
 | 
						
						
						
							|  |  |                 endIndex = _children.Count - 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             for (int i = beginIndex; i <= endIndex; ++i)
 | 
						
						
						
							|  |  |                 RemoveChildToPoolAt(beginIndex);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int selectedIndex
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_virtual)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                     for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                         if ((ii.obj is GButton) && ((GButton)ii.obj).selected
 | 
						
						
						
							|  |  |                             || ii.obj == null && ii.selected)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             if (_loop)
 | 
						
						
						
							|  |  |                                 return i % _numItems;
 | 
						
						
						
							|  |  |                             else
 | 
						
						
						
							|  |  |                                 return i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int cnt = _children.Count;
 | 
						
						
						
							|  |  |                     for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                         if (obj != null && obj.selected)
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 return -1;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (value >= 0 && value < this.numItems)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (selectionMode != ListSelectionMode.Single)
 | 
						
						
						
							|  |  |                         ClearSelection();
 | 
						
						
						
							|  |  |                     AddSelection(value, false);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     ClearSelection();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public Controller selectionController
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _selectionController; }
 | 
						
						
						
							|  |  |             set { _selectionController = value; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public List<int> GetSelection()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return GetSelection(null);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public List<int> GetSelection(List<int> result)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (result == null)
 | 
						
						
						
							|  |  |                 result = new List<int>();
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                     if ((ii.obj is GButton) && ((GButton)ii.obj).selected
 | 
						
						
						
							|  |  |                         || ii.obj == null && ii.selected)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         int j = i;
 | 
						
						
						
							|  |  |                         if (_loop)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             j = i % _numItems;
 | 
						
						
						
							|  |  |                             if (result.Contains(j))
 | 
						
						
						
							|  |  |                                 continue;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         result.Add(j);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _children.Count;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                     if (obj != null && obj.selected)
 | 
						
						
						
							|  |  |                         result.Add(i);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             return result;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         /// <param name="scrollItToView"></param>
 | 
						
						
						
							|  |  |         public void AddSelection(int index, bool scrollItToView)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (selectionMode == ListSelectionMode.None)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             CheckVirtualList();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (selectionMode == ListSelectionMode.Single)
 | 
						
						
						
							|  |  |                 ClearSelection();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (scrollItToView)
 | 
						
						
						
							|  |  |                 ScrollToView(index);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _lastSelectedIndex = index;
 | 
						
						
						
							|  |  |             GButton obj = null;
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[index];
 | 
						
						
						
							|  |  |                 if (ii.obj != null)
 | 
						
						
						
							|  |  |                     obj = ii.obj.asButton;
 | 
						
						
						
							|  |  |                 ii.selected = true;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 obj = GetChildAt(index).asButton;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (obj != null && !obj.selected)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 obj.selected = true;
 | 
						
						
						
							|  |  |                 UpdateSelectionController(index);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index"></param>
 | 
						
						
						
							|  |  |         public void RemoveSelection(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (selectionMode == ListSelectionMode.None)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             GButton obj = null;
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[index];
 | 
						
						
						
							|  |  |                 if (ii.obj != null)
 | 
						
						
						
							|  |  |                     obj = ii.obj.asButton;
 | 
						
						
						
							|  |  |                 ii.selected = false;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 obj = GetChildAt(index).asButton;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (obj != null)
 | 
						
						
						
							|  |  |                 obj.selected = false;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void ClearSelection()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                     if ((ii.obj is GButton))
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = false;
 | 
						
						
						
							|  |  |                     ii.selected = false;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _children.Count;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                     if (obj != null)
 | 
						
						
						
							|  |  |                         obj.selected = false;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void ClearSelectionExcept(GObject g)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                     if (ii.obj != g)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if ((ii.obj is GButton))
 | 
						
						
						
							|  |  |                             ((GButton)ii.obj).selected = false;
 | 
						
						
						
							|  |  |                         ii.selected = false;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _children.Count;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                     if (obj != null && obj != g)
 | 
						
						
						
							|  |  |                         obj.selected = false;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void SelectAll()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             CheckVirtualList();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int last = -1;
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                     if ((ii.obj is GButton) && !((GButton)ii.obj).selected)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = true;
 | 
						
						
						
							|  |  |                         last = i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ii.selected = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _children.Count;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                     if (obj != null && !obj.selected)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         obj.selected = true;
 | 
						
						
						
							|  |  |                         last = i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (last != -1)
 | 
						
						
						
							|  |  |                 UpdateSelectionController(last);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void SelectNone()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ClearSelection();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void SelectReverse()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             CheckVirtualList();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int last = -1;
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _realNumItems;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                     if ((ii.obj is GButton))
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = !((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                         if (((GButton)ii.obj).selected)
 | 
						
						
						
							|  |  |                             last = i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ii.selected = !ii.selected;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = _children.Count;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                     if (obj != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         obj.selected = !obj.selected;
 | 
						
						
						
							|  |  |                         if (obj.selected)
 | 
						
						
						
							|  |  |                             last = i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (last != -1)
 | 
						
						
						
							|  |  |                 UpdateSelectionController(last);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="enabled"></param>
 | 
						
						
						
							|  |  |         public void EnableSelectionFocusEvents(bool enabled)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (((_miscFlags & 2) != 0) == enabled)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (enabled)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _miscFlags |= 2;
 | 
						
						
						
							|  |  |                 this.tabStopChildren = true;
 | 
						
						
						
							|  |  |                 onFocusIn.Add(NotifySelection);
 | 
						
						
						
							|  |  |                 onFocusOut.Add(NotifySelection);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _miscFlags &= 0xFD;
 | 
						
						
						
							|  |  |                 onFocusIn.Remove(NotifySelection);
 | 
						
						
						
							|  |  |                 onFocusOut.Remove(NotifySelection);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void NotifySelection(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             string eventType = context.type == "onFocusIn" ? "onListFocusIn" : "onListFocusOut";
 | 
						
						
						
							|  |  |             int cnt = _children.Count;
 | 
						
						
						
							|  |  |             for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GButton obj = _children[i].asButton;
 | 
						
						
						
							|  |  |                 if (obj != null && obj.selected)
 | 
						
						
						
							|  |  |                     obj.DispatchEvent(eventType);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void EnableArrowKeyNavigation(bool enabled)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (enabled)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 this.tabStopChildren = true;
 | 
						
						
						
							|  |  |                 onKeyDown.Add(__keydown);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 this.tabStopChildren = false;
 | 
						
						
						
							|  |  |                 onKeyDown.Remove(__keydown);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void __keydown(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int index = -1;
 | 
						
						
						
							|  |  |             switch (context.inputEvent.keyCode)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 case KeyCode.LeftArrow:
 | 
						
						
						
							|  |  |                     index = HandleArrowKey(7);
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case KeyCode.RightArrow:
 | 
						
						
						
							|  |  |                     index = HandleArrowKey(3);
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case KeyCode.UpArrow:
 | 
						
						
						
							|  |  |                     index = HandleArrowKey(1);
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case KeyCode.DownArrow:
 | 
						
						
						
							|  |  |                     index = HandleArrowKey(5);
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (index != -1)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 index = ItemIndexToChildIndex(index);
 | 
						
						
						
							|  |  |                 if (index != -1)
 | 
						
						
						
							|  |  |                     DispatchItemEvent(GetChildAt(index), context);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 context.StopPropagation();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="dir"></param>
 | 
						
						
						
							|  |  |         public int HandleArrowKey(int dir)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int curIndex = this.selectedIndex;
 | 
						
						
						
							|  |  |             if (curIndex == -1)
 | 
						
						
						
							|  |  |                 return -1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int index = curIndex;
 | 
						
						
						
							|  |  |             switch (dir)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 case 1://up
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         index--;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else if (_layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             index -= _curLineItemCount;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             GObject current = _children[index];
 | 
						
						
						
							|  |  |                             int k = 0;
 | 
						
						
						
							|  |  |                             int i;
 | 
						
						
						
							|  |  |                             for (i = index - 1; i >= 0; i--)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.y != current.y)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     current = obj;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                                 k++;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             for (; i >= 0; i--)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.y != current.y)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     index = i + k + 1;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case 3://right
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         index++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else if (_layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             index += _curLineItemCount;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             GObject current = _children[index];
 | 
						
						
						
							|  |  |                             int k = 0;
 | 
						
						
						
							|  |  |                             int cnt = _children.Count;
 | 
						
						
						
							|  |  |                             int i;
 | 
						
						
						
							|  |  |                             for (i = index + 1; i < cnt; i++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.x != current.x)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     current = obj;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                                 k++;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             for (; i < cnt; i++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.x != current.x)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     index = i - k - 1;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case 5://down
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         index++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else if (_layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             index += _curLineItemCount;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             GObject current = _children[index];
 | 
						
						
						
							|  |  |                             int k = 0;
 | 
						
						
						
							|  |  |                             int cnt = _children.Count;
 | 
						
						
						
							|  |  |                             int i;
 | 
						
						
						
							|  |  |                             for (i = index + 1; i < cnt; i++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.y != current.y)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     current = obj;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                                 k++;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             for (; i < cnt; i++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.y != current.y)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     index = i - k - 1;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 case 7://left
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         index--;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else if (_layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_virtual)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             index -= _curLineItemCount;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             GObject current = _children[index];
 | 
						
						
						
							|  |  |                             int k = 0;
 | 
						
						
						
							|  |  |                             int i;
 | 
						
						
						
							|  |  |                             for (i = index - 1; i >= 0; i--)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.x != current.x)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     current = obj;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                                 k++;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             for (; i >= 0; i--)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 GObject obj = _children[i];
 | 
						
						
						
							|  |  |                                 if (obj.x != current.x)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     index = i + k + 1;
 | 
						
						
						
							|  |  |                                     break;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     break;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (index != curIndex && index >= 0 && index < this.numItems)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ClearSelection();
 | 
						
						
						
							|  |  |                 AddSelection(index, true);
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 return -1;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void __clickItem(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             GObject item = context.sender as GObject;
 | 
						
						
						
							|  |  |             if ((item is GButton) && selectionMode != ListSelectionMode.None)
 | 
						
						
						
							|  |  |                 SetSelectionOnEvent(item, context.inputEvent);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (scrollPane != null && scrollItemToViewOnClick)
 | 
						
						
						
							|  |  |                 scrollPane.ScrollToView(item, true);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             DispatchItemEvent(item, context);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual protected void DispatchItemEvent(GObject item, EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (context.type == item.onRightClick.type)
 | 
						
						
						
							|  |  |                 DispatchEvent("onRightClickItem", item);
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 DispatchEvent("onClickItem", item);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void SetSelectionOnEvent(GObject item, InputEvent evt)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             bool dontChangeLastIndex = false;
 | 
						
						
						
							|  |  |             GButton button = (GButton)item;
 | 
						
						
						
							|  |  |             int index = ChildIndexToItemIndex(GetChildIndex(item));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (selectionMode == ListSelectionMode.Single)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (!button.selected)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ClearSelectionExcept(button);
 | 
						
						
						
							|  |  |                     button.selected = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (evt.shift)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (!button.selected)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_lastSelectedIndex != -1)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             int min = Math.Min(_lastSelectedIndex, index);
 | 
						
						
						
							|  |  |                             int max = Math.Max(_lastSelectedIndex, index);
 | 
						
						
						
							|  |  |                             max = Math.Min(max, this.numItems - 1);
 | 
						
						
						
							|  |  |                             if (_virtual)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 for (int i = min; i <= max; i++)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                                         ((GButton)ii.obj).selected = true;
 | 
						
						
						
							|  |  |                                     ii.selected = true;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             else
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 for (int i = min; i <= max; i++)
 | 
						
						
						
							|  |  |                                 {
 | 
						
						
						
							|  |  |                                     GButton obj = GetChildAt(i).asButton;
 | 
						
						
						
							|  |  |                                     if (obj != null && !obj.selected)
 | 
						
						
						
							|  |  |                                         obj.selected = true;
 | 
						
						
						
							|  |  |                                 }
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                             dontChangeLastIndex = true;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             button.selected = true;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else if (evt.ctrlOrCmd || selectionMode == ListSelectionMode.Multiple_SingleClick)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     button.selected = !button.selected;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (!button.selected)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ClearSelectionExcept(button);
 | 
						
						
						
							|  |  |                         button.selected = true;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else if (evt.button == 0)
 | 
						
						
						
							|  |  |                         ClearSelectionExcept(button);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (!dontChangeLastIndex)
 | 
						
						
						
							|  |  |                 _lastSelectedIndex = index;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (button.selected)
 | 
						
						
						
							|  |  |                 UpdateSelectionController(index);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Resize to list size to fit specified item count. 
 | 
						
						
						
							|  |  |         /// If list layout is single column or flow horizontally, the height will change to fit. 
 | 
						
						
						
							|  |  |         /// If list layout is single row or flow vertically, the width will change to fit.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void ResizeToFit()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ResizeToFit(int.MaxValue, 0);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Resize to list size to fit specified item count. 
 | 
						
						
						
							|  |  |         /// If list layout is single column or flow horizontally, the height will change to fit. 
 | 
						
						
						
							|  |  |         /// If list layout is single row or flow vertically, the width will change to fit.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="itemCount">Item count</param>
 | 
						
						
						
							|  |  |         public void ResizeToFit(int itemCount)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ResizeToFit(itemCount, 0);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Resize to list size to fit specified item count. 
 | 
						
						
						
							|  |  |         /// If list layout is single column or flow horizontally, the height will change to fit. 
 | 
						
						
						
							|  |  |         /// If list layout is single row or flow vertically, the width will change to fit.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="itemCount">>Item count</param>
 | 
						
						
						
							|  |  |         /// <param name="minSize">If the result size if smaller than minSize, then use minSize.</param>
 | 
						
						
						
							|  |  |         public void ResizeToFit(int itemCount, int minSize)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             EnsureBoundsCorrect();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int curCount = this.numItems;
 | 
						
						
						
							|  |  |             if (itemCount > curCount)
 | 
						
						
						
							|  |  |                 itemCount = curCount;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int lineCount = Mathf.CeilToInt((float)itemCount / _curLineItemCount);
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                     this.viewHeight = lineCount * _itemSize.y + Math.Max(0, lineCount - 1) * _lineGap;
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     this.viewWidth = lineCount * _itemSize.x + Math.Max(0, lineCount - 1) * _columnGap;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (itemCount == 0)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                     this.viewHeight = minSize;
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     this.viewWidth = minSize;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int i = itemCount - 1;
 | 
						
						
						
							|  |  |                 GObject obj = null;
 | 
						
						
						
							|  |  |                 while (i >= 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     obj = this.GetChildAt(i);
 | 
						
						
						
							|  |  |                     if (!foldInvisibleItems || obj.visible)
 | 
						
						
						
							|  |  |                         break;
 | 
						
						
						
							|  |  |                     i--;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 if (i < 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                         this.viewHeight = minSize;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         this.viewWidth = minSize;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float size;
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         size = obj.y + obj.height;
 | 
						
						
						
							|  |  |                         if (size < minSize)
 | 
						
						
						
							|  |  |                             size = minSize;
 | 
						
						
						
							|  |  |                         this.viewHeight = size;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         size = obj.x + obj.width;
 | 
						
						
						
							|  |  |                         if (size < minSize)
 | 
						
						
						
							|  |  |                             size = minSize;
 | 
						
						
						
							|  |  |                         this.viewWidth = size;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         override protected void HandleSizeChanged()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.HandleSizeChanged();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             SetBoundsChangedFlag();
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |                 SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override public void HandleControllerChanged(Controller c)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.HandleControllerChanged(c);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_selectionController == c)
 | 
						
						
						
							|  |  |                 this.selectedIndex = c.selectedIndex;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void UpdateSelectionController(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_selectionController != null && !_selectionController.changing
 | 
						
						
						
							|  |  |                 && index < _selectionController.pageCount)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 Controller c = _selectionController;
 | 
						
						
						
							|  |  |                 _selectionController = null;
 | 
						
						
						
							|  |  |                 c.selectedIndex = index;
 | 
						
						
						
							|  |  |                 _selectionController = c;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Scroll the list to make an item with certain index visible.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index">Item index</param>
 | 
						
						
						
							|  |  |         public void ScrollToView(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ScrollToView(index, false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         ///  Scroll the list to make an item with certain index visible.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index">Item index</param>
 | 
						
						
						
							|  |  |         /// <param name="ani">True to scroll smoothly, othewise immdediately.</param>
 | 
						
						
						
							|  |  |         public void ScrollToView(int index, bool ani)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ScrollToView(index, ani, false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         ///  Scroll the list to make an item with certain index visible.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <param name="index">Item index</param>
 | 
						
						
						
							|  |  |         /// <param name="ani">True to scroll smoothly, othewise immdediately.</param>
 | 
						
						
						
							|  |  |         /// <param name="setFirst">If true, scroll to make the target on the top/left; If false, scroll to make the target any position in view.</param>
 | 
						
						
						
							|  |  |         public void ScrollToView(int index, bool ani, bool setFirst)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_numItems == 0)
 | 
						
						
						
							|  |  |                     return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 CheckVirtualList();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (index >= _virtualItems.Count)
 | 
						
						
						
							|  |  |                     throw new Exception("Invalid child index: " + index + ">" + _virtualItems.Count);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (_loop)
 | 
						
						
						
							|  |  |                     index = Mathf.FloorToInt((float)_firstIndex / _numItems) * _numItems + index;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 Rect rect;
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[index];
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float pos = 0;
 | 
						
						
						
							|  |  |                     for (int i = _curLineItemCount - 1; i < index; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                         pos += _virtualItems[i].size.y + _lineGap;
 | 
						
						
						
							|  |  |                     rect = new Rect(0, pos, _itemSize.x, ii.size.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float pos = 0;
 | 
						
						
						
							|  |  |                     for (int i = _curLineItemCount - 1; i < index; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                         pos += _virtualItems[i].size.x + _columnGap;
 | 
						
						
						
							|  |  |                     rect = new Rect(pos, 0, ii.size.x, _itemSize.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int page = index / (_curLineItemCount * _curLineItemCount2);
 | 
						
						
						
							|  |  |                     rect = new Rect(page * viewWidth + (index % _curLineItemCount) * (ii.size.x + _columnGap),
 | 
						
						
						
							|  |  |                         (index / _curLineItemCount) % _curLineItemCount2 * (ii.size.y + _lineGap),
 | 
						
						
						
							|  |  |                         ii.size.x, ii.size.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (this.scrollPane != null)
 | 
						
						
						
							|  |  |                     scrollPane.ScrollToView(rect, ani, setFirst);
 | 
						
						
						
							|  |  |                 else if (parent != null && parent.scrollPane != null)
 | 
						
						
						
							|  |  |                     parent.scrollPane.ScrollToView(this.TransformRect(rect, parent), ani, setFirst);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GObject obj = GetChildAt(index);
 | 
						
						
						
							|  |  |                 if (this.scrollPane != null)
 | 
						
						
						
							|  |  |                     scrollPane.ScrollToView(obj, ani, setFirst);
 | 
						
						
						
							|  |  |                 else if (parent != null && parent.scrollPane != null)
 | 
						
						
						
							|  |  |                     parent.scrollPane.ScrollToView(obj, ani, setFirst);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// 获取当前点击哪个item
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public GObject touchItem
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 //find out which item is under finger
 | 
						
						
						
							|  |  |                 //逐层往上知道查到点击了那个item
 | 
						
						
						
							|  |  |                 GObject obj = GRoot.inst.touchTarget;
 | 
						
						
						
							|  |  |                 GObject p = obj.parent;
 | 
						
						
						
							|  |  |                 while (p != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (p == this)
 | 
						
						
						
							|  |  |                         return obj;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     obj = p;
 | 
						
						
						
							|  |  |                     p = p.parent;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 return null;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Get first child in view.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         /// <returns></returns>
 | 
						
						
						
							|  |  |         public override int GetFirstChildInView()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return ChildIndexToItemIndex(base.GetFirstChildInView());
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public int ChildIndexToItemIndex(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (!_virtual)
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 for (int i = _firstIndex; i < _realNumItems; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_virtualItems[i].obj != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         index--;
 | 
						
						
						
							|  |  |                         if (index < 0)
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 index += _firstIndex;
 | 
						
						
						
							|  |  |                 if (_loop && _numItems > 0)
 | 
						
						
						
							|  |  |                     index = index % _numItems;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public int ItemIndexToChildIndex(int index)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (!_virtual)
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_layout == ListLayoutType.Pagination)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 return GetChildIndex(_virtualItems[index].obj);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_loop && _numItems > 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int j = _firstIndex % _numItems;
 | 
						
						
						
							|  |  |                     if (index >= j)
 | 
						
						
						
							|  |  |                         index = index - j;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         index = _numItems - j + index;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     index -= _firstIndex;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 return index;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Set the list to be virtual list.
 | 
						
						
						
							|  |  |         /// 设置列表为虚拟列表模式。在虚拟列表模式下,列表不会为每一条列表数据创建一个实体对象,而是根据视口大小创建最小量的显示对象,然后通过itemRenderer指定的回调函数设置列表数据。
 | 
						
						
						
							|  |  |         /// 在虚拟模式下,你不能通过AddChild、RemoveChild等方式管理列表,只能通过设置numItems设置列表数据的长度。
 | 
						
						
						
							|  |  |         /// 如果要刷新列表,可以通过重新设置numItems,或者调用RefreshVirtualList完成。
 | 
						
						
						
							|  |  |         /// ‘单行’或者‘单列’的列表布局可支持不等高的列表项目。
 | 
						
						
						
							|  |  |         /// 除了‘页面’的列表布局,其他布局均支持使用不同资源构建列表项目,你可以在itemProvider里返回。如果不提供,默认使用defaultItem。
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void SetVirtual()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             SetVirtual(false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public bool isVirtual
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get { return _virtual; }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Set the list to be virtual list, and has loop behavior.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public void SetVirtualAndLoop()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             SetVirtual(true);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void SetVirtual(bool loop)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (!_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (this.scrollPane == null)
 | 
						
						
						
							|  |  |                     Debug.LogError("FairyGUI: Virtual list must be scrollable!");
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (loop)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_layout == ListLayoutType.FlowHorizontal || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                         Debug.LogError("FairyGUI: Loop list is not supported for FlowHorizontal or FlowVertical layout!");
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     this.scrollPane.bouncebackEffect = false;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 _virtual = true;
 | 
						
						
						
							|  |  |                 _loop = loop;
 | 
						
						
						
							|  |  |                 _virtualItems = new List<ItemInfo>();
 | 
						
						
						
							|  |  |                 RemoveChildrenToPool();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (_itemSize.x == 0 || _itemSize.y == 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GObject obj = GetFromPool(null);
 | 
						
						
						
							|  |  |                     if (obj == null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         Debug.LogError("FairyGUI: Virtual List must have a default list item resource.");
 | 
						
						
						
							|  |  |                         _itemSize = new Vector2(100, 100);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         _itemSize = obj.size;
 | 
						
						
						
							|  |  |                         _itemSize.x = Mathf.CeilToInt(_itemSize.x);
 | 
						
						
						
							|  |  |                         _itemSize.y = Mathf.CeilToInt(_itemSize.y);
 | 
						
						
						
							|  |  |                         ReturnToPool(obj);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     this.scrollPane.scrollStep = _itemSize.y;
 | 
						
						
						
							|  |  |                     if (_loop)
 | 
						
						
						
							|  |  |                         this.scrollPane._loop = 2;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     this.scrollPane.scrollStep = _itemSize.x;
 | 
						
						
						
							|  |  |                     if (_loop)
 | 
						
						
						
							|  |  |                         this.scrollPane._loop = 1;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 this.scrollPane.onScroll.AddCapture(__scrolled);
 | 
						
						
						
							|  |  |                 SetVirtualListChangedFlag(true);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         /// <summary>
 | 
						
						
						
							|  |  |         /// Set the list item count. 
 | 
						
						
						
							|  |  |         /// If the list is not virtual, specified number of items will be created. 
 | 
						
						
						
							|  |  |         /// If the list is virtual, only items in view will be created.
 | 
						
						
						
							|  |  |         /// </summary>
 | 
						
						
						
							|  |  |         public int numItems
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_virtual)
 | 
						
						
						
							|  |  |                     return _numItems;
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     return _children.Count;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_virtual)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (itemRenderer == null)
 | 
						
						
						
							|  |  |                         throw new Exception("FairyGUI: Set itemRenderer first!");
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     _numItems = value;
 | 
						
						
						
							|  |  |                     if (_loop)
 | 
						
						
						
							|  |  |                         _realNumItems = _numItems * 6;//设置6倍数量,用于循环滚动
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         _realNumItems = _numItems;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     //_virtualItems的设计是只增不减的
 | 
						
						
						
							|  |  |                     int oldCount = _virtualItems.Count;
 | 
						
						
						
							|  |  |                     if (_realNumItems > oldCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = oldCount; i < _realNumItems; i++)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             ItemInfo ii = new ItemInfo();
 | 
						
						
						
							|  |  |                             ii.size = _itemSize;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                             _virtualItems.Add(ii);
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = _realNumItems; i < oldCount; i++)
 | 
						
						
						
							|  |  |                             _virtualItems[i].selected = false;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (_virtualListChanged != 0)
 | 
						
						
						
							|  |  |                         Timers.inst.Remove(this.RefreshVirtualList);
 | 
						
						
						
							|  |  |                     //立即刷新
 | 
						
						
						
							|  |  |                     this.RefreshVirtualList(null);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int cnt = _children.Count;
 | 
						
						
						
							|  |  |                     if (value > cnt)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = cnt; i < value; i++)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             if (itemProvider == null)
 | 
						
						
						
							|  |  |                                 AddItemFromPool();
 | 
						
						
						
							|  |  |                             else
 | 
						
						
						
							|  |  |                                 AddItemFromPool(itemProvider(i));
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         RemoveChildrenToPool(value, cnt);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (itemRenderer != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = 0; i < value; i++)
 | 
						
						
						
							|  |  |                             itemRenderer(i, GetChildAt(i));
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void RefreshVirtualList()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (!_virtual)
 | 
						
						
						
							|  |  |                 throw new Exception("FairyGUI: not virtual list");
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             SetVirtualListChangedFlag(false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void CheckVirtualList()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtualListChanged != 0)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 this.RefreshVirtualList(null);
 | 
						
						
						
							|  |  |                 Timers.inst.Remove(this.RefreshVirtualList);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void SetVirtualListChangedFlag(bool layoutChanged)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (layoutChanged)
 | 
						
						
						
							|  |  |                 _virtualListChanged = 2;
 | 
						
						
						
							|  |  |             else if (_virtualListChanged == 0)
 | 
						
						
						
							|  |  |                 _virtualListChanged = 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             Timers.inst.CallLater(RefreshVirtualList);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void RefreshVirtualList(object param)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             bool layoutChanged = _virtualListChanged == 2;
 | 
						
						
						
							|  |  |             _virtualListChanged = 0;
 | 
						
						
						
							|  |  |             _miscFlags |= 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (layoutChanged)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.SingleRow)
 | 
						
						
						
							|  |  |                     _curLineItemCount = 1;
 | 
						
						
						
							|  |  |                 else if (_layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_columnCount > 0)
 | 
						
						
						
							|  |  |                         _curLineItemCount = _columnCount;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         _curLineItemCount = Mathf.FloorToInt((this.scrollPane.viewWidth + _columnGap) / (_itemSize.x + _columnGap));
 | 
						
						
						
							|  |  |                         if (_curLineItemCount <= 0)
 | 
						
						
						
							|  |  |                             _curLineItemCount = 1;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else if (_layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_lineCount > 0)
 | 
						
						
						
							|  |  |                         _curLineItemCount = _lineCount;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         _curLineItemCount = Mathf.FloorToInt((this.scrollPane.viewHeight + _lineGap) / (_itemSize.y + _lineGap));
 | 
						
						
						
							|  |  |                         if (_curLineItemCount <= 0)
 | 
						
						
						
							|  |  |                             _curLineItemCount = 1;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else //pagination
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_columnCount > 0)
 | 
						
						
						
							|  |  |                         _curLineItemCount = _columnCount;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         _curLineItemCount = Mathf.FloorToInt((this.scrollPane.viewWidth + _columnGap) / (_itemSize.x + _columnGap));
 | 
						
						
						
							|  |  |                         if (_curLineItemCount <= 0)
 | 
						
						
						
							|  |  |                             _curLineItemCount = 1;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (_lineCount > 0)
 | 
						
						
						
							|  |  |                         _curLineItemCount2 = _lineCount;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         _curLineItemCount2 = Mathf.FloorToInt((this.scrollPane.viewHeight + _lineGap) / (_itemSize.y + _lineGap));
 | 
						
						
						
							|  |  |                         if (_curLineItemCount2 <= 0)
 | 
						
						
						
							|  |  |                             _curLineItemCount2 = 1;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             float ch = 0, cw = 0;
 | 
						
						
						
							|  |  |             if (_realNumItems > 0)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int len = Mathf.CeilToInt((float)_realNumItems / _curLineItemCount) * _curLineItemCount;
 | 
						
						
						
							|  |  |                 int len2 = Math.Min(_curLineItemCount, _realNumItems);
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (int i = 0; i < len; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                         ch += _virtualItems[i].size.y + _lineGap;
 | 
						
						
						
							|  |  |                     if (ch > 0)
 | 
						
						
						
							|  |  |                         ch -= _lineGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (_autoResizeItem)
 | 
						
						
						
							|  |  |                         cw = scrollPane.viewWidth;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = 0; i < len2; i++)
 | 
						
						
						
							|  |  |                             cw += _virtualItems[i].size.x + _columnGap;
 | 
						
						
						
							|  |  |                         if (cw > 0)
 | 
						
						
						
							|  |  |                             cw -= _columnGap;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (int i = 0; i < len; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                         cw += _virtualItems[i].size.x + _columnGap;
 | 
						
						
						
							|  |  |                     if (cw > 0)
 | 
						
						
						
							|  |  |                         cw -= _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (_autoResizeItem)
 | 
						
						
						
							|  |  |                         ch = this.scrollPane.viewHeight;
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int i = 0; i < len2; i++)
 | 
						
						
						
							|  |  |                             ch += _virtualItems[i].size.y + _lineGap;
 | 
						
						
						
							|  |  |                         if (ch > 0)
 | 
						
						
						
							|  |  |                             ch -= _lineGap;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     int pageCount = Mathf.CeilToInt((float)len / (_curLineItemCount * _curLineItemCount2));
 | 
						
						
						
							|  |  |                     cw = pageCount * viewWidth;
 | 
						
						
						
							|  |  |                     ch = viewHeight;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             HandleAlign(cw, ch);
 | 
						
						
						
							|  |  |             this.scrollPane.SetContentSize(cw, ch);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _miscFlags &= 0xFE;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             HandleScroll(true);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void __scrolled(EventContext context)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             HandleScroll(false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         int GetIndexOnPos1(ref float pos, bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_realNumItems < _curLineItemCount)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 pos = 0;
 | 
						
						
						
							|  |  |                 return 0;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (numChildren > 0 && !forceUpdate)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float pos2 = this.GetChildAt(0).y;
 | 
						
						
						
							|  |  |                 if (pos2 + (_lineGap > 0 ? 0 : -_lineGap) > pos)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (int i = _firstIndex - _curLineItemCount; i >= 0; i -= _curLineItemCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         pos2 -= (_virtualItems[i].size.y + _lineGap);
 | 
						
						
						
							|  |  |                         if (pos2 <= pos)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             pos = pos2;
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     pos = 0;
 | 
						
						
						
							|  |  |                     return 0;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float testGap = _lineGap > 0 ? _lineGap : 0;
 | 
						
						
						
							|  |  |                     for (int i = _firstIndex; i < _realNumItems; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         float pos3 = pos2 + _virtualItems[i].size.y;
 | 
						
						
						
							|  |  |                         if (pos3 + testGap > pos)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             pos = pos2;
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         pos2 = pos3 + _lineGap;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     pos = pos2;
 | 
						
						
						
							|  |  |                     return _realNumItems - _curLineItemCount;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float pos2 = 0;
 | 
						
						
						
							|  |  |                 float testGap = _lineGap > 0 ? _lineGap : 0;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < _realNumItems; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float pos3 = pos2 + _virtualItems[i].size.y;
 | 
						
						
						
							|  |  |                     if (pos3 + testGap > pos)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         pos = pos2;
 | 
						
						
						
							|  |  |                         return i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     pos2 = pos3 + _lineGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 pos = pos2;
 | 
						
						
						
							|  |  |                 return _realNumItems - _curLineItemCount;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         int GetIndexOnPos2(ref float pos, bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_realNumItems < _curLineItemCount)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 pos = 0;
 | 
						
						
						
							|  |  |                 return 0;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (numChildren > 0 && !forceUpdate)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float pos2 = this.GetChildAt(0).x;
 | 
						
						
						
							|  |  |                 if (pos2 + (_columnGap > 0 ? 0 : -_columnGap) > pos)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (int i = _firstIndex - _curLineItemCount; i >= 0; i -= _curLineItemCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         pos2 -= (_virtualItems[i].size.x + _columnGap);
 | 
						
						
						
							|  |  |                         if (pos2 <= pos)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             pos = pos2;
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     pos = 0;
 | 
						
						
						
							|  |  |                     return 0;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float testGap = _columnGap > 0 ? _columnGap : 0;
 | 
						
						
						
							|  |  |                     for (int i = _firstIndex; i < _realNumItems; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         float pos3 = pos2 + _virtualItems[i].size.x;
 | 
						
						
						
							|  |  |                         if (pos3 + testGap > pos)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             pos = pos2;
 | 
						
						
						
							|  |  |                             return i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         pos2 = pos3 + _columnGap;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     pos = pos2;
 | 
						
						
						
							|  |  |                     return _realNumItems - _curLineItemCount;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float pos2 = 0;
 | 
						
						
						
							|  |  |                 float testGap = _columnGap > 0 ? _columnGap : 0;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < _realNumItems; i += _curLineItemCount)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float pos3 = pos2 + _virtualItems[i].size.x;
 | 
						
						
						
							|  |  |                     if (pos3 + testGap > pos)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         pos = pos2;
 | 
						
						
						
							|  |  |                         return i;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     pos2 = pos3 + _columnGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 pos = pos2;
 | 
						
						
						
							|  |  |                 return _realNumItems - _curLineItemCount;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         int GetIndexOnPos3(ref float pos, bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_realNumItems < _curLineItemCount)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 pos = 0;
 | 
						
						
						
							|  |  |                 return 0;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             float viewWidth = this.viewWidth;
 | 
						
						
						
							|  |  |             int page = Mathf.FloorToInt(pos / viewWidth);
 | 
						
						
						
							|  |  |             int startIndex = page * (_curLineItemCount * _curLineItemCount2);
 | 
						
						
						
							|  |  |             float pos2 = page * viewWidth;
 | 
						
						
						
							|  |  |             float testGap = _columnGap > 0 ? _columnGap : 0;
 | 
						
						
						
							|  |  |             for (int i = 0; i < _curLineItemCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float pos3 = pos2 + _virtualItems[startIndex + i].size.x;
 | 
						
						
						
							|  |  |                 if (pos3 + testGap > pos)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     pos = pos2;
 | 
						
						
						
							|  |  |                     return startIndex + i;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 pos2 = pos3 + _columnGap;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             pos = pos2;
 | 
						
						
						
							|  |  |             return startIndex + _curLineItemCount - 1;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void HandleScroll(bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if ((_miscFlags & 1) != 0)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int enterCounter = 0;
 | 
						
						
						
							|  |  |                 while (HandleScroll1(forceUpdate))
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     //可能会因为ITEM资源改变导致ITEM大小发生改变,所有出现最后一页填不满的情况,这时要反复尝试填满。
 | 
						
						
						
							|  |  |                     enterCounter++;
 | 
						
						
						
							|  |  |                     forceUpdate = false;
 | 
						
						
						
							|  |  |                     if (enterCounter > 20)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         Debug.Log("FairyGUI: list will never be filled as the item renderer function always returns a different size.");
 | 
						
						
						
							|  |  |                         break;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 HandleArchOrder1();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int enterCounter = 0;
 | 
						
						
						
							|  |  |                 while (HandleScroll2(forceUpdate))
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     enterCounter++;
 | 
						
						
						
							|  |  |                     forceUpdate = false;
 | 
						
						
						
							|  |  |                     if (enterCounter > 20)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         Debug.Log("FairyGUI: list will never be filled as the item renderer function always returns a different size.");
 | 
						
						
						
							|  |  |                         break;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 HandleArchOrder2();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 HandleScroll3(forceUpdate);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _boundsChanged = false;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         bool HandleScroll1(bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             float pos = scrollPane.scrollingPosY;
 | 
						
						
						
							|  |  |             float max = pos + scrollPane.viewHeight;
 | 
						
						
						
							|  |  |             bool end = max == scrollPane.contentHeight;//这个标志表示当前需要滚动到最末,无论内容变化大小
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //寻找当前位置的第一条项目
 | 
						
						
						
							|  |  |             int newFirstIndex = GetIndexOnPos1(ref pos, forceUpdate);
 | 
						
						
						
							|  |  |             if (newFirstIndex == _firstIndex && !forceUpdate)
 | 
						
						
						
							|  |  |                 return false;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int oldFirstIndex = _firstIndex;
 | 
						
						
						
							|  |  |             _firstIndex = newFirstIndex;
 | 
						
						
						
							|  |  |             int curIndex = newFirstIndex;
 | 
						
						
						
							|  |  |             bool forward = oldFirstIndex > newFirstIndex;
 | 
						
						
						
							|  |  |             int childCount = this.numChildren;
 | 
						
						
						
							|  |  |             int lastIndex = oldFirstIndex + childCount - 1;
 | 
						
						
						
							|  |  |             int reuseIndex = forward ? lastIndex : oldFirstIndex;
 | 
						
						
						
							|  |  |             float curX = 0, curY = pos;
 | 
						
						
						
							|  |  |             bool needRender;
 | 
						
						
						
							|  |  |             float deltaSize = 0;
 | 
						
						
						
							|  |  |             float firstItemDeltaSize = 0;
 | 
						
						
						
							|  |  |             string url = defaultItem;
 | 
						
						
						
							|  |  |             int partSize = (int)((scrollPane.viewWidth - _columnGap * (_curLineItemCount - 1)) / _curLineItemCount);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             itemInfoVer++;
 | 
						
						
						
							|  |  |             while (curIndex < _realNumItems && (end || curY < max))
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[curIndex];
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.obj == null || forceUpdate)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (itemProvider != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         url = itemProvider(curIndex % _numItems);
 | 
						
						
						
							|  |  |                         if (url == null)
 | 
						
						
						
							|  |  |                             url = defaultItem;
 | 
						
						
						
							|  |  |                         url = UIPackage.NormalizeURL(url);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj != null && ii.obj.resourceURL != url)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                             ii.selected = ((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                         RemoveChildToPool(ii.obj);
 | 
						
						
						
							|  |  |                         ii.obj = null;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.obj == null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     //搜索最适合的重用item,保证每次刷新需要新建或者重新render的item最少
 | 
						
						
						
							|  |  |                     if (forward)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int j = reuseIndex; j >= oldFirstIndex; j--)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             ItemInfo ii2 = _virtualItems[j];
 | 
						
						
						
							|  |  |                             if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 if (ii2.obj is GButton)
 | 
						
						
						
							|  |  |                                     ii2.selected = ((GButton)ii2.obj).selected;
 | 
						
						
						
							|  |  |                                 ii.obj = ii2.obj;
 | 
						
						
						
							|  |  |                                 ii2.obj = null;
 | 
						
						
						
							|  |  |                                 if (j == reuseIndex)
 | 
						
						
						
							|  |  |                                     reuseIndex--;
 | 
						
						
						
							|  |  |                                 break;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int j = reuseIndex; j <= lastIndex; j++)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             ItemInfo ii2 = _virtualItems[j];
 | 
						
						
						
							|  |  |                             if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 if (ii2.obj is GButton)
 | 
						
						
						
							|  |  |                                     ii2.selected = ((GButton)ii2.obj).selected;
 | 
						
						
						
							|  |  |                                 ii.obj = ii2.obj;
 | 
						
						
						
							|  |  |                                 ii2.obj = null;
 | 
						
						
						
							|  |  |                                 if (j == reuseIndex)
 | 
						
						
						
							|  |  |                                     reuseIndex++;
 | 
						
						
						
							|  |  |                                 break;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         SetChildIndex(ii.obj, forward ? curIndex - newFirstIndex : numChildren);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ii.obj = _pool.GetObject(url);
 | 
						
						
						
							|  |  |                         if (forward)
 | 
						
						
						
							|  |  |                             this.AddChildAt(ii.obj, curIndex - newFirstIndex);
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                             this.AddChild(ii.obj);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = ii.selected;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     needRender = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     needRender = forceUpdate;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (needRender)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_autoResizeItem && (_layout == ListLayoutType.SingleColumn || _columnCount > 0))
 | 
						
						
						
							|  |  |                         ii.obj.SetSize(partSize, ii.obj.height, true);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     itemRenderer(curIndex % _numItems, ii.obj);
 | 
						
						
						
							|  |  |                     if (curIndex % _curLineItemCount == 0)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         deltaSize += Mathf.CeilToInt(ii.obj.size.y) - ii.size.y;
 | 
						
						
						
							|  |  |                         if (curIndex == newFirstIndex && oldFirstIndex > newFirstIndex)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             //当内容向下滚动时,如果新出现的项目大小发生变化,需要做一个位置补偿,才不会导致滚动跳动
 | 
						
						
						
							|  |  |                             firstItemDeltaSize = Mathf.CeilToInt(ii.obj.size.y) - ii.size.y;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ii.size.x = Mathf.CeilToInt(ii.obj.size.x);
 | 
						
						
						
							|  |  |                     ii.size.y = Mathf.CeilToInt(ii.obj.size.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ii.updateFlag = itemInfoVer;
 | 
						
						
						
							|  |  |                 ii.obj.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                 if (curIndex == newFirstIndex) //要显示多一条才不会穿帮
 | 
						
						
						
							|  |  |                     max += ii.size.y;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 curX += ii.size.x + _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (curIndex % _curLineItemCount == _curLineItemCount - 1)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     curX = 0;
 | 
						
						
						
							|  |  |                     curY += ii.size.y + _lineGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 curIndex++;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             for (int i = 0; i < childCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[oldFirstIndex + i];
 | 
						
						
						
							|  |  |                 if (ii.updateFlag != itemInfoVer && ii.obj != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ii.selected = ((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                     RemoveChildToPool(ii.obj);
 | 
						
						
						
							|  |  |                     ii.obj = null;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             childCount = _children.Count;
 | 
						
						
						
							|  |  |             for (int i = 0; i < childCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GObject obj = _virtualItems[newFirstIndex + i].obj;
 | 
						
						
						
							|  |  |                 if (_children[i] != obj)
 | 
						
						
						
							|  |  |                     SetChildIndex(obj, i);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (deltaSize != 0 || firstItemDeltaSize != 0)
 | 
						
						
						
							|  |  |                 this.scrollPane.ChangeContentSizeOnScrolling(0, deltaSize, 0, firstItemDeltaSize);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (curIndex > 0 && this.numChildren > 0 && this.container.y <= 0 && GetChildAt(0).y > -this.container.y)//最后一页没填满!
 | 
						
						
						
							|  |  |                 return true;
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 return false;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         bool HandleScroll2(bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             float pos = scrollPane.scrollingPosX;
 | 
						
						
						
							|  |  |             float max = pos + scrollPane.viewWidth;
 | 
						
						
						
							|  |  |             bool end = pos == scrollPane.contentWidth;//这个标志表示当前需要滚动到最末,无论内容变化大小
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //寻找当前位置的第一条项目
 | 
						
						
						
							|  |  |             int newFirstIndex = GetIndexOnPos2(ref pos, forceUpdate);
 | 
						
						
						
							|  |  |             if (newFirstIndex == _firstIndex && !forceUpdate)
 | 
						
						
						
							|  |  |                 return false;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int oldFirstIndex = _firstIndex;
 | 
						
						
						
							|  |  |             _firstIndex = newFirstIndex;
 | 
						
						
						
							|  |  |             int curIndex = newFirstIndex;
 | 
						
						
						
							|  |  |             bool forward = oldFirstIndex > newFirstIndex;
 | 
						
						
						
							|  |  |             int childCount = this.numChildren;
 | 
						
						
						
							|  |  |             int lastIndex = oldFirstIndex + childCount - 1;
 | 
						
						
						
							|  |  |             int reuseIndex = forward ? lastIndex : oldFirstIndex;
 | 
						
						
						
							|  |  |             float curX = pos, curY = 0;
 | 
						
						
						
							|  |  |             bool needRender;
 | 
						
						
						
							|  |  |             float deltaSize = 0;
 | 
						
						
						
							|  |  |             float firstItemDeltaSize = 0;
 | 
						
						
						
							|  |  |             string url = defaultItem;
 | 
						
						
						
							|  |  |             int partSize = (int)((scrollPane.viewHeight - _lineGap * (_curLineItemCount - 1)) / _curLineItemCount);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             itemInfoVer++;
 | 
						
						
						
							|  |  |             while (curIndex < _realNumItems && (end || curX < max))
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[curIndex];
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.obj == null || forceUpdate)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (itemProvider != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         url = itemProvider(curIndex % _numItems);
 | 
						
						
						
							|  |  |                         if (url == null)
 | 
						
						
						
							|  |  |                             url = defaultItem;
 | 
						
						
						
							|  |  |                         url = UIPackage.NormalizeURL(url);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj != null && ii.obj.resourceURL != url)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                             ii.selected = ((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                         RemoveChildToPool(ii.obj);
 | 
						
						
						
							|  |  |                         ii.obj = null;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.obj == null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (forward)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int j = reuseIndex; j >= oldFirstIndex; j--)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             ItemInfo ii2 = _virtualItems[j];
 | 
						
						
						
							|  |  |                             if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 if (ii2.obj is GButton)
 | 
						
						
						
							|  |  |                                     ii2.selected = ((GButton)ii2.obj).selected;
 | 
						
						
						
							|  |  |                                 ii.obj = ii2.obj;
 | 
						
						
						
							|  |  |                                 ii2.obj = null;
 | 
						
						
						
							|  |  |                                 if (j == reuseIndex)
 | 
						
						
						
							|  |  |                                     reuseIndex--;
 | 
						
						
						
							|  |  |                                 break;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         for (int j = reuseIndex; j <= lastIndex; j++)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             ItemInfo ii2 = _virtualItems[j];
 | 
						
						
						
							|  |  |                             if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 if (ii2.obj is GButton)
 | 
						
						
						
							|  |  |                                     ii2.selected = ((GButton)ii2.obj).selected;
 | 
						
						
						
							|  |  |                                 ii.obj = ii2.obj;
 | 
						
						
						
							|  |  |                                 ii2.obj = null;
 | 
						
						
						
							|  |  |                                 if (j == reuseIndex)
 | 
						
						
						
							|  |  |                                     reuseIndex++;
 | 
						
						
						
							|  |  |                                 break;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         SetChildIndex(ii.obj, forward ? curIndex - newFirstIndex : numChildren);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ii.obj = _pool.GetObject(url);
 | 
						
						
						
							|  |  |                         if (forward)
 | 
						
						
						
							|  |  |                             this.AddChildAt(ii.obj, curIndex - newFirstIndex);
 | 
						
						
						
							|  |  |                         else
 | 
						
						
						
							|  |  |                             this.AddChild(ii.obj);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = ii.selected;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     needRender = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     needRender = forceUpdate;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (needRender)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_autoResizeItem && (_layout == ListLayoutType.SingleRow || _lineCount > 0))
 | 
						
						
						
							|  |  |                         ii.obj.SetSize(ii.obj.width, partSize, true);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     itemRenderer(curIndex % _numItems, ii.obj);
 | 
						
						
						
							|  |  |                     if (curIndex % _curLineItemCount == 0)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         deltaSize += Mathf.CeilToInt(ii.obj.size.x) - ii.size.x;
 | 
						
						
						
							|  |  |                         if (curIndex == newFirstIndex && oldFirstIndex > newFirstIndex)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             //当内容向下滚动时,如果新出现的一个项目大小发生变化,需要做一个位置补偿,才不会导致滚动跳动
 | 
						
						
						
							|  |  |                             firstItemDeltaSize = Mathf.CeilToInt(ii.obj.size.x) - ii.size.x;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ii.size.x = Mathf.CeilToInt(ii.obj.size.x);
 | 
						
						
						
							|  |  |                     ii.size.y = Mathf.CeilToInt(ii.obj.size.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ii.updateFlag = itemInfoVer;
 | 
						
						
						
							|  |  |                 ii.obj.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                 if (curIndex == newFirstIndex) //要显示多一条才不会穿帮
 | 
						
						
						
							|  |  |                     max += ii.size.x;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 curY += ii.size.y + _lineGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (curIndex % _curLineItemCount == _curLineItemCount - 1)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     curY = 0;
 | 
						
						
						
							|  |  |                     curX += ii.size.x + _columnGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 curIndex++;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             for (int i = 0; i < childCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[oldFirstIndex + i];
 | 
						
						
						
							|  |  |                 if (ii.updateFlag != itemInfoVer && ii.obj != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ii.selected = ((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                     RemoveChildToPool(ii.obj);
 | 
						
						
						
							|  |  |                     ii.obj = null;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             childCount = _children.Count;
 | 
						
						
						
							|  |  |             for (int i = 0; i < childCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 GObject obj = _virtualItems[newFirstIndex + i].obj;
 | 
						
						
						
							|  |  |                 if (_children[i] != obj)
 | 
						
						
						
							|  |  |                     SetChildIndex(obj, i);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (deltaSize != 0 || firstItemDeltaSize != 0)
 | 
						
						
						
							|  |  |                 this.scrollPane.ChangeContentSizeOnScrolling(deltaSize, 0, firstItemDeltaSize, 0);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (curIndex > 0 && this.numChildren > 0 && this.container.x <= 0 && GetChildAt(0).x > -this.container.x)//最后一页没填满!
 | 
						
						
						
							|  |  |                 return true;
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 return false;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void HandleScroll3(bool forceUpdate)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             float pos = scrollPane.scrollingPosX;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //寻找当前位置的第一条项目
 | 
						
						
						
							|  |  |             int newFirstIndex = GetIndexOnPos3(ref pos, forceUpdate);
 | 
						
						
						
							|  |  |             if (newFirstIndex == _firstIndex && !forceUpdate)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int oldFirstIndex = _firstIndex;
 | 
						
						
						
							|  |  |             _firstIndex = newFirstIndex;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //分页模式不支持不等高,所以渲染满一页就好了
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int reuseIndex = oldFirstIndex;
 | 
						
						
						
							|  |  |             int virtualItemCount = _virtualItems.Count;
 | 
						
						
						
							|  |  |             int pageSize = _curLineItemCount * _curLineItemCount2;
 | 
						
						
						
							|  |  |             int startCol = newFirstIndex % _curLineItemCount;
 | 
						
						
						
							|  |  |             float viewWidth = this.viewWidth;
 | 
						
						
						
							|  |  |             int page = (int)(newFirstIndex / pageSize);
 | 
						
						
						
							|  |  |             int startIndex = page * pageSize;
 | 
						
						
						
							|  |  |             int lastIndex = startIndex + pageSize * 2; //测试两页
 | 
						
						
						
							|  |  |             bool needRender;
 | 
						
						
						
							|  |  |             string url = defaultItem;
 | 
						
						
						
							|  |  |             int partWidth = (int)((scrollPane.viewWidth - _columnGap * (_curLineItemCount - 1)) / _curLineItemCount);
 | 
						
						
						
							|  |  |             int partHeight = (int)((scrollPane.viewHeight - _lineGap * (_curLineItemCount2 - 1)) / _curLineItemCount2);
 | 
						
						
						
							|  |  |             itemInfoVer++;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //先标记这次要用到的项目
 | 
						
						
						
							|  |  |             for (int i = startIndex; i < lastIndex; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (i >= _realNumItems)
 | 
						
						
						
							|  |  |                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 int col = i % _curLineItemCount;
 | 
						
						
						
							|  |  |                 if (i - startIndex < pageSize)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (col < startCol)
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (col > startCol)
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                 ii.updateFlag = itemInfoVer;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             GObject lastObj = null;
 | 
						
						
						
							|  |  |             int insertIndex = 0;
 | 
						
						
						
							|  |  |             for (int i = startIndex; i < lastIndex; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (i >= _realNumItems)
 | 
						
						
						
							|  |  |                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                 if (ii.updateFlag != itemInfoVer)
 | 
						
						
						
							|  |  |                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.obj == null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     //寻找看有没有可重用的
 | 
						
						
						
							|  |  |                     while (reuseIndex < virtualItemCount)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ItemInfo ii2 = _virtualItems[reuseIndex];
 | 
						
						
						
							|  |  |                         if (ii2.obj != null && ii2.updateFlag != itemInfoVer)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             if (ii2.obj is GButton)
 | 
						
						
						
							|  |  |                                 ii2.selected = ((GButton)ii2.obj).selected;
 | 
						
						
						
							|  |  |                             ii.obj = ii2.obj;
 | 
						
						
						
							|  |  |                             ii2.obj = null;
 | 
						
						
						
							|  |  |                             break;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         reuseIndex++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (insertIndex == -1)
 | 
						
						
						
							|  |  |                         insertIndex = GetChildIndex(lastObj) + 1;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj == null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (itemProvider != null)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             url = itemProvider(i % _numItems);
 | 
						
						
						
							|  |  |                             if (url == null)
 | 
						
						
						
							|  |  |                                 url = defaultItem;
 | 
						
						
						
							|  |  |                             url = UIPackage.NormalizeURL(url);
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         ii.obj = _pool.GetObject(url);
 | 
						
						
						
							|  |  |                         this.AddChildAt(ii.obj, insertIndex);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         insertIndex = SetChildIndexBefore(ii.obj, insertIndex);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     insertIndex++;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ((GButton)ii.obj).selected = ii.selected;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     needRender = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     needRender = forceUpdate;
 | 
						
						
						
							|  |  |                     insertIndex = -1;
 | 
						
						
						
							|  |  |                     lastObj = ii.obj;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (needRender)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_autoResizeItem)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         if (_curLineItemCount == _columnCount && _curLineItemCount2 == _lineCount)
 | 
						
						
						
							|  |  |                             ii.obj.SetSize(partWidth, partHeight, true);
 | 
						
						
						
							|  |  |                         else if (_curLineItemCount == _columnCount)
 | 
						
						
						
							|  |  |                             ii.obj.SetSize(partWidth, ii.obj.height, true);
 | 
						
						
						
							|  |  |                         else if (_curLineItemCount2 == _lineCount)
 | 
						
						
						
							|  |  |                             ii.obj.SetSize(ii.obj.width, partHeight, true);
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     itemRenderer(i % _numItems, ii.obj);
 | 
						
						
						
							|  |  |                     ii.size.x = Mathf.CeilToInt(ii.obj.size.x);
 | 
						
						
						
							|  |  |                     ii.size.y = Mathf.CeilToInt(ii.obj.size.y);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //排列item
 | 
						
						
						
							|  |  |             float borderX = (startIndex / pageSize) * viewWidth;
 | 
						
						
						
							|  |  |             float xx = borderX;
 | 
						
						
						
							|  |  |             float yy = 0;
 | 
						
						
						
							|  |  |             float lineHeight = 0;
 | 
						
						
						
							|  |  |             for (int i = startIndex; i < lastIndex; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (i >= _realNumItems)
 | 
						
						
						
							|  |  |                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                 if (ii.updateFlag == itemInfoVer)
 | 
						
						
						
							|  |  |                     ii.obj.SetXY(xx, yy);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (ii.size.y > lineHeight)
 | 
						
						
						
							|  |  |                     lineHeight = ii.size.y;
 | 
						
						
						
							|  |  |                 if (i % _curLineItemCount == _curLineItemCount - 1)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     xx = borderX;
 | 
						
						
						
							|  |  |                     yy += lineHeight + _lineGap;
 | 
						
						
						
							|  |  |                     lineHeight = 0;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (i == startIndex + pageSize - 1)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         borderX += viewWidth;
 | 
						
						
						
							|  |  |                         xx = borderX;
 | 
						
						
						
							|  |  |                         yy = 0;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     xx += ii.size.x + _columnGap;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //释放未使用的
 | 
						
						
						
							|  |  |             for (int i = reuseIndex; i < virtualItemCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ItemInfo ii = _virtualItems[i];
 | 
						
						
						
							|  |  |                 if (ii.updateFlag != itemInfoVer && ii.obj != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (ii.obj is GButton)
 | 
						
						
						
							|  |  |                         ii.selected = ((GButton)ii.obj).selected;
 | 
						
						
						
							|  |  |                     RemoveChildToPool(ii.obj);
 | 
						
						
						
							|  |  |                     ii.obj = null;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void HandleArchOrder1()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (this.childrenRenderOrder == ChildrenRenderOrder.Arch)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float mid = this.scrollPane.posY + this.viewHeight / 2;
 | 
						
						
						
							|  |  |                 float minDist = int.MaxValue, dist;
 | 
						
						
						
							|  |  |                 int apexIndex = 0;
 | 
						
						
						
							|  |  |                 int cnt = this.numChildren;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GObject obj = GetChildAt(i);
 | 
						
						
						
							|  |  |                     if (!foldInvisibleItems || obj.visible)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         dist = Mathf.Abs(mid - obj.y - obj.height / 2);
 | 
						
						
						
							|  |  |                         if (dist < minDist)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             minDist = dist;
 | 
						
						
						
							|  |  |                             apexIndex = i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 this.apexIndex = apexIndex;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         void HandleArchOrder2()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (this.childrenRenderOrder == ChildrenRenderOrder.Arch)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 float mid = this.scrollPane.posX + this.viewWidth / 2;
 | 
						
						
						
							|  |  |                 float minDist = int.MaxValue, dist;
 | 
						
						
						
							|  |  |                 int apexIndex = 0;
 | 
						
						
						
							|  |  |                 int cnt = this.numChildren;
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     GObject obj = GetChildAt(i);
 | 
						
						
						
							|  |  |                     if (!foldInvisibleItems || obj.visible)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         dist = Mathf.Abs(mid - obj.x - obj.width / 2);
 | 
						
						
						
							|  |  |                         if (dist < minDist)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             minDist = dist;
 | 
						
						
						
							|  |  |                             apexIndex = i;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 this.apexIndex = apexIndex;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override protected internal void GetSnappingPosition(ref float xValue, ref float yValue)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_layout == ListLayoutType.SingleColumn || _layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float saved = yValue;
 | 
						
						
						
							|  |  |                     int index = GetIndexOnPos1(ref yValue, false);
 | 
						
						
						
							|  |  |                     if (index < _virtualItems.Count && saved - yValue > _virtualItems[index].size.y / 2 && index < _realNumItems)
 | 
						
						
						
							|  |  |                         yValue += _virtualItems[index].size.y + _lineGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else if (_layout == ListLayoutType.SingleRow || _layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float saved = xValue;
 | 
						
						
						
							|  |  |                     int index = GetIndexOnPos2(ref xValue, false);
 | 
						
						
						
							|  |  |                     if (index < _virtualItems.Count && saved - xValue > _virtualItems[index].size.x / 2 && index < _realNumItems)
 | 
						
						
						
							|  |  |                         xValue += _virtualItems[index].size.x + _columnGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float saved = xValue;
 | 
						
						
						
							|  |  |                     int index = GetIndexOnPos3(ref xValue, false);
 | 
						
						
						
							|  |  |                     if (index < _virtualItems.Count && saved - xValue > _virtualItems[index].size.x / 2 && index < _realNumItems)
 | 
						
						
						
							|  |  |                         xValue += _virtualItems[index].size.x + _columnGap;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 base.GetSnappingPosition(ref xValue, ref yValue);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         private void HandleAlign(float contentWidth, float contentHeight)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             Vector2 newOffset = Vector2.zero;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (contentHeight < viewHeight)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_verticalAlign == VertAlignType.Middle)
 | 
						
						
						
							|  |  |                     newOffset.y = (int)((viewHeight - contentHeight) / 2);
 | 
						
						
						
							|  |  |                 else if (_verticalAlign == VertAlignType.Bottom)
 | 
						
						
						
							|  |  |                     newOffset.y = viewHeight - contentHeight;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (contentWidth < this.viewWidth)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_align == AlignType.Center)
 | 
						
						
						
							|  |  |                     newOffset.x = (int)((viewWidth - contentWidth) / 2);
 | 
						
						
						
							|  |  |                 else if (_align == AlignType.Right)
 | 
						
						
						
							|  |  |                     newOffset.x = viewWidth - contentWidth;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (newOffset != _alignOffset)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _alignOffset = newOffset;
 | 
						
						
						
							|  |  |                 if (scrollPane != null)
 | 
						
						
						
							|  |  |                     scrollPane.AdjustMaskContainer();
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     container.SetXY(_margin.left + _alignOffset.x, _margin.top + _alignOffset.y);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override protected void UpdateBounds()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_virtual)
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int cnt = _children.Count;
 | 
						
						
						
							|  |  |             int i;
 | 
						
						
						
							|  |  |             int j = 0;
 | 
						
						
						
							|  |  |             GObject child;
 | 
						
						
						
							|  |  |             float curX = 0;
 | 
						
						
						
							|  |  |             float curY = 0;
 | 
						
						
						
							|  |  |             float cw, ch;
 | 
						
						
						
							|  |  |             float maxWidth = 0;
 | 
						
						
						
							|  |  |             float maxHeight = 0;
 | 
						
						
						
							|  |  |             float viewWidth = this.viewWidth;
 | 
						
						
						
							|  |  |             float viewHeight = this.viewHeight;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (_layout == ListLayoutType.SingleColumn)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     child = GetChildAt(i);
 | 
						
						
						
							|  |  |                     if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (curY != 0)
 | 
						
						
						
							|  |  |                         curY += _lineGap;
 | 
						
						
						
							|  |  |                     child.y = curY;
 | 
						
						
						
							|  |  |                     if (_autoResizeItem)
 | 
						
						
						
							|  |  |                         child.SetSize(viewWidth, child.height, true);
 | 
						
						
						
							|  |  |                     curY += Mathf.CeilToInt(child.height);
 | 
						
						
						
							|  |  |                     if (child.width > maxWidth)
 | 
						
						
						
							|  |  |                         maxWidth = child.width;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 ch = curY;
 | 
						
						
						
							|  |  |                 if (ch <= viewHeight && _autoResizeItem && scrollPane != null && scrollPane._displayInDemand && scrollPane.vtScrollBar != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     viewWidth += scrollPane.vtScrollBar.width;
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         child.SetSize(viewWidth, child.height, true);
 | 
						
						
						
							|  |  |                         if (child.width > maxWidth)
 | 
						
						
						
							|  |  |                             maxWidth = child.width;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 cw = Mathf.CeilToInt(maxWidth);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (_layout == ListLayoutType.SingleRow)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     child = GetChildAt(i);
 | 
						
						
						
							|  |  |                     if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     if (curX != 0)
 | 
						
						
						
							|  |  |                         curX += _columnGap;
 | 
						
						
						
							|  |  |                     child.x = curX;
 | 
						
						
						
							|  |  |                     if (_autoResizeItem)
 | 
						
						
						
							|  |  |                         child.SetSize(child.width, viewHeight, true);
 | 
						
						
						
							|  |  |                     curX += Mathf.CeilToInt(child.width);
 | 
						
						
						
							|  |  |                     if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                         maxHeight = child.height;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 cw = curX;
 | 
						
						
						
							|  |  |                 if (cw <= viewWidth && _autoResizeItem && scrollPane != null && scrollPane._displayInDemand && scrollPane.hzScrollBar != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     viewHeight += scrollPane.hzScrollBar.height;
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         child.SetSize(child.width, viewHeight, true);
 | 
						
						
						
							|  |  |                         if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                             maxHeight = child.height;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 ch = Mathf.CeilToInt(maxHeight);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (_layout == ListLayoutType.FlowHorizontal)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_autoResizeItem && _columnCount > 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float lineSize = 0;
 | 
						
						
						
							|  |  |                     int lineStart = 0;
 | 
						
						
						
							|  |  |                     float remainSize;
 | 
						
						
						
							|  |  |                     float remainPercent;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         lineSize += child.sourceWidth;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                         if (j == _columnCount || i == cnt - 1)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             remainSize = viewWidth - (j - 1) * _columnGap;
 | 
						
						
						
							|  |  |                             remainPercent = 1;
 | 
						
						
						
							|  |  |                             curX = 0;
 | 
						
						
						
							|  |  |                             for (j = lineStart; j <= i; j++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 child = GetChildAt(j);
 | 
						
						
						
							|  |  |                                 if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 child.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                                 float perc = child.sourceWidth / lineSize;
 | 
						
						
						
							|  |  |                                 child.SetSize(Mathf.Round(perc / remainPercent * remainSize), child.height, true);
 | 
						
						
						
							|  |  |                                 remainSize -= child.width;
 | 
						
						
						
							|  |  |                                 remainPercent -= perc;
 | 
						
						
						
							|  |  |                                 curX += child.width + _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                                     maxHeight = child.height;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             //new line
 | 
						
						
						
							|  |  |                             curY += Mathf.CeilToInt(maxHeight) + _lineGap;
 | 
						
						
						
							|  |  |                             maxHeight = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                             lineStart = i + 1;
 | 
						
						
						
							|  |  |                             lineSize = 0;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ch = curY + Mathf.CeilToInt(maxHeight);
 | 
						
						
						
							|  |  |                     cw = viewWidth;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (curX != 0)
 | 
						
						
						
							|  |  |                             curX += _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (_columnCount != 0 && j >= _columnCount
 | 
						
						
						
							|  |  |                             || _columnCount == 0 && curX + child.width > viewWidth && maxHeight != 0)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             //new line
 | 
						
						
						
							|  |  |                             curX = 0;
 | 
						
						
						
							|  |  |                             curY += Mathf.CeilToInt(maxHeight) + _lineGap;
 | 
						
						
						
							|  |  |                             maxHeight = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         child.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                         curX += Mathf.CeilToInt(child.width);
 | 
						
						
						
							|  |  |                         if (curX > maxWidth)
 | 
						
						
						
							|  |  |                             maxWidth = curX;
 | 
						
						
						
							|  |  |                         if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                             maxHeight = child.height;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     ch = curY + Mathf.CeilToInt(maxHeight);
 | 
						
						
						
							|  |  |                     cw = Mathf.CeilToInt(maxWidth);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (_layout == ListLayoutType.FlowVertical)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_autoResizeItem && _lineCount > 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float lineSize = 0;
 | 
						
						
						
							|  |  |                     int lineStart = 0;
 | 
						
						
						
							|  |  |                     float remainSize;
 | 
						
						
						
							|  |  |                     float remainPercent;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         lineSize += child.sourceHeight;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                         if (j == _lineCount || i == cnt - 1)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             remainSize = viewHeight - (j - 1) * _lineGap;
 | 
						
						
						
							|  |  |                             remainPercent = 1;
 | 
						
						
						
							|  |  |                             curY = 0;
 | 
						
						
						
							|  |  |                             for (j = lineStart; j <= i; j++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 child = GetChildAt(j);
 | 
						
						
						
							|  |  |                                 if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 child.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                                 float perc = child.sourceHeight / lineSize;
 | 
						
						
						
							|  |  |                                 child.SetSize(child.width, Mathf.Round(perc / remainPercent * remainSize), true);
 | 
						
						
						
							|  |  |                                 remainSize -= child.height;
 | 
						
						
						
							|  |  |                                 remainPercent -= perc;
 | 
						
						
						
							|  |  |                                 curY += child.height + _lineGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 if (child.width > maxWidth)
 | 
						
						
						
							|  |  |                                     maxWidth = child.width;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             //new line
 | 
						
						
						
							|  |  |                             curX += Mathf.CeilToInt(maxWidth) + _columnGap;
 | 
						
						
						
							|  |  |                             maxWidth = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                             lineStart = i + 1;
 | 
						
						
						
							|  |  |                             lineSize = 0;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     cw = curX + Mathf.CeilToInt(maxWidth);
 | 
						
						
						
							|  |  |                     ch = viewHeight;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (curY != 0)
 | 
						
						
						
							|  |  |                             curY += _lineGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (_lineCount != 0 && j >= _lineCount
 | 
						
						
						
							|  |  |                             || _lineCount == 0 && curY + child.height > viewHeight && maxWidth != 0)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             curY = 0;
 | 
						
						
						
							|  |  |                             curX += Mathf.CeilToInt(maxWidth) + _columnGap;
 | 
						
						
						
							|  |  |                             maxWidth = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         child.SetXY(curX, curY);
 | 
						
						
						
							|  |  |                         curY += child.height;
 | 
						
						
						
							|  |  |                         if (curY > maxHeight)
 | 
						
						
						
							|  |  |                             maxHeight = curY;
 | 
						
						
						
							|  |  |                         if (child.width > maxWidth)
 | 
						
						
						
							|  |  |                             maxWidth = child.width;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     cw = curX + Mathf.CeilToInt(maxWidth);
 | 
						
						
						
							|  |  |                     ch = Mathf.CeilToInt(maxHeight);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else //pagination
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int page = 0;
 | 
						
						
						
							|  |  |                 int k = 0;
 | 
						
						
						
							|  |  |                 float eachHeight = 0;
 | 
						
						
						
							|  |  |                 if (_autoResizeItem && _lineCount > 0)
 | 
						
						
						
							|  |  |                     eachHeight = Mathf.Floor((viewHeight - (_lineCount - 1) * _lineGap) / _lineCount);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (_autoResizeItem && _columnCount > 0)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     float lineSize = 0;
 | 
						
						
						
							|  |  |                     int lineStart = 0;
 | 
						
						
						
							|  |  |                     float remainSize;
 | 
						
						
						
							|  |  |                     float remainPercent;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (j == 0 && (_lineCount != 0 && k >= _lineCount
 | 
						
						
						
							|  |  |                             || _lineCount == 0 && curY + (_lineCount > 0 ? eachHeight : child.height) > viewHeight))
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             //new page
 | 
						
						
						
							|  |  |                             page++;
 | 
						
						
						
							|  |  |                             curY = 0;
 | 
						
						
						
							|  |  |                             k = 0;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         lineSize += child.sourceWidth;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                         if (j == _columnCount || i == cnt - 1)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             remainSize = viewWidth - (j - 1) * _columnGap;
 | 
						
						
						
							|  |  |                             remainPercent = 1;
 | 
						
						
						
							|  |  |                             curX = 0;
 | 
						
						
						
							|  |  |                             for (j = lineStart; j <= i; j++)
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 child = GetChildAt(j);
 | 
						
						
						
							|  |  |                                 if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                                     continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 child.SetXY(page * viewWidth + curX, curY);
 | 
						
						
						
							|  |  |                                 float perc = child.sourceWidth / lineSize;
 | 
						
						
						
							|  |  |                                 child.SetSize(Mathf.Round(perc / remainPercent * remainSize), _lineCount > 0 ? eachHeight : child.height, true);
 | 
						
						
						
							|  |  |                                 remainSize -= child.width;
 | 
						
						
						
							|  |  |                                 remainPercent -= perc;
 | 
						
						
						
							|  |  |                                 curX += child.width + _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                                 if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                                     maxHeight = child.height;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                             //new line
 | 
						
						
						
							|  |  |                             curY += Mathf.CeilToInt(maxHeight) + _lineGap;
 | 
						
						
						
							|  |  |                             maxHeight = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                             lineStart = i + 1;
 | 
						
						
						
							|  |  |                             lineSize = 0;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                             k++;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     for (i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         child = GetChildAt(i);
 | 
						
						
						
							|  |  |                         if (foldInvisibleItems && !child.visible)
 | 
						
						
						
							|  |  |                             continue;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (curX != 0)
 | 
						
						
						
							|  |  |                             curX += _columnGap;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (_autoResizeItem && _lineCount > 0)
 | 
						
						
						
							|  |  |                             child.SetSize(child.width, eachHeight, true);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                         if (_columnCount != 0 && j >= _columnCount
 | 
						
						
						
							|  |  |                             || _columnCount == 0 && curX + child.width > viewWidth && maxHeight != 0)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             curX = 0;
 | 
						
						
						
							|  |  |                             curY += maxHeight + _lineGap;
 | 
						
						
						
							|  |  |                             maxHeight = 0;
 | 
						
						
						
							|  |  |                             j = 0;
 | 
						
						
						
							|  |  |                             k++;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                             if (_lineCount != 0 && k >= _lineCount
 | 
						
						
						
							|  |  |                                 || _lineCount == 0 && curY + child.height > viewHeight && maxWidth != 0)//new page
 | 
						
						
						
							|  |  |                             {
 | 
						
						
						
							|  |  |                                 page++;
 | 
						
						
						
							|  |  |                                 curY = 0;
 | 
						
						
						
							|  |  |                                 k = 0;
 | 
						
						
						
							|  |  |                             }
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                         child.SetXY(page * viewWidth + curX, curY);
 | 
						
						
						
							|  |  |                         curX += Mathf.CeilToInt(child.width);
 | 
						
						
						
							|  |  |                         if (curX > maxWidth)
 | 
						
						
						
							|  |  |                             maxWidth = curX;
 | 
						
						
						
							|  |  |                         if (child.height > maxHeight)
 | 
						
						
						
							|  |  |                             maxHeight = child.height;
 | 
						
						
						
							|  |  |                         j++;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 ch = page > 0 ? viewHeight : (curY + Mathf.CeilToInt(maxHeight));
 | 
						
						
						
							|  |  |                 cw = (page + 1) * viewWidth;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             HandleAlign(cw, ch);
 | 
						
						
						
							|  |  |             SetBounds(0, 0, cw, ch);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             InvalidateBatchingState(true);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.Setup_BeforeAdd(buffer, beginPos);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             buffer.Seek(beginPos, 5);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             _layout = (ListLayoutType)buffer.ReadByte();
 | 
						
						
						
							|  |  |             selectionMode = (ListSelectionMode)buffer.ReadByte();
 | 
						
						
						
							|  |  |             _align = (AlignType)buffer.ReadByte();
 | 
						
						
						
							|  |  |             _verticalAlign = (VertAlignType)buffer.ReadByte();
 | 
						
						
						
							|  |  |             _lineGap = buffer.ReadShort();
 | 
						
						
						
							|  |  |             _columnGap = buffer.ReadShort();
 | 
						
						
						
							|  |  |             _lineCount = buffer.ReadShort();
 | 
						
						
						
							|  |  |             _columnCount = buffer.ReadShort();
 | 
						
						
						
							|  |  |             _autoResizeItem = buffer.ReadBool();
 | 
						
						
						
							|  |  |             _childrenRenderOrder = (ChildrenRenderOrder)buffer.ReadByte();
 | 
						
						
						
							|  |  |             _apexIndex = buffer.ReadShort();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (buffer.ReadBool())
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _margin.top = buffer.ReadInt();
 | 
						
						
						
							|  |  |                 _margin.bottom = buffer.ReadInt();
 | 
						
						
						
							|  |  |                 _margin.left = buffer.ReadInt();
 | 
						
						
						
							|  |  |                 _margin.right = buffer.ReadInt();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             OverflowType overflow = (OverflowType)buffer.ReadByte();
 | 
						
						
						
							|  |  |             if (overflow == OverflowType.Scroll)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int savedPos = buffer.position;
 | 
						
						
						
							|  |  |                 buffer.Seek(beginPos, 7);
 | 
						
						
						
							|  |  |                 SetupScroll(buffer);
 | 
						
						
						
							|  |  |                 buffer.position = savedPos;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |                 SetupOverflow(overflow);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (buffer.ReadBool())
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int i1 = buffer.ReadInt();
 | 
						
						
						
							|  |  |                 int i2 = buffer.ReadInt();
 | 
						
						
						
							|  |  |                 this.clipSoftness = new Vector2(i1, i2);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (buffer.version >= 2)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 scrollItemToViewOnClick = buffer.ReadBool();
 | 
						
						
						
							|  |  |                 foldInvisibleItems = buffer.ReadBool();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             buffer.Seek(beginPos, 8);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             defaultItem = buffer.ReadS();
 | 
						
						
						
							|  |  |             ReadItems(buffer);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual protected void ReadItems(ByteBuffer buffer)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             int itemCount = buffer.ReadShort();
 | 
						
						
						
							|  |  |             for (int i = 0; i < itemCount; i++)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int nextPos = buffer.ReadShort();
 | 
						
						
						
							|  |  |                 nextPos += buffer.position;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 string str = buffer.ReadS();
 | 
						
						
						
							|  |  |                 if (str == null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     str = defaultItem;
 | 
						
						
						
							|  |  |                     if (string.IsNullOrEmpty(str))
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         buffer.position = nextPos;
 | 
						
						
						
							|  |  |                         continue;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 GObject obj = GetFromPool(str);
 | 
						
						
						
							|  |  |                 if (obj != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     AddChild(obj);
 | 
						
						
						
							|  |  |                     SetupItem(buffer, obj);
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 buffer.position = nextPos;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         protected void SetupItem(ByteBuffer buffer, GObject obj)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             string str;
 | 
						
						
						
							|  |  |             str = buffer.ReadS();
 | 
						
						
						
							|  |  |             if (str != null)
 | 
						
						
						
							|  |  |                 obj.text = str;
 | 
						
						
						
							|  |  |             str = buffer.ReadS();
 | 
						
						
						
							|  |  |             if (str != null && (obj is GButton))
 | 
						
						
						
							|  |  |                 (obj as GButton).selectedTitle = str;
 | 
						
						
						
							|  |  |             str = buffer.ReadS();
 | 
						
						
						
							|  |  |             if (str != null)
 | 
						
						
						
							|  |  |                 obj.icon = str;
 | 
						
						
						
							|  |  |             str = buffer.ReadS();
 | 
						
						
						
							|  |  |             if (str != null && (obj is GButton))
 | 
						
						
						
							|  |  |                 (obj as GButton).selectedIcon = str;
 | 
						
						
						
							|  |  |             str = buffer.ReadS();
 | 
						
						
						
							|  |  |             if (str != null)
 | 
						
						
						
							|  |  |                 obj.name = str;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (obj is GComponent)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 int cnt = buffer.ReadShort();
 | 
						
						
						
							|  |  |                 for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     Controller cc = ((GComponent)obj).GetController(buffer.ReadS());
 | 
						
						
						
							|  |  |                     str = buffer.ReadS();
 | 
						
						
						
							|  |  |                     if (cc != null)
 | 
						
						
						
							|  |  |                         cc.selectedPageId = str;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 if (buffer.version >= 2)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     cnt = buffer.ReadShort();
 | 
						
						
						
							|  |  |                     for (int i = 0; i < cnt; i++)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         string target = buffer.ReadS();
 | 
						
						
						
							|  |  |                         int propertyId = buffer.ReadShort();
 | 
						
						
						
							|  |  |                         string value = buffer.ReadS();
 | 
						
						
						
							|  |  |                         GObject obj2 = ((GComponent)obj).GetChildByPath(target);
 | 
						
						
						
							|  |  |                         if (obj2 != null)
 | 
						
						
						
							|  |  |                         {
 | 
						
						
						
							|  |  |                             if (propertyId == 0)
 | 
						
						
						
							|  |  |                                 obj2.text = value;
 | 
						
						
						
							|  |  |                             else if (propertyId == 1)
 | 
						
						
						
							|  |  |                                 obj2.icon = value;
 | 
						
						
						
							|  |  |                         }
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             base.Setup_AfterAdd(buffer, beginPos);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             buffer.Seek(beginPos, 6);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             int i = buffer.ReadShort();
 | 
						
						
						
							|  |  |             if (i != -1)
 | 
						
						
						
							|  |  |                 _selectionController = parent.GetControllerAt(i);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | }
 |