Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TilePaletteActivePalettePopup.cs 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System.Linq;
  2. using UnityEditor.Toolbars;
  3. using UnityEngine;
  4. using UnityEngine.UIElements;
  5. namespace UnityEditor.Tilemaps
  6. {
  7. /// <summary>
  8. /// Popup Field for selecting the Active Palette for Grid Painting.
  9. /// </summary>
  10. [EditorToolbarElement(k_ToolbarId)]
  11. public sealed class TilePaletteActivePalettePopup : PopupField<GameObject>
  12. {
  13. internal const string k_ToolbarId = "Tools/Tile Palette Active Palette";
  14. private static string kNullGameObjectName = L10n.Tr("No Valid Palette");
  15. private static string kLabelTooltip =
  16. L10n.Tr("Specifies the currently active Palette used for painting in the Scene View.");
  17. /// <summary>
  18. /// Factory for TilePaletteActivePalettePopup.
  19. /// </summary>
  20. public class TilePaletteActivePalettePopupFactory : UxmlFactory<TilePaletteActivePalettePopup, TilePaletteActivePalettePopupUxmlTraits> {}
  21. /// <summary>
  22. /// UxmlTraits for TilePaletteActivePalettePopup.
  23. /// </summary>
  24. public class TilePaletteActivePalettePopupUxmlTraits : UxmlTraits {}
  25. /// <summary>
  26. /// USS class name of elements of this type.
  27. /// </summary>
  28. private new static readonly string ussClassName = "unity-tilepalette-activepalettes-field";
  29. /// <summary>
  30. /// USS class name of labels in elements of this type.
  31. /// </summary>
  32. private new static readonly string labelUssClassName = ussClassName + "__label";
  33. /// <summary>
  34. /// USS class name of input elements in elements of this type.
  35. /// </summary>
  36. private new static readonly string inputUssClassName = ussClassName + "__input";
  37. /// <summary>
  38. /// Initializes and returns an instance of TilePaletteActivePalettesPopup.
  39. /// </summary>
  40. public TilePaletteActivePalettePopup() : this(null) {}
  41. /// <summary>
  42. /// Initializes and returns an instance of TilePaletteActivePalettesPopup.
  43. /// </summary>
  44. /// <param name="label">Label name for the Popup</param>
  45. public TilePaletteActivePalettePopup(string label)
  46. : base(label, GridPaintingState.palettes.ToList(), GetActivePaletteIndex())
  47. {
  48. AddToClassList(ussClassName);
  49. labelElement.AddToClassList(labelUssClassName);
  50. visualInput.AddToClassList(inputUssClassName);
  51. TilePaletteOverlayUtility.SetStyleSheet(this);
  52. labelElement.tooltip = kLabelTooltip;
  53. RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
  54. RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
  55. m_FormatSelectedValueCallback += FormatSelectedValueCallback;
  56. createMenuCallback += CreateMenuCallback;
  57. UpdateTargets();
  58. SetValueWithoutNotify(GridPaintingState.palette);
  59. }
  60. private void OnAttachedToPanel(AttachToPanelEvent evt)
  61. {
  62. GridPaintingState.paletteChanged += OnPaletteChanged;
  63. GridPaintingState.palettesChanged += UpdateTargets;
  64. }
  65. private void OnDetachFromPanel(DetachFromPanelEvent evt)
  66. {
  67. GridPaintingState.palettesChanged += UpdateTargets;
  68. GridPaintingState.paletteChanged -= OnPaletteChanged;
  69. }
  70. private void OnPaletteChanged(GameObject _)
  71. {
  72. UpdateActivePalette();
  73. }
  74. private string FormatSelectedValueCallback(GameObject go)
  75. {
  76. if (go != null)
  77. return go.name;
  78. return kNullGameObjectName;
  79. }
  80. private IGenericMenu CreateMenuCallback()
  81. {
  82. return new TilePaletteActivePaletteDropdownMenu();
  83. }
  84. private static int GetActivePaletteIndex()
  85. {
  86. return GridPaintingState.palettes.IndexOf(GridPaintingState.palette);
  87. }
  88. private void UpdateChoices()
  89. {
  90. choices.Clear();
  91. foreach (var target in GridPaintingState.palettes)
  92. {
  93. choices.Add(target);
  94. }
  95. }
  96. private void UpdateActivePalette()
  97. {
  98. var newIndex = GetActivePaletteIndex();
  99. if (newIndex != -1 && choices.Count < newIndex)
  100. {
  101. UpdateChoices();
  102. newIndex = GetActivePaletteIndex();
  103. }
  104. index = newIndex;
  105. }
  106. private void UpdateTargets()
  107. {
  108. UpdateChoices();
  109. UpdateActivePalette();
  110. }
  111. }
  112. [EditorToolbarElement(k_ToolbarId)]
  113. internal class TilePaletteActivePalettePopupIcon : VisualElement
  114. {
  115. internal const string k_ToolbarId = "Tools/Tile Palette Active Palette Icon";
  116. private static string kTooltip = L10n.Tr("Active Palette");
  117. /// <summary>
  118. /// USS class name of elements of this type.
  119. /// </summary>
  120. public static readonly string ussClassName = "unity-tilepalette-activepalette-icon";
  121. private readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.TilePalette.png";
  122. public TilePaletteActivePalettePopupIcon()
  123. {
  124. AddToClassList(ussClassName);
  125. TilePaletteOverlayUtility.SetStyleSheet(this);
  126. style.backgroundImage = EditorGUIUtility.LoadIcon(k_IconPath);
  127. tooltip = kTooltip;
  128. }
  129. }
  130. }