using UnityEngine;
using FairyGUI.Utils;
namespace FairyGUI
{
    /// 
    /// GMovieClip class.
    /// 
    public class GMovieClip : GObject, IAnimationGear, IColorGear
    {
        MovieClip _content;
        EventListener _onPlayEnd;
        public GMovieClip()
        {
        }
        override protected void CreateDisplayObject()
        {
            _content = new MovieClip();
            _content.gOwner = this;
            _content.ignoreEngineTimeScale = true;
            displayObject = _content;
        }
        /// 
        /// 
        /// 
        public EventListener onPlayEnd
        {
            get { return _onPlayEnd ?? (_onPlayEnd = new EventListener(this, "onPlayEnd")); }
        }
        /// 
        /// 
        /// 
        public bool playing
        {
            get { return _content.playing; }
            set
            {
                _content.playing = value;
                UpdateGear(5);
            }
        }
        /// 
        /// 
        /// 
        public int frame
        {
            get { return _content.frame; }
            set
            {
                _content.frame = value;
                UpdateGear(5);
            }
        }
        /// 
        /// 
        /// 
        public Color color
        {
            get { return _content.color; }
            set
            {
                _content.color = value;
                UpdateGear(4);
            }
        }
        /// 
        /// 
        /// 
        public FlipType flip
        {
            get { return _content.graphics.flip; }
            set { _content.graphics.flip = value; }
        }
        /// 
        /// 
        /// 
        public Material material
        {
            get { return _content.material; }
            set { _content.material = value; }
        }
        /// 
        /// 
        /// 
        public string shader
        {
            get { return _content.shader; }
            set { _content.shader = value; }
        }
        /// 
        /// 
        /// 
        public float timeScale
        {
            get { return _content.timeScale; }
            set { _content.timeScale = value; }
        }
        /// 
        /// 
        /// 
        public bool ignoreEngineTimeScale
        {
            get { return _content.ignoreEngineTimeScale; }
            set { _content.ignoreEngineTimeScale = value; }
        }
        /// 
        /// 
        /// 
        public void Rewind()
        {
            _content.Rewind();
        }
        /// 
        /// 
        /// 
        /// 
        public void SyncStatus(GMovieClip anotherMc)
        {
            _content.SyncStatus(anotherMc._content);
        }
        /// 
        /// 
        /// 
        /// 
        public void Advance(float time)
        {
            _content.Advance(time);
        }
        /// 
        /// Play from the start to end, repeat times, set to endAt on complete.
        /// 从start帧开始,播放到end帧(-1表示结尾),重复times次(0表示无限循环),循环结束后,停止在endAt帧(-1表示参数end)
        /// 
        /// Start frame
        /// End frame. -1 indicates the last frame.
        /// Repeat times. 0 indicates infinite loop.
        /// Stop frame. -1 indicates to equal to the end parameter.
        public void SetPlaySettings(int start, int end, int times, int endAt)
        {
            ((MovieClip)displayObject).SetPlaySettings(start, end, times, endAt);
        }
        override public void ConstructFromResource()
        {
            this.gameObjectName = packageItem.name;
            
            PackageItem contentItem = packageItem.getBranch();
            sourceWidth = contentItem.width;
            sourceHeight = contentItem.height;
            initWidth = sourceWidth;
            initHeight = sourceHeight;
            contentItem = contentItem.getHighResolution();
            contentItem.Load();
            _content.interval = contentItem.interval;
            _content.swing = contentItem.swing;
            _content.repeatDelay = contentItem.repeatDelay;
            _content.frames = contentItem.frames;
            SetSize(sourceWidth, sourceHeight);
        }
        override public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
        {
            base.Setup_BeforeAdd(buffer, beginPos);
            buffer.Seek(beginPos, 5);
            if (buffer.ReadBool())
                _content.color = buffer.ReadColor();
            _content.graphics.flip = (FlipType)buffer.ReadByte();
            _content.frame = buffer.ReadInt();
            _content.playing = buffer.ReadBool();
        }
    }
}