ResolutionDependentSize.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. using UnityEngine.Serialization;
  7. namespace TheraBytes.BetterUi
  8. {
  9. //
  10. // GENERIC
  11. //
  12. [Serializable]
  13. public abstract class ScreenDependentSize<T> : ScreenDependentSize, IScreenConfigConnection
  14. {
  15. [SerializeField]
  16. string screenConfigName;
  17. public override string ScreenConfigName
  18. {
  19. get { return screenConfigName; }
  20. set { screenConfigName = value; }
  21. }
  22. public T OptimizedSize;
  23. public T MinSize;
  24. public T MaxSize;
  25. public bool UseMinSize;
  26. public bool UseMaxSize;
  27. protected T value;
  28. public T LastCalculatedSize { get { return value; } }
  29. protected ScreenDependentSize(T opt, T min, T max, T initValue)
  30. {
  31. this.OptimizedSize = opt;
  32. this.MinSize = min;
  33. this.MaxSize = max;
  34. this.value = initValue;
  35. this.UseMinSize = false;
  36. this.UseMaxSize = false;
  37. }
  38. public T CalculateSize(Component caller)
  39. {
  40. base.UpdateSize(caller);
  41. return value;
  42. }
  43. protected float GetSize(float factor, float opt, float min, float max)
  44. {
  45. var result = factor * opt;
  46. if(UseMinSize && result < min)
  47. return min;
  48. if (UseMaxSize && result > max)
  49. return max;
  50. return result;
  51. }
  52. /// <summary>
  53. /// This method can be called during runtime to apply a calculated size.
  54. /// This will change the optimized size to be able to still work resolution independently.
  55. /// </summary>
  56. /// <param name="caller">The component which contains this sizer.</param>
  57. /// <param name="size">The size to apply.</param>
  58. public void SetSize(Component caller, T size)
  59. {
  60. int i = 0;
  61. foreach (var mod in GetModifiers())
  62. {
  63. float invFac = 1 / mod.CalculateFactor(caller, screenConfigName);
  64. CalculateOptimizedSize(size, invFac, mod, i);
  65. i++;
  66. }
  67. value = size; // TODO: clamp
  68. }
  69. /// <summary>
  70. /// This method just sets the last calculated size to track additional calculations from outside.
  71. /// The Optimized Size will not be affected.
  72. /// </summary>
  73. /// <param name="newValue"></param>
  74. public void OverrideLastCalculatedSize(T newValue)
  75. {
  76. this.value = newValue;
  77. }
  78. protected abstract void CalculateOptimizedSize(T baseValue, float factor, SizeModifierCollection mod, int index);
  79. }
  80. //
  81. // NON GENERIC
  82. //
  83. [Serializable]
  84. public abstract class ScreenDependentSize
  85. {
  86. public abstract string ScreenConfigName { get; set; }
  87. protected void UpdateSize(Component caller)
  88. {
  89. int i = 0;
  90. foreach (var mod in GetModifiers())
  91. {
  92. float factor = mod.CalculateFactor(caller, ScreenConfigName);
  93. AdjustSize(factor, mod, i);
  94. i++;
  95. }
  96. }
  97. public virtual void DynamicInitialization()
  98. {
  99. // most do not need initialization.
  100. }
  101. public abstract IEnumerable<SizeModifierCollection> GetModifiers();
  102. protected abstract void AdjustSize(float factor, SizeModifierCollection mod, int index);
  103. }
  104. }