| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 | 
							- using System;
 
- using FairyGUI.Utils;
 
- using UnityEngine;
 
- namespace FairyGUI
 
- {
 
-     /// <summary>
 
-     /// GGroup class.
 
-     /// 组对象,对应编辑器里的高级组。
 
-     /// </summary>
 
-     public class GGroup : GObject
 
-     {
 
-         GroupLayoutType _layout;
 
-         int _lineGap;
 
-         int _columnGap;
 
-         bool _excludeInvisibles;
 
-         bool _autoSizeDisabled;
 
-         int _mainGridIndex;
 
-         int _mainGridMinSize;
 
-         bool _percentReady;
 
-         bool _boundsChanged;
 
-         int _mainChildIndex;
 
-         float _totalSize;
 
-         int _numChildren;
 
-         internal int _updating;
 
-         Action _refreshDelegate;
 
-         public GGroup()
 
-         {
 
-             _mainGridIndex = -1;
 
-             _mainChildIndex = -1;
 
-             _mainGridMinSize = 50;
 
-             _refreshDelegate = EnsureBoundsCorrect;
 
-         }
 
-         /// <summary>
 
-         /// Group layout type.
 
-         /// </summary>
 
-         public GroupLayoutType layout
 
-         {
 
-             get { return _layout; }
 
-             set
 
-             {
 
-                 if (_layout != value)
 
-                 {
 
-                     _layout = value;
 
-                     SetBoundsChangedFlag();
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public int lineGap
 
-         {
 
-             get { return _lineGap; }
 
-             set
 
-             {
 
-                 if (_lineGap != value)
 
-                 {
 
-                     _lineGap = value;
 
-                     SetBoundsChangedFlag(true);
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public int columnGap
 
-         {
 
-             get { return _columnGap; }
 
-             set
 
-             {
 
-                 if (_columnGap != value)
 
-                 {
 
-                     _columnGap = value;
 
-                     SetBoundsChangedFlag(true);
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public bool excludeInvisibles
 
-         {
 
-             get { return _excludeInvisibles; }
 
-             set
 
-             {
 
-                 if (_excludeInvisibles != value)
 
-                 {
 
-                     _excludeInvisibles = value;
 
-                     SetBoundsChangedFlag();
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public bool autoSizeDisabled
 
-         {
 
-             get { return _autoSizeDisabled; }
 
-             set
 
-             {
 
-                 if (_autoSizeDisabled != value)
 
-                 {
 
-                     _autoSizeDisabled = value;
 
-                     SetBoundsChangedFlag();
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public int mainGridMinSize
 
-         {
 
-             get { return _mainGridMinSize; }
 
-             set
 
-             {
 
-                 if (_mainGridMinSize != value)
 
-                 {
 
-                     _mainGridMinSize = value;
 
-                     SetBoundsChangedFlag();
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         public int mainGridIndex
 
-         {
 
-             get { return _mainGridIndex; }
 
-             set
 
-             {
 
-                 if (_mainGridIndex != value)
 
-                 {
 
-                     _mainGridIndex = value;
 
-                     SetBoundsChangedFlag();
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Update group bounds.
 
-         /// 更新组的包围.
 
-         /// </summary>
 
-         public void SetBoundsChangedFlag(bool positionChangedOnly = false)
 
-         {
 
-             if (_updating == 0 && parent != null)
 
-             {
 
-                 if (!positionChangedOnly)
 
-                     _percentReady = false;
 
-                 if (!_boundsChanged)
 
-                 {
 
-                     _boundsChanged = true;
 
-                     if (_layout != GroupLayoutType.None)
 
-                     {
 
-                         UpdateContext.OnBegin -= _refreshDelegate;
 
-                         UpdateContext.OnBegin += _refreshDelegate;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         public void EnsureBoundsCorrect()
 
-         {
 
-             if (parent == null || !_boundsChanged)
 
-                 return;
 
-             UpdateContext.OnBegin -= _refreshDelegate;
 
-             _boundsChanged = false;
 
-             if (_autoSizeDisabled)
 
-                 ResizeChildren(0, 0);
 
-             else
 
-             {
 
-                 HandleLayout();
 
-                 UpdateBounds();
 
-             }
 
-         }
 
-         void UpdateBounds()
 
-         {
 
-             int cnt = parent.numChildren;
 
-             int i;
 
-             GObject child;
 
-             float ax = int.MaxValue, ay = int.MaxValue;
 
-             float ar = int.MinValue, ab = int.MinValue;
 
-             float tmp;
 
-             bool empty = true;
 
-             bool skipInvisibles = _layout != GroupLayoutType.None && _excludeInvisibles;
 
-             for (i = 0; i < cnt; i++)
 
-             {
 
-                 child = parent.GetChildAt(i);
 
-                 if (child.group != this)
 
-                     continue;
 
-                 if (skipInvisibles && !child.internalVisible3)
 
-                     continue;
 
-                 tmp = child.xMin;
 
-                 if (tmp < ax)
 
-                     ax = tmp;
 
-                 tmp = child.yMin;
 
-                 if (tmp < ay)
 
-                     ay = tmp;
 
-                 tmp = child.xMin + child.width;
 
-                 if (tmp > ar)
 
-                     ar = tmp;
 
-                 tmp = child.yMin + child.height;
 
-                 if (tmp > ab)
 
-                     ab = tmp;
 
-                 empty = false;
 
-             }
 
-             float w;
 
-             float h;
 
-             if (!empty)
 
-             {
 
-                 _updating |= 1;
 
-                 SetXY(ax, ay);
 
-                 _updating &= 2;
 
-                 w = ar - ax;
 
-                 h = ab - ay;
 
-             }
 
-             else
 
-                 w = h = 0;
 
-             if ((_updating & 2) == 0)
 
-             {
 
-                 _updating |= 2;
 
-                 SetSize(w, h);
 
-                 _updating &= 1;
 
-             }
 
-             else
 
-             {
 
-                 _updating &= 1;
 
-                 ResizeChildren(_width - w, _height - h);
 
-             }
 
-         }
 
-         void HandleLayout()
 
-         {
 
-             _updating |= 1;
 
-             if (_layout == GroupLayoutType.Horizontal)
 
-             {
 
-                 float curX = this.x;
 
-                 int cnt = parent.numChildren;
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (_excludeInvisibles && !child.internalVisible3)
 
-                         continue;
 
-                     child.xMin = curX;
 
-                     if (child.width != 0)
 
-                         curX += child.width + _columnGap;
 
-                 }
 
-             }
 
-             else if (_layout == GroupLayoutType.Vertical)
 
-             {
 
-                 float curY = this.y;
 
-                 int cnt = parent.numChildren;
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (_excludeInvisibles && !child.internalVisible3)
 
-                         continue;
 
-                     child.yMin = curY;
 
-                     if (child.height != 0)
 
-                         curY += child.height + _lineGap;
 
-                 }
 
-             }
 
-             _updating &= 2;
 
-         }
 
-         internal void MoveChildren(float dx, float dy)
 
-         {
 
-             if ((_updating & 1) != 0 || parent == null)
 
-                 return;
 
-             _updating |= 1;
 
-             int cnt = parent.numChildren;
 
-             int i;
 
-             GObject child;
 
-             for (i = 0; i < cnt; i++)
 
-             {
 
-                 child = parent.GetChildAt(i);
 
-                 if (child.group == this)
 
-                 {
 
-                     child.SetXY(child.x + dx, child.y + dy);
 
-                 }
 
-             }
 
-             _updating &= 2;
 
-         }
 
-         internal void ResizeChildren(float dw, float dh)
 
-         {
 
-             if (_layout == GroupLayoutType.None || (_updating & 2) != 0 || parent == null)
 
-                 return;
 
-             _updating |= 2;
 
-             if (_boundsChanged)
 
-             {
 
-                 _boundsChanged = false;
 
-                 if (!_autoSizeDisabled)
 
-                 {
 
-                     UpdateBounds();
 
-                     return;
 
-                 }
 
-             }
 
-             int cnt = parent.numChildren;
 
-             if (!_percentReady)
 
-             {
 
-                 _percentReady = true;
 
-                 _numChildren = 0;
 
-                 _totalSize = 0;
 
-                 _mainChildIndex = -1;
 
-                 int j = 0;
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (!_excludeInvisibles || child.internalVisible3)
 
-                     {
 
-                         if (j == _mainGridIndex)
 
-                             _mainChildIndex = i;
 
-                         _numChildren++;
 
-                         if (_layout == GroupLayoutType.Horizontal)
 
-                             _totalSize += child.width;
 
-                         else
 
-                             _totalSize += child.height;
 
-                     }
 
-                     j++;
 
-                 }
 
-                 if (_mainChildIndex != -1)
 
-                 {
 
-                     if (_layout == GroupLayoutType.Horizontal)
 
-                     {
 
-                         GObject child = parent.GetChildAt(_mainChildIndex);
 
-                         _totalSize += _mainGridMinSize - child.width;
 
-                         child._sizePercentInGroup = _mainGridMinSize / _totalSize;
 
-                     }
 
-                     else
 
-                     {
 
-                         GObject child = parent.GetChildAt(_mainChildIndex);
 
-                         _totalSize += _mainGridMinSize - child.height;
 
-                         child._sizePercentInGroup = _mainGridMinSize / _totalSize;
 
-                     }
 
-                 }
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (i == _mainChildIndex)
 
-                         continue;
 
-                     if (_totalSize > 0)
 
-                         child._sizePercentInGroup = (_layout == GroupLayoutType.Horizontal ? child.width : child.height) / _totalSize;
 
-                     else
 
-                         child._sizePercentInGroup = 0;
 
-                 }
 
-             }
 
-             float remainSize = 0;
 
-             float remainPercent = 1;
 
-             bool priorHandled = false;
 
-             if (_layout == GroupLayoutType.Horizontal)
 
-             {
 
-                 remainSize = this.width - (_numChildren - 1) * _columnGap;
 
-                 if (_mainChildIndex != -1 && remainSize >= _totalSize)
 
-                 {
 
-                     GObject child = parent.GetChildAt(_mainChildIndex);
 
-                     child.SetSize(remainSize - (_totalSize - _mainGridMinSize), child._rawHeight + dh, true);
 
-                     remainSize -= child.width;
 
-                     remainPercent -= child._sizePercentInGroup;
 
-                     priorHandled = true;
 
-                 }
 
-                 float curX = this.x;
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (_excludeInvisibles && !child.internalVisible3)
 
-                     {
 
-                         child.SetSize(child._rawWidth, child._rawHeight + dh, true);
 
-                         continue;
 
-                     }
 
-                     if (!priorHandled || i != _mainChildIndex)
 
-                     {
 
-                         child.SetSize(Mathf.Round(child._sizePercentInGroup / remainPercent * remainSize), child._rawHeight + dh, true);
 
-                         remainPercent -= child._sizePercentInGroup;
 
-                         remainSize -= child.width;
 
-                     }
 
-                     child.xMin = curX;
 
-                     if (child.width != 0)
 
-                         curX += child.width + _columnGap;
 
-                 }
 
-             }
 
-             else
 
-             {
 
-                 remainSize = this.height - (_numChildren - 1) * _lineGap;
 
-                 if (_mainChildIndex != -1 && remainSize >= _totalSize)
 
-                 {
 
-                     GObject child = parent.GetChildAt(_mainChildIndex);
 
-                     child.SetSize(child._rawWidth + dw, remainSize - (_totalSize - _mainGridMinSize), true);
 
-                     remainSize -= child.height;
 
-                     remainPercent -= child._sizePercentInGroup;
 
-                     priorHandled = true;
 
-                 }
 
-                 float curY = this.y;
 
-                 for (int i = 0; i < cnt; i++)
 
-                 {
 
-                     GObject child = parent.GetChildAt(i);
 
-                     if (child.group != this)
 
-                         continue;
 
-                     if (_excludeInvisibles && !child.internalVisible3)
 
-                     {
 
-                         child.SetSize(child._rawWidth + dw, child._rawHeight, true);
 
-                         continue;
 
-                     }
 
-                     if (!priorHandled || i != _mainChildIndex)
 
-                     {
 
-                         child.SetSize(child._rawWidth + dw, Mathf.Round(child._sizePercentInGroup / remainPercent * remainSize), true);
 
-                         remainPercent -= child._sizePercentInGroup;
 
-                         remainSize -= child.height;
 
-                     }
 
-                     child.yMin = curY;
 
-                     if (child.height != 0)
 
-                         curY += child.height + _lineGap;
 
-                 }
 
-             }
 
-             _updating &= 1;
 
-         }
 
-         override protected void HandleAlphaChanged()
 
-         {
 
-             base.HandleAlphaChanged();
 
-             if (this.underConstruct || parent == null)
 
-                 return;
 
-             int cnt = parent.numChildren;
 
-             float a = this.alpha;
 
-             for (int i = 0; i < cnt; i++)
 
-             {
 
-                 GObject child = parent.GetChildAt(i);
 
-                 if (child.group == this)
 
-                     child.alpha = a;
 
-             }
 
-         }
 
-         override internal protected void HandleVisibleChanged()
 
-         {
 
-             if (parent == null)
 
-                 return;
 
-             int cnt = parent.numChildren;
 
-             for (int i = 0; i < cnt; i++)
 
-             {
 
-                 GObject child = parent.GetChildAt(i);
 
-                 if (child.group == this)
 
-                     child.HandleVisibleChanged();
 
-             }
 
-         }
 
-         override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
 
-         {
 
-             base.Setup_BeforeAdd(buffer, beginPos);
 
-             buffer.Seek(beginPos, 5);
 
-             _layout = (GroupLayoutType)buffer.ReadByte();
 
-             _lineGap = buffer.ReadInt();
 
-             _columnGap = buffer.ReadInt();
 
-             if (buffer.version >= 2)
 
-             {
 
-                 _excludeInvisibles = buffer.ReadBool();
 
-                 _autoSizeDisabled = buffer.ReadBool();
 
-                 _mainGridIndex = buffer.ReadShort();
 
-             }
 
-         }
 
-         override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
 
-         {
 
-             base.Setup_AfterAdd(buffer, beginPos);
 
-             if (!this.visible)
 
-                 HandleVisibleChanged();
 
-         }
 
-     }
 
- }
 
 
  |