using System.Collections.Generic; using UnityEngine; using FairyGUI.Utils; namespace FairyGUI { class GearXYValue { public float x; public float y; public GearXYValue(float x, float y) { this.x = x; this.y = y; } } /// /// Gear is a connection between object and controller. /// public class GearXY : GearBase, ITweenListener { Dictionary _storage; GearXYValue _default; public GearXY(GObject owner) : base(owner) { } protected override void Init() { _default = new GearXYValue(_owner.x, _owner.y); _storage = new Dictionary(); } override protected void AddStatus(string pageId, ByteBuffer buffer) { GearXYValue gv; if (pageId == null) gv = _default; else { gv = new GearXYValue(0, 0); _storage[pageId] = gv; } gv.x = buffer.ReadInt(); gv.y = buffer.ReadInt(); } override public void Apply() { GearXYValue gv; if (!_storage.TryGetValue(_controller.selectedPageId, out gv)) gv = _default; if (_tweenConfig != null && _tweenConfig.tween && UIPackage._constructing == 0 && !disableAllTweenEffect) { if (_tweenConfig._tweener != null) { if (_tweenConfig._tweener.endValue.x != gv.x || _tweenConfig._tweener.endValue.y != gv.y) { _tweenConfig._tweener.Kill(true); _tweenConfig._tweener = null; } else return; } if (_owner.x != gv.x || _owner.y != gv.y) { if (_owner.CheckGearController(0, _controller)) _tweenConfig._displayLockToken = _owner.AddDisplayLock(); _tweenConfig._tweener = GTween.To(_owner.xy, new Vector2(gv.x, gv.y), _tweenConfig.duration) .SetDelay(_tweenConfig.delay) .SetEase(_tweenConfig.easeType) .SetTarget(this) .SetListener(this); } } else { _owner._gearLocked = true; _owner.SetXY(gv.x, gv.y); _owner._gearLocked = false; } } public void OnTweenStart(GTweener tweener) {//nothing } public void OnTweenUpdate(GTweener tweener) { _owner._gearLocked = true; _owner.SetXY(tweener.value.x, tweener.value.y); _owner._gearLocked = false; _owner.InvalidateBatchingState(); } public void OnTweenComplete(GTweener tweener) { _tweenConfig._tweener = null; if (_tweenConfig._displayLockToken != 0) { _owner.ReleaseDisplayLock(_tweenConfig._displayLockToken); _tweenConfig._displayLockToken = 0; } _owner.DispatchEvent("onGearStop", this); } override public void UpdateState() { GearXYValue gv; if (!_storage.TryGetValue(_controller.selectedPageId, out gv)) _storage[_controller.selectedPageId] = new GearXYValue(_owner.x, _owner.y); else { gv.x = _owner.x; gv.y = _owner.y; } } override public void UpdateFromRelations(float dx, float dy) { if (_controller != null && _storage != null) { foreach (GearXYValue gv in _storage.Values) { gv.x += dx; gv.y += dy; } _default.x += dx; _default.y += dy; UpdateState(); } } } }