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

TilePaletteBrushPickElement.cs 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor.EditorTools;
  4. using UnityEditor.ShortcutManagement;
  5. using UnityEditor.Tilemaps.External;
  6. using UnityEditor.Toolbars;
  7. using UnityEditor.UIElements;
  8. using UnityEngine;
  9. using UnityEngine.UIElements;
  10. namespace UnityEditor.Tilemaps
  11. {
  12. [UxmlElement]
  13. internal partial class TilePaletteBrushPickElement : VisualElement
  14. {
  15. /// <summary>
  16. /// Factory for TilePaletteBrushPickElement.
  17. /// </summary>
  18. [Obsolete("TilePaletteBrushPickElementFactory is deprecated and will be removed. Use UxmlElementAttribute instead.", false)]
  19. public class TilePaletteBrushPickElementFactory : UxmlFactory<TilePaletteBrushPickElement, TilePaletteBrushPickElementUxmlTraits> {}
  20. /// <summary>
  21. /// UxmlTraits for TilePaletteBrushPickElement.
  22. /// </summary>
  23. [Obsolete("TilePaletteBrushPickElementUxmlTraits is deprecated and will be removed. Use UxmlElementAttribute instead.", false)]
  24. public class TilePaletteBrushPickElementUxmlTraits : UxmlTraits {}
  25. /// <summary>
  26. /// USS class name of elements of this type.
  27. /// </summary>
  28. private static readonly string ussClassName = "unity-tilepalette-brushpick";
  29. private static readonly string labelToolbarUssClassName = "unity-tilepalette-label-toolbar";
  30. private static readonly string viewToolbarUssClassName = "unity-tilepalette-brushpick-view-toolbar";
  31. private static readonly string lastUsedUssClassName = "unity-tilepalette-brushpick-lastused";
  32. private static readonly string emptyViewUssClassName = "unity-tilepalette-brushpick-emptyview";
  33. private static readonly string kTilePaletteBrushPickHideOnPickEditorPref = "TilePaletteBrushPickHideOnPick";
  34. private static readonly string kTilePaletteBrushPickLastSelectionEditorPref = "TilePaletteBrushPickLastSelection";
  35. private static readonly string kLastUsed = L10n.Tr("Last Picked");
  36. private static readonly string kPersonal = L10n.Tr("Saved Picks");
  37. private static readonly string kSizeSliderTooltip = L10n.Tr("Adjusts the size of the Picks");
  38. private static readonly string kGridViewTooltip = L10n.Tr("View Picks in a Grid");
  39. private static readonly string kListViewTooltip = L10n.Tr("View Picks in a List");
  40. private static readonly string kListViewNameColumn = L10n.Tr("Name");
  41. private static readonly string kListViewTypeColumn = L10n.Tr("Type");
  42. private static readonly string kEmptyViewSaveBrushPickText = L10n.Tr("To save a Brush Pick: ");
  43. private static readonly string kEmptyViewSaveBrushPickText1 = L10n.Tr("<indent=1em>\u2022<indent=2em>Activate the Pick Tool ");
  44. private static readonly string kEmptyViewSaveBrushPickText2 = L10n.Tr("<indent=1em>\u2022<indent=2em>Pick with the Brush from the Tile Palette or SceneView");
  45. private static readonly string kEmptyViewSaveBrushPickText3 = L10n.Tr("<indent=1em>\u2022<indent=2em>Hit the Save Button ");
  46. private static readonly string kEmptyViewSaveBrushPickText3a = L10n.Tr(" above to save it");
  47. private static readonly string kEmptyViewSaveBrushPickText1Alt = L10n.Tr("<indent=1em>\u2022<indent=2em>Set up the Brush in Brush Settings");
  48. private static readonly string brushPickUserViewEditorPref = "TilePaletteBrushPickUserView";
  49. private static readonly string brushPickScaleEditorPref = "TilePaletteBrushPickScale";
  50. private static readonly string brushPickFilteredEditorPref = "TilePaletteBrushPickFiltered";
  51. private static readonly string brushPickFilterTextEditorPref = "TilePaletteBrushPickFilterText";
  52. private static int kDefaultTextSize = 220;
  53. private static int kDefaultTypeTextSize = 160;
  54. private static int kDefaultItemSize = 96;
  55. private static int kDefaultBorderSize = 8;
  56. private static int kMinItemSize = kDefaultItemSize + kDefaultBorderSize;
  57. private static float kSliderScaleMinValue = 0.4f;
  58. private static float kSliderScaleMaxValue = 2.0f;
  59. private static float kSliderListThreshold = 0.8f;
  60. private static float kSliderGridThreshold = 1.2f;
  61. private static string[] k_RightToolbarElements = new[] {
  62. TilePaletteBrushPickActiveBrushToggle.k_ToolbarId,
  63. TilePaletteBrushPickSaveButton.k_ToolbarId,
  64. TilePaletteHidePicksToggle.k_ToolbarId
  65. };
  66. private static bool[] k_TilePaletteWindowActiveRightToolbar = new[] { true, true, false };
  67. private static bool[] k_TilePaletteOverlayActiveRightToolbar = new[] { true, true, true };
  68. private readonly VisualElement m_EmptyPicksView;
  69. private readonly GridView m_PersonalGridView;
  70. private readonly MultiColumnListView m_PersonalListView;
  71. private readonly TilePaletteHidePicksToggle m_HideToggle;
  72. private readonly VisualElement m_RightToolbar;
  73. private readonly VisualElement m_ViewToolbar;
  74. private readonly Slider m_Slider;
  75. private readonly EditorToolbarToggle m_ListToggle;
  76. private readonly EditorToolbarToggle m_GridToggle;
  77. private IVisualElementScheduledItem m_GeometryResizeItem;
  78. private IVisualElementScheduledItem m_FilterTextItem;
  79. private GridBrushPickStore pickStore => GridPaintingState.brushPickStore;
  80. private int itemSize
  81. {
  82. get => Mathf.FloorToInt(kDefaultItemSize * brushPickScale);
  83. }
  84. private bool isShowGrid
  85. {
  86. get => EditorPrefs.GetBool(brushPickUserViewEditorPref, true);
  87. set => EditorPrefs.SetBool(brushPickUserViewEditorPref, value);
  88. }
  89. private float brushPickScale
  90. {
  91. get => EditorPrefs.GetFloat(brushPickScaleEditorPref, 1.0f);
  92. set => EditorPrefs.SetFloat(brushPickScaleEditorPref, Mathf.Clamp(value, kSliderScaleMinValue, kSliderScaleMaxValue));
  93. }
  94. private bool isBrushPickFiltered => brushPickFiltered || !String.IsNullOrWhiteSpace(brushPickFilterText);
  95. private bool brushPickFiltered
  96. {
  97. get => EditorPrefs.GetBool(brushPickFilteredEditorPref, false);
  98. set => EditorPrefs.SetBool(brushPickFilteredEditorPref, value);
  99. }
  100. private string brushPickFilterText
  101. {
  102. get => EditorPrefs.GetString(brushPickFilterTextEditorPref, "");
  103. set => EditorPrefs.SetString(brushPickFilterTextEditorPref, value);
  104. }
  105. /// <summary>
  106. /// Whether the Brush Picks overlay is hidden when a Brush Pick is selected.
  107. /// </summary>
  108. public bool hideOnPick
  109. {
  110. get => EditorPrefs.GetBool(kTilePaletteBrushPickHideOnPickEditorPref, true);
  111. set
  112. {
  113. EditorPrefs.SetBool(kTilePaletteBrushPickHideOnPickEditorPref, value);
  114. m_HideToggle.SetValueWithoutNotify(value);
  115. }
  116. }
  117. internal int lastSelection
  118. {
  119. get => EditorPrefs.GetInt(kTilePaletteBrushPickLastSelectionEditorPref, -1);
  120. set => EditorPrefs.SetInt(kTilePaletteBrushPickLastSelectionEditorPref, value);
  121. }
  122. private bool m_InitialScrollToLastSelection;
  123. /// <summary>
  124. /// Callback when the active Brush does a Pick on the Clipboard.
  125. /// </summary>
  126. public event Action onBrushPicked
  127. {
  128. add
  129. {
  130. onBrushPickedInternal += value;
  131. if (onBrushPickedInternal != null)
  132. {
  133. TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteOverlayActiveRightToolbar);
  134. }
  135. }
  136. remove
  137. {
  138. onBrushPickedInternal -= value;
  139. if (onBrushPickedInternal == null)
  140. {
  141. TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteWindowActiveRightToolbar);
  142. }
  143. }
  144. }
  145. private event Action onBrushPickedInternal;
  146. /// <summary>
  147. /// Initializes and returns an instance of TilePaletteBrushPickElement.
  148. /// </summary>
  149. public TilePaletteBrushPickElement()
  150. {
  151. AddToClassList(ussClassName);
  152. TilePaletteOverlayUtility.SetStyleSheet(this);
  153. m_EmptyPicksView = new VisualElement();
  154. m_EmptyPicksView.AddToClassList(emptyViewUssClassName);
  155. m_EmptyPicksView.style.display = DisplayStyle.None;
  156. m_EmptyPicksView.style.visibility = Visibility.Hidden;
  157. UpdateEmptyPicksView();
  158. m_PersonalListView = new MultiColumnListView
  159. {
  160. showAlternatingRowBackgrounds = AlternatingRowBackground.ContentOnly,
  161. reorderable = true,
  162. reorderMode = ListViewReorderMode.Animated,
  163. columns =
  164. {
  165. new Column()
  166. {
  167. title = kListViewNameColumn,
  168. minWidth = kDefaultItemSize * kSliderScaleMinValue + kDefaultTextSize,
  169. width = itemSize + kDefaultTextSize,
  170. },
  171. new Column()
  172. {
  173. title = kListViewTypeColumn,
  174. minWidth = kDefaultTypeTextSize,
  175. width = kDefaultTypeTextSize,
  176. },
  177. }
  178. };
  179. m_PersonalListView.itemIndexChanged += UserItemIndexChanged;
  180. m_PersonalListView.columns[0].makeCell = MakeUserItem;
  181. m_PersonalListView.columns[0].bindCell = BindUserItem;
  182. m_PersonalListView.columns[1].makeCell = MakeUserType;
  183. m_PersonalListView.columns[1].bindCell = BindUserType;
  184. m_PersonalListView.itemsChosen += OnUserItemChosen;
  185. m_PersonalListView.selectionChanged += OnUserSelectionChanged;
  186. m_PersonalListView.style.display = isShowGrid ? DisplayStyle.None : DisplayStyle.Flex;
  187. m_PersonalGridView = new GridView();
  188. m_PersonalGridView.selectionType = SelectionType.Single;
  189. m_PersonalGridView.showBorder = true;
  190. m_PersonalGridView.makeItem = MakeUserItem;
  191. m_PersonalGridView.bindItem = BindUserItem;
  192. m_PersonalGridView.onItemsChosen += OnUserItemChosen;
  193. m_PersonalGridView.onSelectionChange += OnUserSelectionChanged;
  194. m_PersonalGridView.style.display = isShowGrid ? DisplayStyle.Flex : DisplayStyle.None;
  195. var personalToolbar = new VisualElement();
  196. personalToolbar.AddToClassList(labelToolbarUssClassName);
  197. personalToolbar.Add(new Label(kPersonal));
  198. var emptySpace = new VisualElement();
  199. emptySpace.style.flexGrow = 1.0f;
  200. emptySpace.style.flexShrink = 0f;
  201. personalToolbar.Add(emptySpace);
  202. var filterField = new ToolbarSearchField();
  203. filterField.SetValueWithoutNotify(brushPickFilterText);
  204. filterField.RegisterValueChangedCallback(FilterTextChanged);
  205. personalToolbar.Add(filterField);
  206. m_RightToolbar = EditorToolbar.CreateOverlay(k_RightToolbarElements);
  207. TilePaletteOverlayUtility.SetupChildrenAsButtonStripForVisible(m_RightToolbar, k_TilePaletteWindowActiveRightToolbar);
  208. var filterButton = m_RightToolbar.Q<EditorToolbarToggle>(null, TilePaletteBrushPickActiveBrushToggle.k_ElementClass);
  209. filterButton.RegisterValueChangedCallback(FilterChanged);
  210. filterButton.SetValueWithoutNotify(brushPickFiltered);
  211. var saveButton = m_RightToolbar.Q<EditorToolbarButton>(null, TilePaletteBrushPickSaveButton.k_ElementClass);
  212. saveButton.clicked += AddCurrent;
  213. m_HideToggle = m_RightToolbar.Q<TilePaletteHidePicksToggle>();
  214. m_HideToggle.SetValueWithoutNotify(hideOnPick);
  215. m_HideToggle.ToggleChanged += OnHidePicksToggleChanged;
  216. personalToolbar.Add(m_RightToolbar);
  217. Add(personalToolbar);
  218. Add(m_EmptyPicksView);
  219. Add(m_PersonalListView);
  220. Add(m_PersonalGridView);
  221. m_ViewToolbar = new VisualElement();
  222. m_ViewToolbar.AddToClassList(viewToolbarUssClassName);
  223. emptySpace = new VisualElement();
  224. emptySpace.style.flexGrow = 1f;
  225. emptySpace.style.flexShrink = 0f;
  226. m_ViewToolbar.Add(emptySpace);
  227. m_Slider = new Slider(kSliderScaleMinValue, kSliderScaleMaxValue);
  228. m_Slider.SetValueWithoutNotify(brushPickScale);
  229. m_Slider.RegisterValueChangedCallback(SliderChanged);
  230. m_Slider.tooltip = kSizeSliderTooltip;
  231. m_ViewToolbar.Add(m_Slider);
  232. m_ListToggle = new EditorToolbarToggle();
  233. m_ListToggle.AddToClassList("list-button");
  234. m_ListToggle.RegisterValueChangedCallback(ListToggleChanged);
  235. m_ListToggle.SetValueWithoutNotify(!isShowGrid);
  236. m_ListToggle.tooltip = kListViewTooltip;
  237. m_ViewToolbar.Add(m_ListToggle);
  238. m_GridToggle = new EditorToolbarToggle();
  239. m_GridToggle.AddToClassList("grid-button");
  240. m_GridToggle.RegisterValueChangedCallback(GridToggleChanged);
  241. m_GridToggle.SetValueWithoutNotify(isShowGrid);
  242. m_GridToggle.tooltip = kGridViewTooltip;
  243. m_ViewToolbar.Add(m_GridToggle);
  244. Add(m_ViewToolbar);
  245. var lastUsedToolbar = new VisualElement();
  246. lastUsedToolbar.AddToClassList(labelToolbarUssClassName);
  247. lastUsedToolbar.AddToClassList(lastUsedUssClassName);
  248. lastUsedToolbar.Add(new Label(kLastUsed));
  249. Add(lastUsedToolbar);
  250. RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
  251. RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
  252. RegisterCallback<GeometryChangedEvent>(GeometryChanged);
  253. }
  254. private void UpdateEmptyPicksView()
  255. {
  256. m_EmptyPicksView.Clear();
  257. TilemapEditorTool pickingTool = null;
  258. foreach (var tool in TilemapEditorTool.tilemapEditorTools)
  259. {
  260. if (tool is PickingTool editorTool)
  261. {
  262. pickingTool = editorTool;
  263. break;
  264. }
  265. }
  266. if (pickingTool != null)
  267. {
  268. m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText));
  269. var line1Text = new VisualElement();
  270. line1Text.style.flexDirection = FlexDirection.Row;
  271. line1Text.Add(new Label(kEmptyViewSaveBrushPickText1));
  272. var pickToolButton = new TilemapEditorToolButton(pickingTool);
  273. var pickToolStrip = new VisualElement();
  274. pickToolStrip.Add(pickToolButton);
  275. EditorToolbarUtility.SetupChildrenAsButtonStrip(pickToolStrip);
  276. line1Text.Add(pickToolStrip);
  277. m_EmptyPicksView.Add(line1Text);
  278. m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText2));
  279. }
  280. else
  281. {
  282. m_EmptyPicksView.Add(new Label(kEmptyViewSaveBrushPickText1Alt));
  283. }
  284. // Save
  285. var line3Text = new VisualElement();
  286. line3Text.style.flexDirection = FlexDirection.Row;
  287. line3Text.Add(new Label(kEmptyViewSaveBrushPickText3));
  288. var saveButton = new TilePaletteBrushPickSaveButton();
  289. saveButton.clicked += AddCurrent;
  290. var saveStrip = new VisualElement();
  291. saveStrip.Add(saveButton);
  292. EditorToolbarUtility.SetupChildrenAsButtonStrip(saveStrip);
  293. line3Text.Add(saveStrip);
  294. line3Text.Add(new Label(kEmptyViewSaveBrushPickText3a));
  295. m_EmptyPicksView.Add(line3Text);
  296. }
  297. private void OnAttachedToPanel(AttachToPanelEvent evt)
  298. {
  299. GridPaintingState.brushChanged += OnBrushChanged;
  300. GridPaintingState.brushPickChanged += OnBrushPickChanged;
  301. GridPaintingState.brushPickStoreChanged += UpdatePick;
  302. AssemblyReloadEvents.afterAssemblyReload += UpdatePick;
  303. EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
  304. RegisterCallback<KeyDownEvent>(OnKeyPress);
  305. UpdatePick();
  306. }
  307. private void OnDetachFromPanel(DetachFromPanelEvent evt)
  308. {
  309. UnregisterCallback<KeyDownEvent>(OnKeyPress);
  310. AssemblyReloadEvents.afterAssemblyReload -= UpdatePick;
  311. EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
  312. GridPaintingState.brushPickStoreChanged -= UpdatePick;
  313. GridPaintingState.brushPickChanged -= OnBrushPickChanged;
  314. GridPaintingState.brushChanged -= OnBrushChanged;
  315. }
  316. private void FilterTextChanged(ChangeEvent<string> evt)
  317. {
  318. brushPickFilterText = evt.newValue;
  319. ClearFilterTextEvent();
  320. var count = 500;
  321. if (String.IsNullOrWhiteSpace(brushPickFilterText))
  322. count = 200;
  323. m_FilterTextItem = schedule.Execute(UpdatePick).StartingIn(count);
  324. }
  325. private void FilterChanged(ChangeEvent<bool> evt)
  326. {
  327. brushPickFiltered = evt.newValue;
  328. UpdatePick();
  329. }
  330. private void SliderChanged(ChangeEvent<float> evt)
  331. {
  332. brushPickScale = evt.newValue;
  333. var changed = false;
  334. if (evt.newValue < evt.previousValue && evt.newValue < kSliderListThreshold)
  335. {
  336. m_GridToggle.SetValueWithoutNotify(false);
  337. m_ListToggle.SetValueWithoutNotify(true);
  338. changed = true;
  339. }
  340. else if (evt.newValue > evt.previousValue && evt.newValue > kSliderGridThreshold)
  341. {
  342. m_GridToggle.SetValueWithoutNotify(true);
  343. m_ListToggle.SetValueWithoutNotify(false);
  344. changed = true;
  345. }
  346. if (changed)
  347. UpdatePersonalDisplay();
  348. else
  349. UpdateSize();
  350. }
  351. private void ListToggleChanged(ChangeEvent<bool> evt)
  352. {
  353. m_GridToggle.SetValueWithoutNotify(!evt.newValue);
  354. UpdatePersonalDisplay();
  355. }
  356. private void GridToggleChanged(ChangeEvent<bool> evt)
  357. {
  358. m_ListToggle.SetValueWithoutNotify(!evt.newValue);
  359. UpdatePersonalDisplay();
  360. }
  361. private void ClearGeometryResizeEvent()
  362. {
  363. if (m_GeometryResizeItem == null)
  364. return;
  365. m_GeometryResizeItem.Pause();
  366. m_GeometryResizeItem = null;
  367. }
  368. private void GeometryChanged(GeometryChangedEvent evt)
  369. {
  370. ClearGeometryResizeEvent();
  371. var count = 100;
  372. m_GeometryResizeItem = schedule.Execute(UpdateSize).StartingIn(count);
  373. }
  374. private void UpdateSize()
  375. {
  376. m_PersonalListView.fixedItemHeight = itemSize;
  377. if (!isShowGrid)
  378. EditorApplication.delayCall += () => m_PersonalListView.Rebuild();
  379. var inspectorWidth = resolvedStyle.width;
  380. var gridColumnCount = Mathf.Max(1, Mathf.FloorToInt(inspectorWidth / itemSize));
  381. m_PersonalGridView.itemHeight = itemSize;
  382. m_PersonalGridView.columnCount = gridColumnCount;
  383. if (isShowGrid)
  384. EditorApplication.delayCall += () => m_PersonalGridView.Refresh();
  385. var scrollIndex = m_PersonalGridView.selectedIndex;
  386. if (!m_InitialScrollToLastSelection)
  387. {
  388. scrollIndex = lastSelection;
  389. m_InitialScrollToLastSelection = true;
  390. }
  391. ScrollToSelectedDelayed(scrollIndex);
  392. }
  393. private void UpdatePersonalDisplay()
  394. {
  395. var showGrid = m_GridToggle.value;
  396. isShowGrid = showGrid;
  397. if (showGrid)
  398. {
  399. m_PersonalGridView.style.display = DisplayStyle.Flex;
  400. m_PersonalListView.style.display = DisplayStyle.None;
  401. m_PersonalGridView.selectedIndex = m_PersonalListView.selectedIndex;
  402. if (m_Slider.value < kSliderListThreshold)
  403. {
  404. m_Slider.SetValueWithoutNotify(kSliderListThreshold);
  405. brushPickScale = kSliderListThreshold;
  406. }
  407. }
  408. else
  409. {
  410. m_PersonalGridView.style.display = DisplayStyle.None;
  411. m_PersonalListView.style.display = DisplayStyle.Flex;
  412. m_PersonalListView.selectedIndex = m_PersonalGridView.selectedIndex;
  413. if (m_Slider.value > kSliderGridThreshold)
  414. {
  415. m_Slider.SetValueWithoutNotify(kSliderGridThreshold);
  416. brushPickScale = kSliderGridThreshold;
  417. }
  418. }
  419. UpdateSize();
  420. }
  421. private void ClearFilterTextEvent()
  422. {
  423. if (m_FilterTextItem == null)
  424. return;
  425. m_FilterTextItem.Pause();
  426. m_FilterTextItem = null;
  427. }
  428. private void UpdatePick()
  429. {
  430. ClearFilterTextEvent();
  431. pickStore.SetUserBrushFilterType(brushPickFiltered ? GridPaintingState.gridBrush.GetType() : null, brushPickFilterText);
  432. m_PersonalListView.itemsSource = pickStore.filteredUserSavedBrushes;
  433. m_PersonalListView.RefreshItems();
  434. m_PersonalGridView.itemsSource = pickStore.filteredUserSavedBrushes;
  435. if (pickStore.userSavedBrushes.Count == 0)
  436. {
  437. m_EmptyPicksView.style.display = DisplayStyle.Flex;
  438. m_EmptyPicksView.style.visibility = Visibility.Visible;
  439. m_PersonalListView.style.display = DisplayStyle.None;
  440. m_PersonalGridView.style.display = DisplayStyle.None;
  441. m_ViewToolbar.SetEnabled(false);
  442. }
  443. else
  444. {
  445. m_EmptyPicksView.style.display = DisplayStyle.None;
  446. m_EmptyPicksView.style.visibility = Visibility.Hidden;
  447. m_ViewToolbar.SetEnabled(true);
  448. if (m_PersonalGridView.style.display == DisplayStyle.None
  449. && m_PersonalListView.style.display == DisplayStyle.None)
  450. {
  451. UpdatePersonalDisplay();
  452. if (!isShowGrid)
  453. EditorApplication.delayCall += () => m_PersonalListView.Rebuild();
  454. if (isShowGrid)
  455. EditorApplication.delayCall += () => m_PersonalGridView.Refresh();
  456. }
  457. }
  458. }
  459. private void UserItemIndexChanged(int oldIdx, int newIdx)
  460. {
  461. if (oldIdx == newIdx)
  462. return;
  463. if (isBrushPickFiltered)
  464. {
  465. oldIdx = pickStore.GetIndexOfUserBrush(pickStore.filteredUserSavedBrushes[oldIdx]);
  466. newIdx = pickStore.GetIndexOfUserBrush(pickStore.filteredUserSavedBrushes[newIdx]);
  467. }
  468. pickStore.SwapUserSavedBrushes(oldIdx, newIdx);
  469. UpdatePick();
  470. }
  471. private void OnUserSelectionChanged(IEnumerable<object> objs)
  472. {
  473. foreach (var obj in objs)
  474. {
  475. var idx = pickStore.filteredUserSavedBrushes.IndexOf(obj as GridBrushBase);
  476. if (idx >= 0)
  477. {
  478. LoadBrush(true, idx);
  479. lastSelection = idx;
  480. }
  481. break;
  482. }
  483. }
  484. private void BindUserItem(VisualElement item, int idx)
  485. {
  486. var brush = pickStore.filteredUserSavedBrushes[idx];
  487. var brushPickItemElement = item.Q<TilePaletteBrushPickItemElement>();
  488. brushPickItemElement.SetBrush(brush);
  489. if (!isShowGrid)
  490. {
  491. brushPickItemElement.SetSize(itemSize);
  492. }
  493. if (brush != null)
  494. {
  495. brushPickItemElement.pointerUpEvent = () => LoadBrush(true, idx);
  496. brushPickItemElement.renameEvent = newName => RenameUser(idx, newName);
  497. }
  498. }
  499. private VisualElement MakeUserItem()
  500. {
  501. var element = new TilePaletteBrushPickItemElement(true);
  502. return element;
  503. }
  504. private void BindUserType(VisualElement item, int idx)
  505. {
  506. var brush = pickStore.filteredUserSavedBrushes[idx];
  507. var brushPickTypeElement = item.Q<TilePaletteBrushPickTypeElement>();
  508. brushPickTypeElement.SetBrush(brush);
  509. }
  510. private VisualElement MakeUserType()
  511. {
  512. var element = new TilePaletteBrushPickTypeElement();
  513. return element;
  514. }
  515. private void OnPlayModeStateChanged(PlayModeStateChange playModeStateChange)
  516. {
  517. if (playModeStateChange != PlayModeStateChange.EnteredEditMode)
  518. return;
  519. UpdatePick();
  520. }
  521. private void OnBrushChanged(GridBrushBase brush)
  522. {
  523. UpdateEmptyPicksView();
  524. UpdatePick();
  525. }
  526. private void OnBrushPickChanged()
  527. {
  528. UpdatePick();
  529. m_PersonalGridView.ClearSelection();
  530. m_PersonalListView.ClearSelection();
  531. }
  532. private void OnHidePicksToggleChanged(bool hidePicks)
  533. {
  534. hideOnPick = hidePicks;
  535. }
  536. private void OnKeyPress(KeyDownEvent evt)
  537. {
  538. switch (evt.keyCode)
  539. {
  540. case KeyCode.F2:
  541. ActivateRenameUser();
  542. break;
  543. case KeyCode.Backspace:
  544. if ((Application.platform == RuntimePlatform.OSXEditor)
  545. && evt.commandKey)
  546. {
  547. DeleteUser();
  548. }
  549. break;
  550. case KeyCode.Delete:
  551. {
  552. DeleteUser();
  553. }
  554. break;
  555. }
  556. }
  557. private void OnUserItemChosen(IEnumerable<object> objs)
  558. {
  559. EditorApplication.delayCall += ActivateRenameUser;
  560. }
  561. private void LoadBrush(bool user, int idx)
  562. {
  563. if (user && isBrushPickFiltered)
  564. {
  565. idx = pickStore.GetIndexOfUserBrushFromFilteredIdx(idx);
  566. }
  567. GridPaintingState.SetPickOnActiveGridBrush(user, idx);
  568. if (!TilemapEditorTool.IsActive(typeof(PaintTool)))
  569. {
  570. foreach (var tilemapEditorTool in TilemapEditorTool.tilemapEditorTools)
  571. {
  572. if (tilemapEditorTool is not PaintTool)
  573. continue;
  574. ToolManager.SetActiveTool(tilemapEditorTool);
  575. break;
  576. }
  577. }
  578. if (hideOnPick)
  579. onBrushPickedInternal?.Invoke();
  580. }
  581. private void ActivateRenameUser()
  582. {
  583. TilePaletteBrushPickItemElement selectedItem = null;
  584. if (isShowGrid)
  585. {
  586. selectedItem = m_PersonalGridView.GetElementAt(m_PersonalGridView.selectedIndex) as TilePaletteBrushPickItemElement;
  587. }
  588. else
  589. {
  590. var ve = m_PersonalListView.GetRootElementForIndex(m_PersonalListView.selectedIndex);
  591. if (ve != null)
  592. selectedItem = ve.Q<TilePaletteBrushPickItemElement>();
  593. }
  594. if (selectedItem != null)
  595. selectedItem.ToggleRename();
  596. }
  597. private void RenameUser(int idx, string newName)
  598. {
  599. if (idx < 0 || idx >= pickStore.filteredUserSavedBrushes.Count)
  600. return;
  601. var brush = pickStore.filteredUserSavedBrushes[idx];
  602. if (brush.name == newName)
  603. return;
  604. brush.name = newName;
  605. if (isBrushPickFiltered)
  606. {
  607. idx = pickStore.GetIndexOfUserBrush(brush);
  608. }
  609. pickStore.SaveUserSavedBrush(idx, brush);
  610. }
  611. private void DeleteUser()
  612. {
  613. var isGridView = m_GridToggle.value;
  614. var idx = m_PersonalListView.selectedIndex;
  615. if (isGridView)
  616. idx = m_PersonalGridView.selectedIndex;
  617. if (isBrushPickFiltered)
  618. {
  619. idx = pickStore.GetIndexOfUserBrushFromFilteredIdx(idx);
  620. }
  621. if (pickStore.RemoveUserSavedBrush(idx))
  622. UpdatePick();
  623. }
  624. private void AddCurrent()
  625. {
  626. pickStore.AddNewUserSavedBrush(GridPaintingState.gridBrush);
  627. UpdatePick();
  628. var idx = pickStore.filteredUserSavedBrushes.Count - 1;
  629. m_PersonalListView.selectedIndex = idx;
  630. m_PersonalGridView.selectedIndex = idx;
  631. ScrollToSelectedDelayed(idx);
  632. if (isShowGrid)
  633. {
  634. var element = m_PersonalGridView.GetElementAt(idx);
  635. if (element != null)
  636. element.Focus();
  637. }
  638. else
  639. {
  640. var element = m_PersonalListView.GetRootElementForIndex(idx);
  641. if (element != null)
  642. element.Focus();
  643. }
  644. }
  645. private void ScrollToSelectedDelayed(int index)
  646. {
  647. if (index == -1)
  648. return;
  649. EditorApplication.delayCall += () =>
  650. {
  651. m_PersonalListView.ScrollToItem(index);
  652. m_PersonalGridView.ScrollToItem(index);
  653. };
  654. }
  655. }
  656. [EditorToolbarElement(k_ToolbarId)]
  657. internal sealed class TilePaletteBrushPickActiveBrushToggle : EditorToolbarToggle
  658. {
  659. internal const string k_ToolbarId = "Tile Palette/Tile Palette Brush Pick Filter";
  660. internal static readonly string k_ElementClass = "unity-tilepalette-brushpick-filter-toggle";
  661. private static readonly string k_ToolSettingsClass = "unity-tool-settings";
  662. private static readonly string k_IconPath = "Packages/com.unity.2d.tilemap/Editor/Icons/EditorUI.Filter.png";
  663. private static readonly string k_TooltipText = L10n.Tr("Filters Picks by Active Brush Type");
  664. public TilePaletteBrushPickActiveBrushToggle()
  665. {
  666. name = "Tile Palette Filter Pick";
  667. AddToClassList(k_ToolSettingsClass);
  668. AddToClassList(k_ElementClass);
  669. TilePaletteOverlayUtility.SetStyleSheet(this);
  670. icon = EditorGUIUtility.LoadIcon(k_IconPath);
  671. tooltip = k_TooltipText;
  672. }
  673. }
  674. [EditorToolbarElement(k_ToolbarId)]
  675. internal sealed class TilePaletteBrushPickSaveButton : EditorToolbarButton
  676. {
  677. internal const string k_ToolbarId = "Tile Palette/Tile Palette Brush Pick Save";
  678. internal static readonly string k_ElementClass = "unity-tilepalette-brushpick-save-button";
  679. private static readonly string k_ToolSettingsClass = "unity-tool-settings";
  680. private static readonly string k_TooltipText = L10n.Tr("Adds the current Brush as a new saved Pick");
  681. public TilePaletteBrushPickSaveButton()
  682. {
  683. name = "Tile Palette Save Pick";
  684. AddToClassList(k_ToolSettingsClass);
  685. AddToClassList(k_ElementClass);
  686. TilePaletteOverlayUtility.SetStyleSheet(this);
  687. icon = EditorGUIUtility.LoadIcon("SaveAs");
  688. tooltip = k_TooltipText;
  689. }
  690. }
  691. [EditorToolbarElement(k_ToolbarId)]
  692. internal sealed class TilePaletteHidePicksToggle : EditorToolbarToggle
  693. {
  694. internal const string k_ToolbarId = "Tile Palette/Tile Palette Hide Picks";
  695. private static readonly string k_ToolSettingsClass = "unity-tool-settings";
  696. private static readonly string k_ElementClass = "unity-tilepalette-element-hidepicks";
  697. private static readonly string k_IconPath =
  698. "Packages/com.unity.2d.tilemap/Editor/Icons/Tilemap.ShowTilePalette.png";
  699. private static readonly string k_TooltipFormatText =
  700. L10n.Tr("Hides Brush Picks on Pick. ( {0} ) to show/hide Brush Picks.");
  701. private static readonly string k_ShortcutId = "Grid Painting/Toggle SceneView BrushPick";
  702. public Action<bool> ToggleChanged;
  703. public TilePaletteHidePicksToggle()
  704. {
  705. name = "Tile Palette Hide Picks";
  706. AddToClassList(k_ToolSettingsClass);
  707. AddToClassList(k_ElementClass);
  708. TilePaletteOverlayUtility.SetStyleSheet(this);
  709. icon = EditorGUIUtility.LoadIcon(k_IconPath);
  710. RegisterCallback<AttachToPanelEvent>(OnAttachedToPanel);
  711. RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
  712. }
  713. private void OnAttachedToPanel(AttachToPanelEvent evt)
  714. {
  715. ShortcutIntegration.instance.profileManager.shortcutBindingChanged += OnShortcutBindingChanged;
  716. UpdateTooltip();
  717. }
  718. private void OnDetachFromPanel(DetachFromPanelEvent evt)
  719. {
  720. ShortcutIntegration.instance.profileManager.shortcutBindingChanged -= OnShortcutBindingChanged;
  721. }
  722. private void OnShortcutBindingChanged(IShortcutProfileManager arg1, Identifier arg2, ShortcutBinding arg3,
  723. ShortcutBinding arg4)
  724. {
  725. UpdateTooltip();
  726. }
  727. private void UpdateTooltip()
  728. {
  729. tooltip = String.Format(k_TooltipFormatText, ShortcutManager.instance.GetShortcutBinding(k_ShortcutId));
  730. }
  731. protected override void ToggleValue()
  732. {
  733. base.ToggleValue();
  734. ToggleChanged?.Invoke(value);
  735. }
  736. }
  737. }