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. /// [UxmlElement] public partial class TilePaletteElement : VisualElement { /// /// Factory for TilePaletteElement. /// [Obsolete("TilePaletteElementFactory is deprecated and will be removed. Use UxmlElementAttribute instead.", false)] public class TilePaletteElementFactory : UxmlFactory {} /// /// UxmlTraits for TilePaletteElement. /// [Obsolete("TilePaletteElementUxmlTraits is deprecated and will be removed. Use UxmlElementAttribute instead.", false)] 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 kTilePaletteElementHideOnPickEditorPref = "TilePaletteElementHideOnPick"; private static readonly string k_Name = L10n.Tr("Tile Palette Element"); private static string[] k_LeftToolbarElements = new[] { TilePaletteActivePalettePopupIcon.k_ToolbarId , TilePaletteActivePalettePopup.k_ToolbarId }; private static string[] k_RightToolbarElements = new[] { TilePaletteEditToggle.k_ToolbarId , TilePaletteGridToggle.k_ToolbarId , TilePaletteGizmoToggle.k_ToolbarId , TilePaletteHideClipboardToggle.k_ToolbarId }; private static bool[] k_TilePaletteWindowActiveRightToolbar = new[] { true, true, true, false }; private static bool[] k_TilePaletteOverlayActiveRightToolbar = new[] { true, true, true, true }; private VisualElement m_ToolbarElement; private TilePaletteClipboardElement m_ClipboardElement; private TilePaletteEditToggle m_EditToggle; private TilePaletteGridToggle m_GridToggle; private TilePaletteGizmoToggle m_GizmoToggle; private TilePaletteHideClipboardToggle m_HideToggle; private VisualElement m_RightToolbar; private event Action onBrushPickedInternal; /// /// Whether the clipboard is unlocked for editing. /// public bool clipboardUnlocked { get => m_ClipboardElement.clipboardUnlocked; set { m_ClipboardElement.clipboardUnlocked = value; m_EditToggle.SetValueWithoutNotify(value); } } /// /// Whether the clipboard is hidden when the Pick EditorTool is activated on it. /// public bool hideOnPick { get => EditorPrefs.GetBool(kTilePaletteElementHideOnPickEditorPref, true); set { EditorPrefs.SetBool(kTilePaletteElementHideOnPickEditorPref, value); m_HideToggle.SetValueWithoutNotify(value); } } /// /// Callback when the active Brush does a Pick on the Clipboard. /// public event Action onBrushPicked { add { onBrushPickedInternal += value; SetupRightToolbar(); } remove { onBrushPickedInternal -= value; SetupRightToolbar(); } } internal GridPaintPaletteClipboard clipboardView => m_ClipboardElement.clipboardView; /// /// Initializes and returns an instance of TilePaletteElement. /// public TilePaletteElement() { AddToClassList(ussClassName); name = k_Name; TilePaletteOverlayUtility.SetStyleSheet(this); m_ToolbarElement = new VisualElement(); m_ToolbarElement.AddToClassList(toolbarUssClassName); Add(m_ToolbarElement); m_ClipboardElement = new TilePaletteClipboardElement(); m_ClipboardElement.onBrushPicked += OnBrushPicked; Add(m_ClipboardElement); var leftToolbar = EditorToolbar.CreateOverlay(k_LeftToolbarElements); m_ToolbarElement.Add(leftToolbar); var rightToolbarElement = new VisualElement(); rightToolbarElement.AddToClassList(rightToolbarUssClassName); m_ToolbarElement.Add(rightToolbarElement); m_RightToolbar = EditorToolbar.CreateOverlay(k_RightToolbarElements); SetupRightToolbar(); rightToolbarElement.Add(m_RightToolbar); m_EditToggle = this.Q(); m_EditToggle.SetValueWithoutNotify(false); m_EditToggle.ToggleChanged += OnEditToggleChanged; m_GridToggle = this.Q(); m_GridToggle.SetValueWithoutNotify(GridPaintingState.drawGridGizmo); m_GridToggle.ToggleChanged += OnGridToggleChanged; m_GizmoToggle = this.Q(); m_GizmoToggle.SetValueWithoutNotify(GridPaintingState.drawGizmos); m_GizmoToggle.ToggleChanged += OnGizmoToggleChanged; m_HideToggle = this.Q(); m_HideToggle.SetValueWithoutNotify(hideOnPick); m_HideToggle.ToggleChanged += OnHideClipboardToggleChanged; RegisterCallback(OnAttachedToPanel); RegisterCallback(OnDetachFromPanel); UpdateToggleState(); } private void OnAttachedToPanel(AttachToPanelEvent evt) { m_ClipboardElement.clipboardUnlockedChanged += OnUnlockedChanged; GridPaintingState.palettesChanged += UpdateToggleState; } private void OnDetachFromPanel(DetachFromPanelEvent evt) { GridPaintingState.palettesChanged -= UpdateToggleState; m_ClipboardElement.clipboardUnlockedChanged -= OnUnlockedChanged; } private void OnBrushPicked() { if (hideOnPick) onBrushPickedInternal?.Invoke(); } 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; } private void UpdateToggleState() { bool hasPalette = GridPaintingState.palettes != null && GridPaintingState.palettes.Count > 0; m_EditToggle.SetEnabled(hasPalette); m_GridToggle.SetEnabled(hasPalette); m_GizmoToggle.SetEnabled(hasPalette); } private void OnHideClipboardToggleChanged(bool hideClipboard) { hideOnPick = hideClipboard; } private void SetupRightToolbar() { TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, onBrushPickedInternal != null ? k_TilePaletteOverlayActiveRightToolbar : k_TilePaletteWindowActiveRightToolbar); } } [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); } } }