Net-Game/Library/PackageCache/com.unity.2d.tilemap@91afae292a4e/Editor/UI/TilePaletteBrushPickElement.cs
2025-03-28 08:33:16 -04:00

863 lines
34 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor.EditorTools;
using UnityEditor.ShortcutManagement;
using UnityEditor.Tilemaps.External;
using UnityEditor.Toolbars;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.Tilemaps
{
[UxmlElement]
internal partial class TilePaletteBrushPickElement : VisualElement
{
/// <summary>
/// Factory for TilePaletteBrushPickElement.
/// </summary>
[Obsolete("TilePaletteBrushPickElementFactory is deprecated and will be removed. Use UxmlElementAttribute instead.", false)]
public class TilePaletteBrushPickElementFactory : UxmlFactory<TilePaletteBrushPickElement, TilePaletteBrushPickElementUxmlTraits> {}
/// <summary>
/// UxmlTraits for TilePaletteBrushPickElement.
/// </summary>
[Obsolete("TilePaletteBrushPickElementUxmlTraits is deprecated and will be removed. Use UxmlElementAttribute instead.", false)]
public class TilePaletteBrushPickElementUxmlTraits : UxmlTraits {}
/// <summary>
/// USS class name of elements of this type.
/// </summary>
private static readonly string ussClassName = "unity-tilepalette-brushpick";
private static readonly string labelToolbarUssClassName = "unity-tilepalette-label-toolbar";
private static readonly string viewToolbarUssClassName = "unity-tilepalette-brushpick-view-toolbar";
private static readonly string lastUsedUssClassName = "unity-tilepalette-brushpick-lastused";
private static readonly string emptyViewUssClassName = "unity-tilepalette-brushpick-emptyview";
private static readonly string kTilePaletteBrushPickHideOnPickEditorPref = "TilePaletteBrushPickHideOnPick";
private static readonly string kTilePaletteBrushPickLastSelectionEditorPref = "TilePaletteBrushPickLastSelection";
private static readonly string kLastUsed = L10n.Tr("Last Picked");
private static readonly string kPersonal = L10n.Tr("Saved Picks");
private static readonly string kSizeSliderTooltip = L10n.Tr("Adjusts the size of the Picks");
private static readonly string kGridViewTooltip = L10n.Tr("View Picks in a Grid");
private static readonly string kListViewTooltip = L10n.Tr("View Picks in a List");
private static readonly string kListViewNameColumn = L10n.Tr("Name");
private static readonly string kListViewTypeColumn = L10n.Tr("Type");
private static readonly string kEmptyViewSaveBrushPickText = L10n.Tr("To save a Brush Pick: ");
private static readonly string kEmptyViewSaveBrushPickText1 = L10n.Tr("<indent=1em>\u2022<indent=2em>Activate the Pick Tool ");
private static readonly string kEmptyViewSaveBrushPickText2 = L10n.Tr("<indent=1em>\u2022<indent=2em>Pick with the Brush from the Tile Palette or SceneView");
private static readonly string kEmptyViewSaveBrushPickText3 = L10n.Tr("<indent=1em>\u2022<indent=2em>Hit the Save Button ");
private static readonly string kEmptyViewSaveBrushPickText3a = L10n.Tr(" above to save it");
private static readonly string kEmptyViewSaveBrushPickText1Alt = L10n.Tr("<indent=1em>\u2022<indent=2em>Set up the Brush in Brush Settings");
private static readonly string brushPickUserViewEditorPref = "TilePaletteBrushPickUserView";
private static readonly string brushPickScaleEditorPref = "TilePaletteBrushPickScale";
private static readonly string brushPickFilteredEditorPref = "TilePaletteBrushPickFiltered";
private static readonly string brushPickFilterTextEditorPref = "TilePaletteBrushPickFilterText";
private static int kDefaultTextSize = 220;
private static int kDefaultTypeTextSize = 160;
private static int kDefaultItemSize = 96;
private static int kDefaultBorderSize = 8;
private static int kMinItemSize = kDefaultItemSize + kDefaultBorderSize;
private static float kSliderScaleMinValue = 0.4f;
private static float kSliderScaleMaxValue = 2.0f;
private static float kSliderListThreshold = 0.8f;
private static float kSliderGridThreshold = 1.2f;
private static string[] k_RightToolbarElements = new[] {
TilePaletteBrushPickActiveBrushToggle.k_ToolbarId,
TilePaletteBrushPickSaveButton.k_ToolbarId,
TilePaletteHidePicksToggle.k_ToolbarId
};
private static bool[] k_TilePaletteWindowActiveRightToolbar = new[] { true, true, false };
private static bool[] k_TilePaletteOverlayActiveRightToolbar = new[] { true, true, true };
private readonly VisualElement m_EmptyPicksView;
private readonly GridView m_PersonalGridView;
private readonly MultiColumnListView m_PersonalListView;
private readonly TilePaletteHidePicksToggle m_HideToggle;
private readonly VisualElement m_RightToolbar;
private readonly VisualElement m_ViewToolbar;
private readonly Slider m_Slider;
private readonly EditorToolbarToggle m_ListToggle;
private readonly EditorToolbarToggle m_GridToggle;
private IVisualElementScheduledItem m_GeometryResizeItem;
private IVisualElementScheduledItem m_FilterTextItem;
private GridBrushPickStore pickStore => GridPaintingState.brushPickStore;
private int itemSize
{
get => Mathf.FloorToInt(kDefaultItemSize * brushPickScale);
}
private bool isShowGrid
{
get => EditorPrefs.GetBool(brushPickUserViewEditorPref, true);
set => EditorPrefs.SetBool(brushPickUserViewEditorPref, value);
}
private float brushPickScale
{
get => EditorPrefs.GetFloat(brushPickScaleEditorPref, 1.0f);
set => EditorPrefs.SetFloat(brushPickScaleEditorPref, Mathf.Clamp(value, kSliderScaleMinValue, kSliderScaleMaxValue));
}
private bool isBrushPickFiltered => brushPickFiltered || !String.IsNullOrWhiteSpace(brushPickFilterText);
private bool brushPickFiltered
{
get => EditorPrefs.GetBool(brushPickFilteredEditorPref, false);
set => EditorPrefs.SetBool(brushPickFilteredEditorPref, value);
}
private string brushPickFilterText
{
get => EditorPrefs.GetString(brushPickFilterTextEditorPref, "");
set => EditorPrefs.SetString(brushPickFilterTextEditorPref, value);
}
/// <summary>
/// Whether the Brush Picks overlay is hidden when a Brush Pick is selected.
/// </summary>
public bool hideOnPick
{
get => EditorPrefs.GetBool(kTilePaletteBrushPickHideOnPickEditorPref, true);
set
{
EditorPrefs.SetBool(kTilePaletteBrushPickHideOnPickEditorPref, value);
m_HideToggle.SetValueWithoutNotify(value);
}
}
internal int lastSelection
{
get => EditorPrefs.GetInt(kTilePaletteBrushPickLastSelectionEditorPref, -1);
set => EditorPrefs.SetInt(kTilePaletteBrushPickLastSelectionEditorPref, value);
}
private bool m_InitialScrollToLastSelection;
/// <summary>
/// Callback when the active Brush does a Pick on the Clipboard.
/// </summary>
public event Action onBrushPicked
{
add
{
onBrushPickedInternal += value;
if (onBrushPickedInternal != null)
{
TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteOverlayActiveRightToolbar);
}
}
remove
{
onBrushPickedInternal -= value;
if (onBrushPickedInternal == null)
{
TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteWindowActiveRightToolbar);
}
}
}
private event Action onBrushPickedInternal;
/// <summary>
/// Initializes and returns an instance of TilePaletteBrushPickElement.
/// </summary>
public TilePaletteBrushPickElement()
{
AddToClassList(ussClassName);
TilePaletteOverlayUtility.SetStyleSheet(this);
m_EmptyPicksView = new VisualElement();
m_EmptyPicksView.AddToClassList(emptyViewUssClassName);
m_EmptyPicksView.style.display = DisplayStyle.None;
m_EmptyPicksView.style.visibility = Visibility.Hidden;
UpdateEmptyPicksView();
m_PersonalListView = new MultiColumnListView
{
showAlternatingRowBackgrounds = AlternatingRowBackground.ContentOnly,
reorderable = true,
reorderMode = ListViewReorderMode.Animated,
columns =
{
new Column()
{
title = kListViewNameColumn,
minWidth = kDefaultItemSize * kSliderScaleMinValue + kDefaultTextSize,
width = itemSize + kDefaultTextSize,
},
new Column()
{
title = kListViewTypeColumn,
minWidth = kDefaultTypeTextSize,
width = kDefaultTypeTextSize,
},
}
};
m_PersonalListView.itemIndexChanged += UserItemIndexChanged;
m_PersonalListView.columns[0].makeCell = MakeUserItem;
m_PersonalListView.columns[0].bindCell = BindUserItem;
m_PersonalListView.columns[1].makeCell = MakeUserType;
m_PersonalListView.columns[1].bindCell = BindUserType;
m_PersonalListView.itemsChosen += OnUserItemChosen;
m_PersonalListView.selectionChanged += OnUserSelectionChanged;
m_PersonalListView.style.display = isShowGrid ? DisplayStyle.None : DisplayStyle.Flex;
m_PersonalGridView = new GridView();
m_PersonalGridView.selectionType = SelectionType.Single;
m_PersonalGridView.showBorder = true;
m_PersonalGridView.makeItem = MakeUserItem;
m_PersonalGridView.bindItem = BindUserItem;
m_PersonalGridView.onItemsChosen += OnUserItemChosen;
m_PersonalGridView.onSelectionChange += OnUserSelectionChanged;
m_PersonalGridView.style.display = isShowGrid ? DisplayStyle.Flex : DisplayStyle.None;
var personalToolbar = new VisualElement();
personalToolbar.AddToClassList(labelToolbarUssClassName);
personalToolbar.Add(new Label(kPersonal));
var emptySpace = new VisualElement();
emptySpace.style.flexGrow = 1.0f;
emptySpace.style.flexShrink = 0f;
personalToolbar.Add(emptySpace);
var filterField = new ToolbarSearchField();
filterField.SetValueWithoutNotify(brushPickFilterText);
filterField.RegisterValueChangedCallback(FilterTextChanged);
personalToolbar.Add(filterField);
m_RightToolbar = EditorToolbar.CreateOverlay(k_RightToolbarElements);
TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteWindowActiveRightToolbar);
var filterButton = m_RightToolbar.Q<EditorToolbarToggle>(null, TilePaletteBrushPickActiveBrushToggle.k_ElementClass);
filterButton.RegisterValueChangedCallback(FilterChanged);
filterButton.SetValueWithoutNotify(brushPickFiltered);
var saveButton = m_RightToolbar.Q<EditorToolbarButton>(null, TilePaletteBrushPickSaveButton.k_ElementClass);
saveButton.clicked += AddCurrent;
m_HideToggle = m_RightToolbar.Q<TilePaletteHidePicksToggle>();
m_HideToggle.SetValueWithoutNotify(hideOnPick);
m_HideToggle.ToggleChanged += OnHidePicksToggleChanged;
personalToolbar.Add(m_RightToolbar);
Add(personalToolbar);
Add(m_EmptyPicksView);
Add(m_PersonalListView);
Add(m_PersonalGridView);
m_ViewToolbar = new VisualElement();
m_ViewToolbar.AddToClassList(viewToolbarUssClassName);
emptySpace = new VisualElement();
emptySpace.style.flexGrow = 1f;
emptySpace.style.flexShrink = 0f;
m_ViewToolbar.Add(emptySpace);
m_Slider = new Slider(kSliderScaleMinValue, kSliderScaleMaxValue);
m_Slider.SetValueWithoutNotify(brushPickScale);
m_Slider.RegisterValueChangedCallback(SliderChanged);
m_Slider.tooltip = kSizeSliderTooltip;
m_ViewToolbar.Add(m_Slider);
m_ListToggle = new EditorToolbarToggle();
m_ListToggle.AddToClassList("list-button");
m_ListToggle.RegisterValueChangedCallback(ListToggleChanged);
m_ListToggle.SetValueWithoutNotify(!isShowGrid);
m_ListToggle.tooltip = kListViewTooltip;
m_ViewToolbar.Add(m_ListToggle);
m_GridToggle = new EditorToolbarToggle();
m_GridToggle.AddToClassList("grid-button");
m_GridToggle.RegisterValueChangedCallback(GridToggleChanged);
m_GridToggle.SetValueWithoutNotify(isShowGrid);
m_GridToggle.tooltip = kGridViewTooltip;
m_ViewToolbar.Add(m_GridToggle);
Add(m_ViewToolbar);
var lastUsedToolbar = new VisualElement();
lastUsedToolbar.AddToClassList(labelToolbarUssClassName);
lastUsedToolbar.AddToClassList(lastUsedUssClassName);
lastUsedToolbar.Add(new Label(kLastUsed));
Add(lastUsedToolbar);
RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
RegisterCallback<GeometryChangedEvent>(GeometryChanged);
}
private void UpdateEmptyPicksView()
{
m_EmptyPicksView.Clear();
TilemapEditorTool pickingTool = null;
foreach (var tool in TilemapEditorTool.tilemapEditorTools)
{
if (tool is PickingTool editorTool)
{
pickingTool = editorTool;
break;
}
}
if (pickingTool != null)
{
m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText));
var line1Text = new VisualElement();
line1Text.style.flexDirection = FlexDirection.Row;
line1Text.Add(new Label(kEmptyViewSaveBrushPickText1));
var pickToolButton = new TilemapEditorToolButton(pickingTool);
var pickToolStrip = new VisualElement();
pickToolStrip.Add(pickToolButton);
EditorToolbarUtility.SetupChildrenAsButtonStrip(pickToolStrip);
line1Text.Add(pickToolStrip);
m_EmptyPicksView.Add(line1Text);
m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText2));
}
else
{
m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText1Alt));
}
// Save
var line3Text = new VisualElement();
line3Text.style.flexDirection = FlexDirection.Row;
line3Text.Add(new Label(kEmptyViewSaveBrushPickText3));
var saveButton = new TilePaletteBrushPickSaveButton();
saveButton.clicked += AddCurrent;
var saveStrip = new VisualElement();
saveStrip.Add(saveButton);
EditorToolbarUtility.SetupChildrenAsButtonStrip(saveStrip);
line3Text.Add(saveStrip);
line3Text.Add(new Label(kEmptyViewSaveBrushPickText3a));
m_EmptyPicksView.Add(line3Text);
}
private void OnAttachedToPanel(AttachToPanelEvent evt)
{
GridPaintingState.brushChanged += OnBrushChanged;
GridPaintingState.brushPickChanged += OnBrushPickChanged;
GridPaintingState.brushPickStoreChanged += UpdatePick;
AssemblyReloadEvents.afterAssemblyReload += UpdatePick;
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
RegisterCallback<KeyDownEvent>(OnKeyPress);
UpdatePick();
}
private void OnDetachFromPanel(DetachFromPanelEvent evt)
{
UnregisterCallback<KeyDownEvent>(OnKeyPress);
AssemblyReloadEvents.afterAssemblyReload -= UpdatePick;
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
GridPaintingState.brushPickStoreChanged -= UpdatePick;
GridPaintingState.brushPickChanged -= OnBrushPickChanged;
GridPaintingState.brushChanged -= OnBrushChanged;
}
private void FilterTextChanged(ChangeEvent<string> evt)
{
brushPickFilterText = evt.newValue;
ClearFilterTextEvent();
var count = 500;
if (String.IsNullOrWhiteSpace(brushPickFilterText))
count = 200;
m_FilterTextItem = schedule.Execute(UpdatePick).StartingIn(count);
}
private void FilterChanged(ChangeEvent<bool> evt)
{
brushPickFiltered = evt.newValue;
UpdatePick();
}
private void SliderChanged(ChangeEvent<float> evt)
{
brushPickScale = evt.newValue;
var changed = false;
if (evt.newValue < evt.previousValue && evt.newValue < kSliderListThreshold)
{
m_GridToggle.SetValueWithoutNotify(false);
m_ListToggle.SetValueWithoutNotify(true);
changed = true;
}
else if (evt.newValue > evt.previousValue && evt.newValue > kSliderGridThreshold)
{
m_GridToggle.SetValueWithoutNotify(true);
m_ListToggle.SetValueWithoutNotify(false);
changed = true;
}
if (changed)
UpdatePersonalDisplay();
else
UpdateSize();
}
private void ListToggleChanged(ChangeEvent<bool> evt)
{
m_GridToggle.SetValueWithoutNotify(!evt.newValue);
UpdatePersonalDisplay();
}
private void GridToggleChanged(ChangeEvent<bool> evt)
{
m_ListToggle.SetValueWithoutNotify(!evt.newValue);
UpdatePersonalDisplay();
}
private void ClearGeometryResizeEvent()
{
if (m_GeometryResizeItem == null)
return;
m_GeometryResizeItem.Pause();
m_GeometryResizeItem = null;
}
private void GeometryChanged(GeometryChangedEvent evt)
{
ClearGeometryResizeEvent();
var count = 100;
m_GeometryResizeItem = schedule.Execute(UpdateSize).StartingIn(count);
}
private void UpdateSize()
{
m_PersonalListView.fixedItemHeight = itemSize;
if (!isShowGrid)
EditorApplication.delayCall += () => m_PersonalListView.Rebuild();
var inspectorWidth = resolvedStyle.width;
var gridColumnCount = Mathf.Max(1, Mathf.FloorToInt(inspectorWidth / itemSize));
m_PersonalGridView.itemHeight = itemSize;
m_PersonalGridView.columnCount = gridColumnCount;
if (isShowGrid)
EditorApplication.delayCall += () => m_PersonalGridView.Refresh();
var scrollIndex = m_PersonalGridView.selectedIndex;
if (!m_InitialScrollToLastSelection)
{
scrollIndex = lastSelection;
m_InitialScrollToLastSelection = true;
}
ScrollToSelectedDelayed(scrollIndex);
}
private void UpdatePersonalDisplay()
{
var showGrid = m_GridToggle.value;
isShowGrid = showGrid;
if (showGrid)
{
m_PersonalGridView.style.display = DisplayStyle.Flex;
m_PersonalListView.style.display = DisplayStyle.None;
m_PersonalGridView.selectedIndex = m_PersonalListView.selectedIndex;
if (m_Slider.value < kSliderListThreshold)
{
m_Slider.SetValueWithoutNotify(kSliderListThreshold);
brushPickScale = kSliderListThreshold;
}
}
else
{
m_PersonalGridView.style.display = DisplayStyle.None;
m_PersonalListView.style.display = DisplayStyle.Flex;
m_PersonalListView.selectedIndex = m_PersonalGridView.selectedIndex;
if (m_Slider.value > kSliderGridThreshold)
{
m_Slider.SetValueWithoutNotify(kSliderGridThreshold);
brushPickScale = kSliderGridThreshold;
}
}
UpdateSize();
}
private void ClearFilterTextEvent()
{
if (m_FilterTextItem == null)
return;
m_FilterTextItem.Pause();
m_FilterTextItem = null;
}
private void UpdatePick()
{
ClearFilterTextEvent();
pickStore.SetUserBrushFilterType(brushPickFiltered ? GridPaintingState.gridBrush.GetType() : null, brushPickFilterText);
m_PersonalListView.itemsSource = pickStore.filteredUserSavedBrushes;
m_PersonalListView.RefreshItems();
m_PersonalGridView.itemsSource = pickStore.filteredUserSavedBrushes;
if (pickStore.userSavedBrushes.Count == 0)
{
m_EmptyPicksView.style.display = DisplayStyle.Flex;
m_EmptyPicksView.style.visibility = Visibility.Visible;
m_PersonalListView.style.display = DisplayStyle.None;
m_PersonalGridView.style.display = DisplayStyle.None;
m_ViewToolbar.SetEnabled(false);
}
else
{
m_EmptyPicksView.style.display = DisplayStyle.None;
m_EmptyPicksView.style.visibility = Visibility.Hidden;
m_ViewToolbar.SetEnabled(true);
if (m_PersonalGridView.style.display == DisplayStyle.None
&& m_PersonalListView.style.display == DisplayStyle.None)
{
UpdatePersonalDisplay();
if (!isShowGrid)
EditorApplication.delayCall += () => m_PersonalListView.Rebuild();
if (isShowGrid)
EditorApplication.delayCall += () => m_PersonalGridView.Refresh();
}
}
}
private void UserItemIndexChanged(int oldIdx, int newIdx)
{
if (oldIdx == newIdx)
return;
if (isBrushPickFiltered)
{
oldIdx = pickStore.GetIndexOfUserBrush(pickStore.filteredUserSavedBrushes[oldIdx]);
newIdx = pickStore.GetIndexOfUserBrush(pickStore.filteredUserSavedBrushes[newIdx]);
}
pickStore.SwapUserSavedBrushes(oldIdx, newIdx);
UpdatePick();
}
private void OnUserSelectionChanged(IEnumerable<object> objs)
{
foreach (var obj in objs)
{
var idx = pickStore.filteredUserSavedBrushes.IndexOf(obj as GridBrushBase);
if (idx >= 0)
{
LoadBrush(true, idx);
lastSelection = idx;
}
break;
}
}
private void BindUserItem(VisualElement item, int idx)
{
var brush = pickStore.filteredUserSavedBrushes[idx];
var brushPickItemElement = item.Q<TilePaletteBrushPickItemElement>();
brushPickItemElement.SetBrush(brush);
if (!isShowGrid)
{
brushPickItemElement.SetSize(itemSize);
}
if (brush != null)
{
brushPickItemElement.pointerUpEvent = () => LoadBrush(true, idx);
brushPickItemElement.renameEvent = newName => RenameUser(idx, newName);
}
}
private VisualElement MakeUserItem()
{
var element = new TilePaletteBrushPickItemElement(true);
return element;
}
private void BindUserType(VisualElement item, int idx)
{
var brush = pickStore.filteredUserSavedBrushes[idx];
var brushPickTypeElement = item.Q<TilePaletteBrushPickTypeElement>();
brushPickTypeElement.SetBrush(brush);
}
private VisualElement MakeUserType()
{
var element = new TilePaletteBrushPickTypeElement();
return element;
}
private void OnPlayModeStateChanged(PlayModeStateChange playModeStateChange)
{
if (playModeStateChange != PlayModeStateChange.EnteredEditMode)
return;
UpdatePick();
}
private void OnBrushChanged(GridBrushBase brush)
{
UpdateEmptyPicksView();
UpdatePick();
}
private void OnBrushPickChanged()
{
UpdatePick();
m_PersonalGridView.ClearSelection();
m_PersonalListView.ClearSelection();
}
private void OnHidePicksToggleChanged(bool hidePicks)
{
hideOnPick = hidePicks;
}
private void OnKeyPress(KeyDownEvent evt)
{
switch (evt.keyCode)
{
case KeyCode.F2:
ActivateRenameUser();
break;
case KeyCode.Backspace:
if ((Application.platform == RuntimePlatform.OSXEditor)
&& evt.commandKey)
{
DeleteUser();
}
break;
case KeyCode.Delete:
{
DeleteUser();
}
break;
}
}
private void OnUserItemChosen(IEnumerable<object> objs)
{
EditorApplication.delayCall += ActivateRenameUser;
}
private void LoadBrush(bool user, int idx)
{
if (user && isBrushPickFiltered)
{
idx = pickStore.GetIndexOfUserBrushFromFilteredIdx(idx);
}
GridPaintingState.SetPickOnActiveGridBrush(user, idx);
if (!TilemapEditorTool.IsActive(typeof(PaintTool)))
{
foreach (var tilemapEditorTool in TilemapEditorTool.tilemapEditorTools)
{
if (tilemapEditorTool is not PaintTool)
continue;
ToolManager.SetActiveTool(tilemapEditorTool);
break;
}
}
if (hideOnPick)
onBrushPickedInternal?.Invoke();
}
private void ActivateRenameUser()
{
TilePaletteBrushPickItemElement selectedItem = null;
if (isShowGrid)
{
selectedItem = m_PersonalGridView.GetElementAt(m_PersonalGridView.selectedIndex) as TilePaletteBrushPickItemElement;
}
else
{
var ve = m_PersonalListView.GetRootElementForIndex(m_PersonalListView.selectedIndex);
if (ve != null)
selectedItem = ve.Q<TilePaletteBrushPickItemElement>();
}
if (selectedItem != null)
selectedItem.ToggleRename();
}
private void RenameUser(int idx, string newName)
{
if (idx < 0 || idx >= pickStore.filteredUserSavedBrushes.Count)
return;
var brush = pickStore.filteredUserSavedBrushes[idx];
if (brush.name == newName)
return;
brush.name = newName;
if (isBrushPickFiltered)
{
idx = pickStore.GetIndexOfUserBrush(brush);
}
pickStore.SaveUserSavedBrush(idx, brush);
}
private void DeleteUser()
{
var isGridView = m_GridToggle.value;
var idx = m_PersonalListView.selectedIndex;
if (isGridView)
idx = m_PersonalGridView.selectedIndex;
if (isBrushPickFiltered)
{
idx = pickStore.GetIndexOfUserBrushFromFilteredIdx(idx);
}
if (pickStore.RemoveUserSavedBrush(idx))
UpdatePick();
}
private void AddCurrent()
{
pickStore.AddNewUserSavedBrush(GridPaintingState.gridBrush);
UpdatePick();
var idx = pickStore.filteredUserSavedBrushes.Count - 1;
m_PersonalListView.selectedIndex = idx;
m_PersonalGridView.selectedIndex = idx;
ScrollToSelectedDelayed(idx);
if (isShowGrid)
{
var element = m_PersonalGridView.GetElementAt(idx);
if (element != null)
element.Focus();
}
else
{
var element = m_PersonalListView.GetRootElementForIndex(idx);
if (element != null)
element.Focus();
}
}
private void ScrollToSelectedDelayed(int index)
{
if (index == -1)
return;
EditorApplication.delayCall += () =>
{
m_PersonalListView.ScrollToItem(index);
m_PersonalGridView.ScrollToItem(index);
};
}
}
[EditorToolbarElement(k_ToolbarId)]
internal sealed class TilePaletteBrushPickActiveBrushToggle : EditorToolbarToggle
{
internal const string k_ToolbarId = "Tile Palette/Tile Palette Brush Pick Filter";
internal static readonly string k_ElementClass = "unity-tilepalette-brushpick-filter-toggle";
private static readonly string k_ToolSettingsClass = "unity-tool-settings";
private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/EditorUI.Filter.png";
private static readonly string k_TooltipText = L10n.Tr("Filters Picks by Active Brush Type");
public TilePaletteBrushPickActiveBrushToggle()
{
name = "Tile Palette Filter Pick";
AddToClassList(k_ToolSettingsClass);
AddToClassList(k_ElementClass);
TilePaletteOverlayUtility.SetStyleSheet(this);
icon = EditorGUIUtility.LoadIcon(k_IconPath);
tooltip = k_TooltipText;
}
}
[EditorToolbarElement(k_ToolbarId)]
internal sealed class TilePaletteBrushPickSaveButton : EditorToolbarButton
{
internal const string k_ToolbarId = "Tile Palette/Tile Palette Brush Pick Save";
internal static readonly string k_ElementClass = "unity-tilepalette-brushpick-save-button";
private static readonly string k_ToolSettingsClass = "unity-tool-settings";
private static readonly string k_TooltipText = L10n.Tr("Adds the current Brush as a new saved Pick");
public TilePaletteBrushPickSaveButton()
{
name = "Tile Palette Save Pick";
AddToClassList(k_ToolSettingsClass);
AddToClassList(k_ElementClass);
TilePaletteOverlayUtility.SetStyleSheet(this);
icon = EditorGUIUtility.LoadIcon("SaveAs");
tooltip = k_TooltipText;
}
}
[EditorToolbarElement(k_ToolbarId)]
internal sealed class TilePaletteHidePicksToggle : EditorToolbarToggle
{
internal const string k_ToolbarId = "Tile Palette/Tile Palette Hide Picks";
private static readonly string k_ToolSettingsClass = "unity-tool-settings";
private static readonly string k_ElementClass = "unity-tilepalette-element-hidepicks";
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 Brush Picks on Pick. ( {0} ) to show/hide Brush Picks.");
private static readonly string k_ShortcutId = "Grid Painting/Toggle SceneView BrushPick";
public Action<bool> ToggleChanged;
public TilePaletteHidePicksToggle()
{
name = "Tile Palette Hide Picks";
AddToClassList(k_ToolSettingsClass);
AddToClassList(k_ElementClass);
TilePaletteOverlayUtility.SetStyleSheet(this);
icon = EditorGUIUtility.LoadIcon(k_IconPath);
RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
RegisterCallback<DetachFromPanelEvent>(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);
}
}
}