|  |  |  |  | using System; | 
					
						
							|  |  |  |  | using UnityEngine; | 
					
						
							|  |  |  |  | using FairyGUI.Utils; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace FairyGUI | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     /// <summary> | 
					
						
							|  |  |  |  |     /// GProgressBar class. | 
					
						
							|  |  |  |  |     /// </summary> | 
					
						
							|  |  |  |  |     public class GProgressBar : GComponent | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         double _min; | 
					
						
							|  |  |  |  |         double _max; | 
					
						
							|  |  |  |  |         double _value; | 
					
						
							|  |  |  |  |         ProgressTitleType _titleType; | 
					
						
							|  |  |  |  |         bool _reverse; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         GObject _titleObject; | 
					
						
							|  |  |  |  |         GMovieClip _aniObject; | 
					
						
							|  |  |  |  |         GObject _barObjectH; | 
					
						
							|  |  |  |  |         GObject _barObjectV; | 
					
						
							|  |  |  |  |         float _barMaxWidth; | 
					
						
							|  |  |  |  |         float _barMaxHeight; | 
					
						
							|  |  |  |  |         float _barMaxWidthDelta; | 
					
						
							|  |  |  |  |         float _barMaxHeightDelta; | 
					
						
							|  |  |  |  |         float _barStartX; | 
					
						
							|  |  |  |  |         float _barStartY; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public GProgressBar() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             _value = 50; | 
					
						
							|  |  |  |  |             _max = 100; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public ProgressTitleType titleType | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return _titleType; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_titleType != value) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     _titleType = value; | 
					
						
							|  |  |  |  |                     Update(_value); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public double min | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return _min; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_min != value) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     _min = value; | 
					
						
							|  |  |  |  |                     Update(_value); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public double max | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return _max; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_max != value) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     _max = value; | 
					
						
							|  |  |  |  |                     Update(_value); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public double value | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return _value; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             set | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_value != value) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     GTween.Kill(this, TweenPropType.Progress, false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     _value = value; | 
					
						
							|  |  |  |  |                     Update(_value); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public bool reverse | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             get { return _reverse; } | 
					
						
							|  |  |  |  |             set { _reverse = value; } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 动态改变进度值。 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="value"></param> | 
					
						
							|  |  |  |  |         /// <param name="duration"></param> | 
					
						
							|  |  |  |  |         public GTweener TweenValue(double value, float duration) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             double oldValule; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             GTweener twener = GTween.GetTween(this, TweenPropType.Progress); | 
					
						
							|  |  |  |  |             if (twener != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 oldValule = twener.value.d; | 
					
						
							|  |  |  |  |                 twener.Kill(false); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 oldValule = _value; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             _value = value; | 
					
						
							|  |  |  |  |             return GTween.ToDouble(oldValule, _value, duration) | 
					
						
							|  |  |  |  |                 .SetEase(EaseType.Linear) | 
					
						
							|  |  |  |  |                 .SetTarget(this, TweenPropType.Progress); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         ///  | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="newValue"></param> | 
					
						
							|  |  |  |  |         public void Update(double newValue) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             float percent = Mathf.Clamp01((float)((newValue - _min) / (_max - _min))); | 
					
						
							|  |  |  |  |             if (_titleObject != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 switch (_titleType) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     case ProgressTitleType.Percent: | 
					
						
							|  |  |  |  |                         if (RTLSupport.BaseDirection == RTLSupport.DirectionType.RTL) | 
					
						
							|  |  |  |  |                             _titleObject.text = "%" + Mathf.FloorToInt(percent * 100); | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                             _titleObject.text = Mathf.FloorToInt(percent * 100) + "%"; | 
					
						
							|  |  |  |  |                         break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     case ProgressTitleType.ValueAndMax: | 
					
						
							|  |  |  |  |                         if (RTLSupport.BaseDirection == RTLSupport.DirectionType.RTL) | 
					
						
							|  |  |  |  |                             _titleObject.text = Math.Round(max) + "/" + Math.Round(newValue); | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                             _titleObject.text = Math.Round(newValue) + "/" + Math.Round(max); | 
					
						
							|  |  |  |  |                         break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     case ProgressTitleType.Value: | 
					
						
							|  |  |  |  |                         _titleObject.text = "" + Math.Round(newValue); | 
					
						
							|  |  |  |  |                         break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     case ProgressTitleType.Max: | 
					
						
							|  |  |  |  |                         _titleObject.text = "" + Math.Round(_max); | 
					
						
							|  |  |  |  |                         break; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             float fullWidth = this.width - _barMaxWidthDelta; | 
					
						
							|  |  |  |  |             float fullHeight = this.height - _barMaxHeightDelta; | 
					
						
							|  |  |  |  |             if (!_reverse) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_barObjectH != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (!SetFillAmount(_barObjectH, percent)) | 
					
						
							|  |  |  |  |                         _barObjectH.width = Mathf.RoundToInt(fullWidth * percent); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 if (_barObjectV != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (!SetFillAmount(_barObjectV, percent)) | 
					
						
							|  |  |  |  |                         _barObjectV.height = Mathf.RoundToInt(fullHeight * percent); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (_barObjectH != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (!SetFillAmount(_barObjectH, 1 - percent)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         _barObjectH.width = Mathf.RoundToInt(fullWidth * percent); | 
					
						
							|  |  |  |  |                         _barObjectH.x = _barStartX + (fullWidth - _barObjectH.width); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 if (_barObjectV != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (!SetFillAmount(_barObjectV, 1 - percent)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         _barObjectV.height = Mathf.RoundToInt(fullHeight * percent); | 
					
						
							|  |  |  |  |                         _barObjectV.y = _barStartY + (fullHeight - _barObjectV.height); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (_aniObject != null) | 
					
						
							|  |  |  |  |                 _aniObject.frame = Mathf.RoundToInt(percent * 100); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             InvalidateBatchingState(true); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         bool SetFillAmount(GObject bar, float amount) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if ((bar is GImage) && ((GImage)bar).fillMethod != FillMethod.None) | 
					
						
							|  |  |  |  |                 ((GImage)bar).fillAmount = amount; | 
					
						
							|  |  |  |  |             else if ((bar is GLoader) && ((GLoader)bar).fillMethod != FillMethod.None) | 
					
						
							|  |  |  |  |                 ((GLoader)bar).fillAmount = amount; | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return true; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         override protected void ConstructExtension(ByteBuffer buffer) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             buffer.Seek(0, 6); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             _titleType = (ProgressTitleType)buffer.ReadByte(); | 
					
						
							|  |  |  |  |             _reverse = buffer.ReadBool(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             _titleObject = GetChild("title"); | 
					
						
							|  |  |  |  |             _barObjectH = GetChild("bar"); | 
					
						
							|  |  |  |  |             _barObjectV = GetChild("bar_v"); | 
					
						
							|  |  |  |  |             _aniObject = GetChild("ani") as GMovieClip; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (_barObjectH != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 _barMaxWidth = _barObjectH.width; | 
					
						
							|  |  |  |  |                 _barMaxWidthDelta = this.width - _barMaxWidth; | 
					
						
							|  |  |  |  |                 _barStartX = _barObjectH.x; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (_barObjectV != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 _barMaxHeight = _barObjectV.height; | 
					
						
							|  |  |  |  |                 _barMaxHeightDelta = this.height - _barMaxHeight; | 
					
						
							|  |  |  |  |                 _barStartY = _barObjectV.y; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             base.Setup_AfterAdd(buffer, beginPos); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (!buffer.Seek(beginPos, 6)) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Update(_value); | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if ((ObjectType)buffer.ReadByte() != packageItem.objectType) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Update(_value); | 
					
						
							|  |  |  |  |                 return; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             _value = buffer.ReadInt(); | 
					
						
							|  |  |  |  |             _max = buffer.ReadInt(); | 
					
						
							|  |  |  |  |             if (buffer.version >= 2) | 
					
						
							|  |  |  |  |                 _min = buffer.ReadInt(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (buffer.version >= 5) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 string sound = buffer.ReadS(); | 
					
						
							|  |  |  |  |                 if (!string.IsNullOrEmpty(sound)) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     float volumeScale = buffer.ReadFloat(); | 
					
						
							|  |  |  |  |                     displayObject.onClick.Add(() => | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         NAudioClip audioClip = UIPackage.GetItemAssetByURL(sound) as NAudioClip; | 
					
						
							|  |  |  |  |                         if (audioClip != null && audioClip.nativeClip != null) | 
					
						
							|  |  |  |  |                             Stage.inst.PlayOneShotSound(audioClip.nativeClip, volumeScale); | 
					
						
							|  |  |  |  |                     }); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                     buffer.Skip(4); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Update(_value); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         override protected void HandleSizeChanged() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             base.HandleSizeChanged(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (_barObjectH != null) | 
					
						
							|  |  |  |  |                 _barMaxWidth = this.width - _barMaxWidthDelta; | 
					
						
							|  |  |  |  |             if (_barObjectV != null) | 
					
						
							|  |  |  |  |                 _barMaxHeight = this.height - _barMaxHeightDelta; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (!this.underConstruct) | 
					
						
							|  |  |  |  |                 Update(_value); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |