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

SpriteSelectionWidget.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. namespace UnityEditor.U2D.Animation
  4. {
  5. internal class SpriteSelectorWidget
  6. {
  7. class Styles
  8. {
  9. public GUIStyle gridListStyle;
  10. public Styles()
  11. {
  12. gridListStyle = new GUIStyle("GridList");
  13. gridListStyle.alignment = GUI.skin.button.alignment;
  14. }
  15. }
  16. Sprite[] m_SpriteList = new Sprite[0];
  17. Texture2D[] m_SpritePreviews = new Texture2D[0];
  18. List<int> m_SpritePreviewNeedFetching = new List<int>();
  19. Vector2 m_ScrollPos;
  20. Styles m_Style;
  21. const int kTargetPreviewSize = 64;
  22. public SpriteSelectorWidget()
  23. {}
  24. public void UpdateContents(Sprite[] sprites)
  25. {
  26. var spriteCount = sprites.Length;
  27. m_SpriteList = sprites;
  28. m_SpritePreviews = new Texture2D[spriteCount];
  29. m_SpritePreviewNeedFetching.Clear();
  30. m_SpritePreviewNeedFetching.Capacity = spriteCount;
  31. for (var i = 0; i < spriteCount; ++i)
  32. m_SpritePreviewNeedFetching.Add(i);
  33. UpdateSpritePreviews();
  34. }
  35. public int ShowGUI(int selectedIndex)
  36. {
  37. if (m_Style == null)
  38. m_Style = new Styles();
  39. UpdateSpritePreviews();
  40. var drawRect = EditorGUILayout.GetControlRect(false, kTargetPreviewSize + 10f, new[] {GUILayout.ExpandWidth(true)});
  41. if(Event.current.type == EventType.Repaint)
  42. GUI.skin.box.Draw(drawRect, false, false, false, false);
  43. if (m_SpriteList == null || m_SpriteList.Length == 0)
  44. {
  45. return selectedIndex;
  46. }
  47. selectedIndex = (selectedIndex > m_SpriteList.Length) ? 0 : selectedIndex;
  48. float columnF;
  49. int columnCount, rowCount;
  50. GetRowColumnCount(drawRect.width - 20, kTargetPreviewSize, m_SpriteList.Length, out columnCount, out rowCount, out columnF);
  51. if (columnCount > 0 && rowCount > 0)
  52. {
  53. float contentSize = (columnF * kTargetPreviewSize) / columnCount;
  54. var gridRect = new Rect(drawRect.x, drawRect.y, drawRect.width - 20, rowCount * contentSize);
  55. m_ScrollPos = GUI.BeginScrollView(drawRect,m_ScrollPos, gridRect, false, false, GUIStyle.none, GUI.skin.verticalScrollbar);
  56. m_Style.gridListStyle.fixedWidth = contentSize;
  57. m_Style.gridListStyle.fixedHeight = contentSize;
  58. selectedIndex = GUI.SelectionGrid( gridRect, selectedIndex, m_SpritePreviews, columnCount, m_Style.gridListStyle);
  59. GUI.EndScrollView();
  60. }
  61. return selectedIndex;
  62. }
  63. static void GetRowColumnCount(float drawWidth, int size, int contentCount, out int column, out int row, out float columnf)
  64. {
  65. columnf = drawWidth / size;
  66. column = (int)Mathf.Floor(columnf);
  67. if (column == 0)
  68. row = 0;
  69. else
  70. row = (int)Mathf.Ceil((contentCount + column) / column);
  71. }
  72. public bool NeedUpdatePreview()
  73. {
  74. return m_SpritePreviewNeedFetching.Count > 0;
  75. }
  76. void UpdateSpritePreviews()
  77. {
  78. for (int i = 0; i < m_SpritePreviewNeedFetching.Count; ++i)
  79. {
  80. var index = m_SpritePreviewNeedFetching[i];
  81. if(m_SpriteList[index] == null)
  82. m_SpritePreviews[index] = EditorGUIUtility.Load("icons/console.warnicon.png") as Texture2D;
  83. else
  84. m_SpritePreviews[index] = AssetPreview.GetAssetPreview(m_SpriteList[index]);
  85. if (m_SpritePreviews[index] != null)
  86. {
  87. m_SpritePreviewNeedFetching.RemoveAt(i);
  88. --i;
  89. }
  90. }
  91. }
  92. }
  93. }