using System; using UnityEditor.ShortcutManagement; using UnityEditor.Toolbars; using UnityEngine.UIElements; namespace UnityEditor.Tilemaps { /// /// A Visual Element which handles and displays a Tile Palette Clipboard /// and its associated tools. /// /// /// This Visual Element includes other Visual Elements that help with managing /// the Tile Palette Clipboard, which includes a popup dropdown for selecting /// the active Palette and a toolbar for enabling edits and showing visual aids /// in the Tile Palette Clipboard. /// public class TilePaletteElement : VisualElement { /// /// Factory for TilePaletteElement. /// public class TilePaletteElementFactory : UxmlFactory {} /// /// UxmlTraits for TilePaletteElement. /// public class TilePaletteElementUxmlTraits : UxmlTraits {} private static readonly string ussClassName = "unity-tilepalette-element"; private static readonly string toolbarUssClassName = ussClassName + "-toolbar"; private static readonly string rightToolbarUssClassName = toolbarUssClassName + "-right"; private static readonly string buttonStripClassName = "unity-editor-toolbar__button-strip"; private static readonly string stripElementClassName = buttonStripClassName + "-element"; private static readonly string leftStripElementClassName = stripElementClassName + "--left"; private static readonly string middleStripElementClassName = stripElementClassName + "--middle"; private static readonly string rightStripElementClassName = stripElementClassName + "--right"; private static readonly string aloneStripElementClassName = stripElementClassName + "--alone"; private static readonly string k_Name = L10n.Tr("Tile Palette Element"); private TilePaletteClipboardElement m_ClipboardElement; private TilePaletteEditToggle m_EditToggle; /// /// Whether the clipboard is unlocked for editing. /// public bool clipboardUnlocked { get => m_ClipboardElement.clipboardUnlocked; set { m_ClipboardElement.clipboardUnlocked = value; m_EditToggle.SetValueWithoutNotify(value); } } internal GridPaintPaletteClipboard clipboardView => m_ClipboardElement.clipboardView; /// /// Initializes and returns an instance of TilePaletteElement. /// public TilePaletteElement() { AddToClassList(ussClassName); name = k_Name; TilePaletteOverlayUtility.SetStyleSheet(this); var toolbarElement = new VisualElement(); toolbarElement.AddToClassList(toolbarUssClassName); Add(toolbarElement); m_ClipboardElement = new TilePaletteClipboardElement(); Add(m_ClipboardElement); string[] leftToolbarElements = new[] { TilePaletteActivePalettePopupIcon.k_ToolbarId, TilePaletteActivePalettePopup.k_ToolbarId }; var leftToolbar = EditorToolbar.CreateOverlay(leftToolbarElements); toolbarElement.Add(leftToolbar); var rightToolbarElement = new VisualElement(); rightToolbarElement.AddToClassList(rightToolbarUssClassName); toolbarElement.Add(rightToolbarElement); string[] rightToolbarElements = new[] { TilePaletteEditToggle.k_ToolbarId , TilePaletteGridToggle.k_ToolbarId , TilePaletteGizmoToggle.k_ToolbarId , TilePaletteBrushElementToggle.k_ToolbarId }; var rightToolbar = EditorToolbar.CreateOverlay(rightToolbarElements); SetupChildrenAsButtonStripForVisible(rightToolbar); rightToolbarElement.Add(rightToolbar); m_EditToggle = this.Q(); m_EditToggle.SetValueWithoutNotify(false); m_EditToggle.ToggleChanged += OnEditToggleChanged; var gridToggle = this.Q(); gridToggle.SetValueWithoutNotify(GridPaintingState.drawGridGizmo); gridToggle.ToggleChanged += OnGridToggleChanged; var gizmoToggle = this.Q(); gizmoToggle.SetValueWithoutNotify(GridPaintingState.drawGizmos); gizmoToggle.ToggleChanged += OnGizmoToggleChanged; RegisterCallback(OnAttachedToPanel); RegisterCallback(OnDetachedToPanel); } private void OnAttachedToPanel(AttachToPanelEvent evt) { m_ClipboardElement.clipboardUnlockedChanged += OnUnlockedChanged; } private void OnDetachedToPanel(DetachFromPanelEvent evt) { m_ClipboardElement.clipboardUnlockedChanged -= OnUnlockedChanged; } private static void SetupChildrenAsButtonStripForVisible(VisualElement root) { root.AddToClassList(buttonStripClassName); int count = root.hierarchy.childCount; if (count == 1) { var element = root.hierarchy.ElementAt(0); bool visible = element.style.display != DisplayStyle.None && element.visible; element.EnableInClassList(aloneStripElementClassName, visible); } else { bool firstVisible = false; int lastVisible = 0; for (var i = 0; i < count; ++i) { var element = root.hierarchy.ElementAt(i); //Skip if element not visible bool visible = element.style.display != DisplayStyle.None && element.visible; element.AddToClassList(stripElementClassName); if (firstVisible) { element.EnableInClassList(middleStripElementClassName, visible); } if (!firstVisible) { element.EnableInClassList(leftStripElementClassName, visible); firstVisible = true; } if (visible) lastVisible = i; } var lastElement = root.hierarchy.ElementAt(lastVisible); if (lastElement.ClassListContains(leftStripElementClassName)) { lastElement.RemoveFromClassList(leftStripElementClassName); lastElement.AddToClassList(aloneStripElementClassName); } else { lastElement.RemoveFromClassList(middleStripElementClassName); lastElement.AddToClassList(rightStripElementClassName); } } } private void OnEditToggleChanged(bool unlock) { clipboardUnlocked = unlock; } private void OnUnlockedChanged(bool unlock) { m_EditToggle.SetValueWithoutNotify(unlock); } private void OnGridToggleChanged(bool drawGridGizmo) { GridPaintingState.drawGridGizmo = drawGridGizmo; } private void OnGizmoToggleChanged(bool drawGizmo) { GridPaintingState.drawGizmos = drawGizmo; } } [EditorToolbarElement(k_ToolbarId)] internal sealed class TilePaletteEditToggle : EditorToolbarToggle { internal const string k_ToolbarId = "Tile Palette/Tile Palette Edit"; private static readonly string k_ToolSettingsClass = "unity-tool-settings"; private static readonly string k_ElementClass = "unity-tilepalette-element-tilepaletteedit"; private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.EditPalette.png"; private static readonly string k_TooltipText = L10n.Tr("Toggles Tile Palette Edit"); public Action ToggleChanged; public TilePaletteEditToggle() { name = "Tile Palette Edit"; AddToClassList(k_ToolSettingsClass); AddToClassList(k_ElementClass); TilePaletteOverlayUtility.SetStyleSheet(this); icon = EditorGUIUtility.LoadIcon(k_IconPath); tooltip = k_TooltipText; } protected override void ToggleValue() { base.ToggleValue(); ToggleChanged?.Invoke(value); } } [EditorToolbarElement(k_ToolbarId)] internal sealed class TilePaletteGridToggle : EditorToolbarToggle { internal const string k_ToolbarId = "Tile Palette/Tile Palette Grid"; private static readonly string k_ToolSettingsClass = "unity-tool-settings"; private static readonly string k_ElementClass = "unity-tilepalette-element-gridtoggle"; private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.ShowGrid.png"; private static readonly string k_TooltipText = L10n.Tr("Toggle visibility of the Grid in the Tile Palette"); public Action ToggleChanged; public TilePaletteGridToggle() { name = "Tile Palette Grid"; AddToClassList(k_ToolSettingsClass); AddToClassList(k_ElementClass); TilePaletteOverlayUtility.SetStyleSheet(this); icon = EditorGUIUtility.LoadIcon(k_IconPath); tooltip = k_TooltipText; } protected override void ToggleValue() { base.ToggleValue(); ToggleChanged?.Invoke(value); } } [EditorToolbarElement(k_ToolbarId)] internal sealed class TilePaletteBrushElementToggle : EditorToolbarToggle { internal const string k_ToolbarId = "Tile Palette/Tile Palette Brush Element"; private static readonly string k_ToolSettingsClass = "unity-tool-settings"; private static readonly string k_ElementClass = "unity-tilepalette-element-brushelement"; private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.BrushSettings.png"; private static readonly string k_TooltipText = L10n.Tr("Toggle visibility of the Brush Inspector in the Tile Palette"); public Action ToggleChanged; public TilePaletteBrushElementToggle() { name = "Tile Palette Grid"; AddToClassList(k_ToolSettingsClass); AddToClassList(k_ElementClass); TilePaletteOverlayUtility.SetStyleSheet(this); icon = EditorGUIUtility.LoadIcon(k_IconPath); tooltip = k_TooltipText; } protected override void ToggleValue() { base.ToggleValue(); ToggleChanged?.Invoke(value); } } [EditorToolbarElement(k_ToolbarId)] internal sealed class TilePaletteGizmoToggle : EditorToolbarToggle { internal const string k_ToolbarId = "Tile Palette/Tile Palette Gizmo"; private static readonly string k_ToolSettingsClass = "unity-tool-settings"; private static readonly string k_ElementClass = "unity-tilepalette-element-gizmotoggle"; private static readonly string k_IconPath = "GizmosToggle"; private static readonly string k_TooltipText = L10n.Tr("Toggle visibility of Gizmos in the Tile Palette"); public Action ToggleChanged; public TilePaletteGizmoToggle() { name = "Tile Palette Gizmo"; AddToClassList(k_ToolSettingsClass); AddToClassList(k_ElementClass); TilePaletteOverlayUtility.SetStyleSheet(this); icon = EditorGUIUtility.LoadIcon(k_IconPath); tooltip = k_TooltipText; } protected override void ToggleValue() { base.ToggleValue(); ToggleChanged?.Invoke(value); } } [EditorToolbarElement(k_ToolbarId)] internal sealed class TilePaletteHideClipboardToggle : EditorToolbarToggle { internal const string k_ToolbarId = "Tile Palette/Tile Palette Hide Clipboard"; private static readonly string k_ToolSettingsClass = "unity-tool-settings"; private static readonly string k_ElementClass = "unity-tilepalette-element-hideclipboard"; private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.ShowTilePalette.png"; private static readonly string k_TooltipFormatText = L10n.Tr("Hides Tile Palette on Pick. ( {0} ) to show/hide Tile Palette."); private static readonly string k_ShortcutId = "Grid Painting/Toggle SceneView Palette"; public Action ToggleChanged; public TilePaletteHideClipboardToggle() { name = "Tile Palette Hide Clipboard"; AddToClassList(k_ToolSettingsClass); AddToClassList(k_ElementClass); TilePaletteOverlayUtility.SetStyleSheet(this); icon = EditorGUIUtility.LoadIcon(k_IconPath); RegisterCallback(OnAttachedToPanel); RegisterCallback(OnDetachFromPanel); } private void OnAttachedToPanel(AttachToPanelEvent evt) { ShortcutIntegration.instance.profileManager.shortcutBindingChanged += OnShortcutBindingChanged; UpdateTooltip(); } private void OnDetachFromPanel(DetachFromPanelEvent evt) { ShortcutIntegration.instance.profileManager.shortcutBindingChanged -= OnShortcutBindingChanged; } private void OnShortcutBindingChanged(IShortcutProfileManager arg1, Identifier arg2, ShortcutBinding arg3, ShortcutBinding arg4) { UpdateTooltip(); } private void UpdateTooltip() { tooltip = String.Format(k_TooltipFormatText, ShortcutManager.instance.GetShortcutBinding(k_ShortcutId)); } protected override void ToggleValue() { base.ToggleValue(); ToggleChanged?.Invoke(value); } } }