BetterLayoutElement.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. namespace TheraBytes.BetterUi
  8. {
  9. #if UNITY_2018_3_OR_NEWER
  10. [ExecuteAlways]
  11. #else
  12. [ExecuteInEditMode]
  13. #endif
  14. [HelpURL("https://documentation.therabytes.de/better-ui/BetterLayoutElement.html")]
  15. [AddComponentMenu("Better UI/Layout/Better Layout Element", 30)]
  16. public class BetterLayoutElement : LayoutElement, IResolutionDependency
  17. {
  18. [Serializable]
  19. public class Settings : IScreenConfigConnection
  20. {
  21. public bool IgnoreLayout;
  22. public bool MinWidthEnabled, MinHeightEnabled;
  23. public bool PreferredWidthEnabled, PreferredHeightEnabled;
  24. public bool FlexibleWidthEnabled, FlexibleHeightEnabled;
  25. public float FlexibleWidth = 1;
  26. public float FlexibleHeight = 1;
  27. [SerializeField]
  28. string screenConfigName;
  29. public string ScreenConfigName { get { return screenConfigName; } set { screenConfigName = value; } }
  30. }
  31. [Serializable]
  32. public class SettingsConfigCollection : SizeConfigCollection<Settings> { }
  33. public Settings CurrentSettings { get { return customSettings.GetCurrentItem(settingsFallback); } }
  34. [SerializeField]
  35. Settings settingsFallback = new Settings();
  36. [SerializeField]
  37. SettingsConfigCollection customSettings = new SettingsConfigCollection();
  38. public FloatSizeModifier MinWidthSizer { get { return customMinWidthSizers.GetCurrentItem(minWidthSizerFallback); } }
  39. public FloatSizeModifier MinHeightSizer { get { return customMinHeightSizers.GetCurrentItem(minHeightSizerFallback); } }
  40. public FloatSizeModifier PreferredWidthSizer { get { return customPreferredWidthSizers.GetCurrentItem(preferredWidthSizerFallback); } }
  41. public FloatSizeModifier PreferredHeightSizer { get { return customPreferredHeightSizers.GetCurrentItem(preferredHeightSizerFallback); } }
  42. public new bool ignoreLayout
  43. {
  44. get { return base.ignoreLayout; }
  45. set { Config.Set(value, (o) => base.ignoreLayout = o, (o) => CurrentSettings.IgnoreLayout = o); }
  46. }
  47. public new float flexibleWidth
  48. {
  49. get { return base.flexibleWidth; }
  50. set { Config.Set(value, (o) => base.flexibleWidth = o, (o) => CurrentSettings.FlexibleWidth = o); }
  51. }
  52. public new float flexibleHeight
  53. {
  54. get { return base.flexibleHeight; }
  55. set { Config.Set(value, (o) => base.flexibleHeight = o, (o) => CurrentSettings.FlexibleHeight = o); }
  56. }
  57. public new float minWidth
  58. {
  59. get { return base.minWidth; }
  60. set { Config.Set(value, (o) => base.minWidth = o, (o) => MinWidthSizer.SetSize(this, o)); }
  61. }
  62. public new float minHeight
  63. {
  64. get { return base.minHeight; }
  65. set { Config.Set(value, (o) => base.minHeight = o, (o) => MinHeightSizer.SetSize(this, o)); }
  66. }
  67. public new float preferredWidth
  68. {
  69. get { return base.preferredWidth; }
  70. set { Config.Set(value, (o) => base.preferredWidth = o, (o) => PreferredWidthSizer.SetSize(this, o)); }
  71. }
  72. public new float preferredHeight
  73. {
  74. get { return base.preferredHeight; }
  75. set { Config.Set(value, (o) => base.preferredHeight = o, (o) => PreferredHeightSizer.SetSize(this, o)); }
  76. }
  77. [SerializeField]
  78. FloatSizeModifier minWidthSizerFallback = new FloatSizeModifier(0, 0, 5000);
  79. [SerializeField]
  80. FloatSizeConfigCollection customMinWidthSizers = new FloatSizeConfigCollection();
  81. [SerializeField]
  82. FloatSizeModifier minHeightSizerFallback = new FloatSizeModifier(0, 0, 5000);
  83. [SerializeField]
  84. FloatSizeConfigCollection customMinHeightSizers = new FloatSizeConfigCollection();
  85. [SerializeField]
  86. FloatSizeModifier preferredWidthSizerFallback = new FloatSizeModifier(100, 0, 5000);
  87. [SerializeField]
  88. FloatSizeConfigCollection customPreferredWidthSizers = new FloatSizeConfigCollection();
  89. [SerializeField]
  90. FloatSizeModifier preferredHeightSizerFallback = new FloatSizeModifier(100, 0, 5000);
  91. [SerializeField]
  92. FloatSizeConfigCollection customPreferredHeightSizers = new FloatSizeConfigCollection();
  93. protected override void OnEnable()
  94. {
  95. base.OnEnable();
  96. Apply();
  97. }
  98. public void OnResolutionChanged()
  99. {
  100. Apply();
  101. }
  102. void Apply()
  103. {
  104. Settings s = CurrentSettings;
  105. base.ignoreLayout = s.IgnoreLayout;
  106. base.minWidth = (s.MinWidthEnabled) ? MinWidthSizer.CalculateSize(this) : -1;
  107. base.minHeight = (s.MinHeightEnabled) ? MinHeightSizer.CalculateSize(this) : -1;
  108. base.preferredWidth = (s.PreferredWidthEnabled) ? PreferredWidthSizer.CalculateSize(this) : -1;
  109. base.preferredHeight = (s.PreferredHeightEnabled) ? PreferredHeightSizer.CalculateSize(this) : -1;
  110. base.flexibleWidth = (s.FlexibleWidthEnabled) ? s.FlexibleWidth : -1;
  111. base.flexibleHeight = (s.FlexibleHeightEnabled) ? s.FlexibleHeight : -1;
  112. }
  113. #if UNITY_EDITOR
  114. protected override void OnValidate()
  115. {
  116. base.OnValidate();
  117. Apply();
  118. }
  119. #endif
  120. }
  121. }