暫無描述
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.

GridPaintPaletteWindowActiveTargets.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using UnityEngine;
  3. using UnityEditor.Toolbars;
  4. using UnityEngine.UIElements;
  5. namespace UnityEditor.Tilemaps
  6. {
  7. internal class GridPaintPaletteWindowActiveTargets : VisualElement
  8. {
  9. const string kUssClassName = "unity-tilepalette-activetargets";
  10. const string kPopupUssClassName = "unity-tilepalette-activetargets-popup";
  11. const string kInfoUssClassName = "unity-tilepalette-activetargets-info";
  12. const string kCreateHintUssClassName = "unity-tilepalette-activetargets-info__create";
  13. private static string[] k_RightToolbarElements = new[] {
  14. TilePaletteClipboardToggle.k_ToolbarId
  15. , TilePaletteBrushPickToggle.k_ToolbarId
  16. };
  17. private static string k_CreateTargetTooltip =
  18. L10n.Tr("To start painting in the Scene, first create a new Tilemap.");
  19. private bool needCreate
  20. {
  21. get => GridPaintingState.scenePaintTarget == null
  22. && (GridPaintingState.validTargets == null
  23. || GridPaintingState.validTargets.Length == 0);
  24. }
  25. private readonly VisualElement m_CreateTargetElement;
  26. private static string[] GetTilePaletteOverlayIds()
  27. {
  28. var types = TypeCache.GetTypesWithAttribute(typeof(TilePaletteOverlayToolbarElementAttribute));
  29. var overlayIds = new string[types.Count];
  30. var i = 0;
  31. foreach (var type in types)
  32. {
  33. var toolbarElementAttribute = Attribute.GetCustomAttribute(type, typeof(EditorToolbarElementAttribute)) as EditorToolbarElementAttribute;
  34. if (toolbarElementAttribute != null)
  35. overlayIds[i++] = toolbarElementAttribute.id;
  36. }
  37. Array.Resize(ref overlayIds, i);
  38. return overlayIds;
  39. }
  40. public GridPaintPaletteWindowActiveTargets()
  41. {
  42. AddToClassList(kUssClassName);
  43. TilePaletteOverlayUtility.SetStyleSheet(this);
  44. name = "activeTargetsTilePalette";
  45. var activeTargets = new VisualElement();
  46. activeTargets.AddToClassList(kPopupUssClassName);
  47. activeTargets.Add(new TilePaletteActiveTargetsPopupIcon());
  48. activeTargets.Add(new TilePaletteActiveTargetsPopup());
  49. var rightToolbar = EditorToolbar.CreateOverlay(GetTilePaletteOverlayIds());
  50. rightToolbar.SetupChildrenAsButtonStrip();
  51. activeTargets.Add(rightToolbar);
  52. Add(activeTargets);
  53. m_CreateTargetElement = new VisualElement();
  54. m_CreateTargetElement.AddToClassList(kInfoUssClassName);
  55. var createTargetIconElement = new VisualElement();
  56. createTargetIconElement.name = "Create Target Icon";
  57. createTargetIconElement.AddToClassList(kCreateHintUssClassName);
  58. createTargetIconElement.tooltip = k_CreateTargetTooltip;
  59. m_CreateTargetElement.Add(createTargetIconElement);
  60. var createTargetLabelElement = new Label(k_CreateTargetTooltip);
  61. m_CreateTargetElement.Add(createTargetLabelElement);
  62. Add(m_CreateTargetElement);
  63. RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
  64. RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
  65. }
  66. private void OnAttachedToPanel(AttachToPanelEvent evt)
  67. {
  68. GridPaintingState.scenePaintTargetChanged += OnScenePaintTargetChanged;
  69. GridPaintingState.validTargetsChanged += UpdateCreateTarget;
  70. }
  71. private void OnDetachFromPanel(DetachFromPanelEvent evt)
  72. {
  73. GridPaintingState.scenePaintTargetChanged -= OnScenePaintTargetChanged;
  74. GridPaintingState.validTargetsChanged -= UpdateCreateTarget;
  75. }
  76. private void OnScenePaintTargetChanged(GameObject go)
  77. {
  78. UpdateCreateTarget();
  79. }
  80. private void UpdateCreateTarget()
  81. {
  82. m_CreateTargetElement.visible = needCreate;
  83. m_CreateTargetElement.style.position = needCreate ? Position.Relative : Position.Absolute;
  84. }
  85. }
  86. }