using System;
using UnityEngine;
using FairyGUI.Utils;
namespace FairyGUI
{
///
/// GProgressBar class.
///
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;
}
///
///
///
public ProgressTitleType titleType
{
get
{
return _titleType;
}
set
{
if (_titleType != value)
{
_titleType = value;
Update(_value);
}
}
}
///
///
///
public double min
{
get
{
return _min;
}
set
{
if (_min != value)
{
_min = value;
Update(_value);
}
}
}
///
///
///
public double max
{
get
{
return _max;
}
set
{
if (_max != value)
{
_max = value;
Update(_value);
}
}
}
///
///
///
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; }
}
///
/// 动态改变进度值。
///
///
///
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);
}
///
///
///
///
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);
}
}
}