GearXY.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using FairyGUI.Utils;
  4. namespace FairyGUI
  5. {
  6. class GearXYValue
  7. {
  8. public float x;
  9. public float y;
  10. public float px;
  11. public float py;
  12. public GearXYValue(float x = 0, float y = 0, float px = 0, float py = 0)
  13. {
  14. this.x = x;
  15. this.y = y;
  16. this.px = px;
  17. this.py = py;
  18. }
  19. }
  20. /// <summary>
  21. /// Gear is a connection between object and controller.
  22. /// </summary>
  23. public class GearXY : GearBase, ITweenListener
  24. {
  25. public bool positionsInPercent;
  26. Dictionary<string, GearXYValue> _storage;
  27. GearXYValue _default;
  28. public GearXY(GObject owner)
  29. : base(owner)
  30. {
  31. }
  32. protected override void Init()
  33. {
  34. _default = new GearXYValue(_owner.x, _owner.y, _owner.x / _owner.parent.width, _owner.y / _owner.parent.height);
  35. _storage = new Dictionary<string, GearXYValue>();
  36. }
  37. override protected void AddStatus(string pageId, ByteBuffer buffer)
  38. {
  39. GearXYValue gv;
  40. if (pageId == null)
  41. gv = _default;
  42. else
  43. {
  44. gv = new GearXYValue();
  45. _storage[pageId] = gv;
  46. }
  47. gv.x = buffer.ReadInt();
  48. gv.y = buffer.ReadInt();
  49. }
  50. public void AddExtStatus(string pageId, ByteBuffer buffer)
  51. {
  52. GearXYValue gv;
  53. if (pageId == null)
  54. gv = _default;
  55. else
  56. gv = _storage[pageId];
  57. gv.px = buffer.ReadFloat();
  58. gv.py = buffer.ReadFloat();
  59. }
  60. override public void Apply()
  61. {
  62. GearXYValue gv;
  63. if (!_storage.TryGetValue(_controller.selectedPageId, out gv))
  64. gv = _default;
  65. Vector2 endPos = new Vector2();
  66. if (positionsInPercent && _owner.parent != null)
  67. {
  68. endPos.x = gv.px * _owner.parent.width;
  69. endPos.y = gv.py * _owner.parent.height;
  70. }
  71. else
  72. {
  73. endPos.x = gv.x;
  74. endPos.y = gv.y;
  75. }
  76. if (_tweenConfig != null && _tweenConfig.tween && UIPackage._constructing == 0 && !disableAllTweenEffect)
  77. {
  78. if (_tweenConfig._tweener != null)
  79. {
  80. if (_tweenConfig._tweener.endValue.x != endPos.x || _tweenConfig._tweener.endValue.y != endPos.y)
  81. {
  82. _tweenConfig._tweener.Kill(true);
  83. _tweenConfig._tweener = null;
  84. }
  85. else
  86. return;
  87. }
  88. Vector2 origin = _owner.xy;
  89. if (endPos != origin)
  90. {
  91. if (_owner.CheckGearController(0, _controller))
  92. _tweenConfig._displayLockToken = _owner.AddDisplayLock();
  93. _tweenConfig._tweener = GTween.To(origin, endPos, _tweenConfig.duration)
  94. .SetDelay(_tweenConfig.delay)
  95. .SetEase(_tweenConfig.easeType, _tweenConfig.customEase)
  96. .SetTarget(this)
  97. .SetListener(this);
  98. }
  99. }
  100. else
  101. {
  102. _owner._gearLocked = true;
  103. _owner.SetXY(endPos.x, endPos.y);
  104. _owner._gearLocked = false;
  105. }
  106. }
  107. public void OnTweenStart(GTweener tweener)
  108. {//nothing
  109. }
  110. public void OnTweenUpdate(GTweener tweener)
  111. {
  112. _owner._gearLocked = true;
  113. _owner.SetXY(tweener.value.x, tweener.value.y);
  114. _owner._gearLocked = false;
  115. _owner.InvalidateBatchingState();
  116. }
  117. public void OnTweenComplete(GTweener tweener)
  118. {
  119. _tweenConfig._tweener = null;
  120. if (_tweenConfig._displayLockToken != 0)
  121. {
  122. _owner.ReleaseDisplayLock(_tweenConfig._displayLockToken);
  123. _tweenConfig._displayLockToken = 0;
  124. }
  125. _owner.DispatchEvent("onGearStop", this);
  126. }
  127. override public void UpdateState()
  128. {
  129. GearXYValue gv;
  130. if (!_storage.TryGetValue(_controller.selectedPageId, out gv))
  131. _storage[_controller.selectedPageId] = gv = new GearXYValue();
  132. gv.x = _owner.x;
  133. gv.y = _owner.y;
  134. gv.px = _owner.x / _owner.parent.width;
  135. gv.py = _owner.y / _owner.parent.height;
  136. }
  137. override public void UpdateFromRelations(float dx, float dy)
  138. {
  139. if (_controller != null && _storage != null && !positionsInPercent)
  140. {
  141. foreach (GearXYValue gv in _storage.Values)
  142. {
  143. gv.x += dx;
  144. gv.y += dy;
  145. }
  146. _default.x += dx;
  147. _default.y += dy;
  148. UpdateState();
  149. }
  150. }
  151. }
  152. }