824 lines
28 KiB
C#
824 lines
28 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace RapidIcon_1_7_2
|
|
{
|
|
//---ObjectPathPair Definition---//
|
|
public struct ObjectPathPair
|
|
{
|
|
public ObjectPathPair(UnityEngine.Object obj, string pth)
|
|
{
|
|
UnityEngine_object = obj;
|
|
path = pth;
|
|
}
|
|
|
|
public UnityEngine.Object UnityEngine_object;
|
|
public string path;
|
|
};
|
|
|
|
[Serializable]
|
|
public class AssetGrid
|
|
{
|
|
//---PUBLIC---//
|
|
//Icons
|
|
public Dictionary<UnityEngine.Object, IconSet> objectIconSets;
|
|
public Dictionary<string, IconSet> sortedIconSetsByPath;
|
|
public List<IconSet> visibleIconSets;
|
|
public List<IconSet> selectedIconSets;
|
|
|
|
//Textures
|
|
public Texture2D[] assetSelectionTextures;
|
|
|
|
//Other
|
|
public string rapidIconRootFolder;
|
|
public bool assetGridFocused;
|
|
public int previewSize;
|
|
|
|
//---INTERNAL---//
|
|
//GUI
|
|
Vector2 scrollPosition;
|
|
GUIStyle gridStyle, gridLabelStyle;
|
|
|
|
//Selection
|
|
int lastSelectedIconIndex;
|
|
int selectionMinIndex;
|
|
int selectionMaxIndex;
|
|
string lastSelectedIndividualFolder;
|
|
List<ObjectPathPair> objectsLoadedFromSelectedFolders;
|
|
|
|
//RapidIcon Window Elements
|
|
RapidIconWindow window;
|
|
AssetList assetList;
|
|
|
|
//Filter
|
|
int filterIdx;
|
|
string[] filters = new string[] { "t:model t:prefab", "t:prefab", "t:model" };
|
|
string[] filterNames = new string[] { "Prefabs & Models", "Prefabs Only", "Models Only" };
|
|
|
|
//Other
|
|
Rect rect;
|
|
bool iconsRefreshed;
|
|
|
|
public AssetGrid(AssetList assets)
|
|
{
|
|
//---Initialise AssetGrid---//
|
|
//Asset List
|
|
assetList = assets;
|
|
|
|
//Selection
|
|
objectsLoadedFromSelectedFolders = new List<ObjectPathPair>();
|
|
lastSelectedIconIndex = -1;
|
|
selectionMinIndex = int.MaxValue;
|
|
selectionMaxIndex = -1;
|
|
|
|
//Icons
|
|
objectIconSets = new Dictionary<UnityEngine.Object, IconSet>();
|
|
sortedIconSetsByPath = new Dictionary<string, IconSet>();
|
|
selectedIconSets = new List<IconSet>();
|
|
|
|
//Styles
|
|
previewSize = 128;
|
|
gridStyle = new GUIStyle();
|
|
gridStyle.fixedHeight = previewSize;
|
|
gridStyle.fixedWidth = previewSize;
|
|
gridStyle.margin.bottom = 16 + (int)EditorGUIUtility.singleLineHeight + 2;
|
|
gridStyle.margin.left = 16;
|
|
gridStyle.alignment = TextAnchor.MiddleCenter;
|
|
gridLabelStyle = new GUIStyle(gridStyle);
|
|
gridLabelStyle.margin.bottom = 16 + previewSize + 2;
|
|
gridLabelStyle.fixedHeight = EditorGUIUtility.singleLineHeight;
|
|
gridLabelStyle.alignment = TextAnchor.MiddleCenter;
|
|
if (EditorGUIUtility.isProSkin)
|
|
gridLabelStyle.normal.textColor = new Color32(192, 192, 192, 255);
|
|
else
|
|
gridLabelStyle.normal.textColor = Color.black;
|
|
|
|
//Filter
|
|
filterIdx = 0;
|
|
|
|
//Textures
|
|
assetSelectionTextures = new Texture2D[5];
|
|
|
|
string[] split = AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("RapidIconWindow")[0]).Split('/');
|
|
rapidIconRootFolder = "";
|
|
for (int i = 0; i < split.Length - 4; i++)
|
|
rapidIconRootFolder += split[i] + "/";
|
|
|
|
assetSelectionTextures[0] = (Texture2D)AssetDatabase.LoadMainAssetAtPath(rapidIconRootFolder + "Editor/UI/deselectedAsset.png");
|
|
assetSelectionTextures[1] = (Texture2D)AssetDatabase.LoadMainAssetAtPath(rapidIconRootFolder + "Editor/UI/selectedAssetActiveDark.png");
|
|
assetSelectionTextures[2] = (Texture2D)AssetDatabase.LoadMainAssetAtPath(rapidIconRootFolder + "Editor/UI/selectedAssetInactiveDark.png");
|
|
assetSelectionTextures[3] = (Texture2D)AssetDatabase.LoadMainAssetAtPath(rapidIconRootFolder + "Editor/UI/selectedAssetActiveLight.png");
|
|
assetSelectionTextures[4] = (Texture2D)AssetDatabase.LoadMainAssetAtPath(rapidIconRootFolder + "Editor/UI/selectedAssetInactiveLight.png");
|
|
assetSelectionTextures[0].hideFlags = HideFlags.DontSave;
|
|
assetSelectionTextures[1].hideFlags = HideFlags.DontSave;
|
|
assetSelectionTextures[2].hideFlags = HideFlags.DontSave;
|
|
assetList.lastNumberOfSelected = -1;
|
|
|
|
//Other
|
|
iconsRefreshed = true;
|
|
}
|
|
|
|
public void Draw(float width, RapidIconWindow w)
|
|
{
|
|
//---Check variables are set---//
|
|
CheckAndSetWindow(w);
|
|
|
|
//---Refresh icons after startup---//
|
|
if (!iconsRefreshed && EditorApplication.timeSinceStartup > 15)
|
|
{
|
|
RefreshAllIcons();
|
|
iconsRefreshed = true;
|
|
}
|
|
|
|
GUILayout.BeginVertical(GUILayout.Width(width));
|
|
GUILayout.Space(4);
|
|
|
|
//---Filter---//
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Space(8);
|
|
if (GUILayout.Button("Refresh"))
|
|
ReloadObjects();
|
|
if (GUILayout.Button("Filter: " + filterNames[filterIdx]))
|
|
{
|
|
filterIdx++;
|
|
if (filterIdx == 3)
|
|
filterIdx = 0;
|
|
|
|
ReloadObjects();
|
|
}
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndHorizontal();
|
|
|
|
//---Scroll view----//
|
|
scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false, GUIStyle.none, GUI.skin.verticalScrollbar);
|
|
|
|
//---Draw icons---//
|
|
DrawIcons(width);
|
|
|
|
//---End GUI elements---//
|
|
GUILayout.EndScrollView();
|
|
GUILayout.EndVertical();
|
|
|
|
//---Get last rect and check focus---//
|
|
if (Event.current.type == EventType.Repaint)
|
|
rect = new Rect(GUILayoutUtility.GetLastRect());
|
|
CheckFocus(rect);
|
|
}
|
|
|
|
public void SaveData()
|
|
{
|
|
//---Save selected assets---//
|
|
string selectedAssetsString = "";
|
|
foreach (KeyValuePair<UnityEngine.Object, IconSet> iconSet in objectIconSets)
|
|
{
|
|
selectedAssetsString += "|-A-|" + iconSet.Value.assetPath + "|-S-|" + iconSet.Value.selected;
|
|
}
|
|
EditorPrefs.SetString(PlayerSettings.productName + "RapidIconSelectedAssets", selectedAssetsString);
|
|
|
|
//---Save other variables---//
|
|
EditorPrefs.SetFloat(PlayerSettings.productName + "RapidIconAssetGridScroll", scrollPosition.y);
|
|
EditorPrefs.SetBool(PlayerSettings.productName + "RapidIconIconsRefreshed", iconsRefreshed);
|
|
EditorPrefs.SetInt(PlayerSettings.productName + "RapidIconFilterIdx", filterIdx);
|
|
}
|
|
|
|
public void LoadData()
|
|
{
|
|
//---Close RapidIcon window if left open when Unity starts---//
|
|
if (!SessionState.GetBool("rapidicon_loaded", false))
|
|
{
|
|
SessionState.SetBool("rapidicon_forceclose", true);
|
|
SessionState.SetBool("rapidicon_loaded", true);
|
|
return;
|
|
}
|
|
|
|
//---Load objects in selected folders---//
|
|
objectsLoadedFromSelectedFolders = LoadObjectsInSelectedFolders();
|
|
CreateIconSets();
|
|
|
|
//---Load selected assets---//
|
|
string selectedAssetsString = EditorPrefs.GetString(PlayerSettings.productName + "RapidIconSelectedAssets");
|
|
string[] splitAssets = selectedAssetsString.Split(new string[] { "|-A-|" }, StringSplitOptions.RemoveEmptyEntries);
|
|
foreach (string s in splitAssets)
|
|
{
|
|
string[] splitS = s.Split(new string[] { "|-S-|" }, StringSplitOptions.RemoveEmptyEntries);
|
|
string assetPath = splitS[0];
|
|
if (splitS[1] == "True")
|
|
{
|
|
IconSet iconSet = GetIconSetFromPath(assetPath);
|
|
if (iconSet != null)
|
|
{
|
|
iconSet.selected = true;
|
|
selectedIconSets.Add(GetIconSetFromPath(assetPath));
|
|
}
|
|
}
|
|
}
|
|
|
|
//---Load other variables---//
|
|
iconsRefreshed = EditorPrefs.GetBool(PlayerSettings.productName + "RapidIconIconsRefreshed");
|
|
scrollPosition = new Vector2(0, EditorPrefs.GetFloat(PlayerSettings.productName + "RapidIconAssetGridScroll"));
|
|
filterIdx = EditorPrefs.GetInt(PlayerSettings.productName + "RapidIconFilterIdx", 0);
|
|
}
|
|
|
|
void ReloadObjects()
|
|
{
|
|
//---Unload objects
|
|
EditorUtility.UnloadUnusedAssetsImmediate();
|
|
|
|
//---Reload the objects from selected folders---//
|
|
objectsLoadedFromSelectedFolders = LoadObjectsInSelectedFolders();
|
|
CreateIconSets();
|
|
|
|
//---Add loaded icons to list---///
|
|
sortedIconSetsByPath.Clear();
|
|
foreach (ObjectPathPair loadedObject in objectsLoadedFromSelectedFolders)
|
|
{
|
|
IconSet iconSet = objectIconSets[loadedObject.UnityEngine_object];
|
|
sortedIconSetsByPath.Add(iconSet.assetPath, iconSet);
|
|
}
|
|
|
|
//---Sort the list by path---//
|
|
sortedIconSetsByPath = SortIconSetsByFolder(sortedIconSetsByPath);
|
|
|
|
//---Update variables---//
|
|
assetList.lastNumberOfSelected = assetList.selectedFolders.Count;
|
|
lastSelectedIndividualFolder = assetList.selectedFolders[0];
|
|
}
|
|
|
|
public void RefreshAllIcons()
|
|
{
|
|
//---Loop through all icons---//
|
|
int index = 1;
|
|
foreach (IconSet iconSet in objectIconSets.Values)
|
|
{
|
|
//---Show a progress bar---//
|
|
EditorUtility.DisplayProgressBar("Updating Icons (" + index++ + "/" + objectIconSets.Count + ")", iconSet.assetPath, (float)(index) / (float)(objectIconSets.Count));
|
|
|
|
//---Update the icon renders---//
|
|
Vector2Int renderResolution = Utils.MutiplyVector2IntByFloat(iconSet.GetCurrentIcon().iconSettings.exportResolution, window.iconEditor.resMultiplyers[window.iconEditor.resMultiplyerIndex]);
|
|
iconSet.GetCurrentIcon().UpdateIcon(renderResolution, new Vector2Int(128, (int)(((float)renderResolution.y / (float)renderResolution.x) * 128)));
|
|
}
|
|
|
|
//---Clear the progress bar when done---//
|
|
EditorUtility.ClearProgressBar();
|
|
}
|
|
|
|
void CheckAndSetWindow(RapidIconWindow w)
|
|
{
|
|
if (!window)
|
|
window = w;
|
|
}
|
|
|
|
List<ObjectPathPair> LoadObjectsInSelectedFolders()
|
|
{
|
|
//---Get asset paths of all assets in selected folders---//
|
|
string[] assetGUIDs = AssetDatabase.FindAssets(filters[filterIdx], assetList.selectedFolders.ToArray());
|
|
string[] assetPaths = new string[assetGUIDs.Length];
|
|
for (int i = 0; i < assetGUIDs.Length; i++)
|
|
assetPaths[i] = AssetDatabase.GUIDToAssetPath(assetGUIDs[i]);
|
|
|
|
List<ObjectPathPair> loadedObjectPathPairs = new List<ObjectPathPair>();
|
|
foreach (string assetPath in assetPaths)
|
|
{
|
|
//---Get folder path from each of the asset paths---//
|
|
string[] split = assetPath.Split('/');
|
|
string folderPath = "";
|
|
for (int i = 0; i < split.Length - 1; i++)
|
|
folderPath += split[i] + (i < split.Length - 2 ? "/" : "");
|
|
|
|
//---Load the asset if the path is in the selected folders list---//
|
|
if (assetList.selectedFolders.Contains(folderPath))
|
|
{
|
|
ObjectPathPair objectPathPair = new ObjectPathPair();
|
|
|
|
UnityEngine.Object o = AssetDatabase.LoadMainAssetAtPath(assetPath);
|
|
objectPathPair.UnityEngine_object = o;
|
|
objectPathPair.path = assetPath;
|
|
loadedObjectPathPairs.Add(objectPathPair);
|
|
}
|
|
}
|
|
return loadedObjectPathPairs;
|
|
}
|
|
|
|
void CreateIconSets()
|
|
{
|
|
int index = 1;
|
|
foreach (ObjectPathPair loadedObject in objectsLoadedFromSelectedFolders)
|
|
{
|
|
if (!objectIconSets.ContainsKey(loadedObject.UnityEngine_object))
|
|
{
|
|
//---Create icon if doesn't already exist---//
|
|
EditorUtility.DisplayProgressBar("Generating Icon Previews (" + index + " / " + (objectsLoadedFromSelectedFolders.Count) + ")", loadedObject.path, (float)(index++) / (float)objectsLoadedFromSelectedFolders.Count);
|
|
objectIconSets.Add(loadedObject.UnityEngine_object, CreateIconSet(loadedObject));
|
|
}
|
|
else if (objectIconSets[loadedObject.UnityEngine_object].deleted)
|
|
{
|
|
objectIconSets[loadedObject.UnityEngine_object].deleted = false;
|
|
}
|
|
else
|
|
{
|
|
//---Update asset path if changed---//
|
|
IconSet iconSet = objectIconSets[loadedObject.UnityEngine_object];
|
|
|
|
string currentPath = AssetDatabase.GetAssetPath(loadedObject.UnityEngine_object);
|
|
string savedPath = iconSet.assetPath;
|
|
if (savedPath != currentPath)
|
|
{
|
|
Debug.LogWarning("Path updated for " + iconSet.assetName + " from " + savedPath + " to " + currentPath);
|
|
iconSet.assetPath = currentPath;
|
|
|
|
string[] split;
|
|
split = iconSet.assetPath.Split('/');
|
|
iconSet.assetName = split[split.Length - 1];
|
|
if (iconSet.assetName.Length > 19)
|
|
iconSet.assetShortenedName = iconSet.assetName.Substring(0, 16) + "...";
|
|
else
|
|
iconSet.assetShortenedName = iconSet.assetName;
|
|
|
|
split = iconSet.assetPath.Split('/');
|
|
iconSet.folderPath = "";
|
|
for (int i = 0; i < split.Length - 1; i++)
|
|
iconSet.folderPath += split[i] + (i < split.Length - 2 ? "/" : "");
|
|
}
|
|
}
|
|
}
|
|
EditorUtility.ClearProgressBar();
|
|
}
|
|
|
|
public IconSet CreateIconSet(ObjectPathPair objectPathPair)
|
|
{
|
|
//---Create a new icon set and icon objects---//
|
|
IconSet iconSet = new IconSet(this, objectPathPair);
|
|
return iconSet;
|
|
}
|
|
|
|
void DrawIcons(float gridWidth)
|
|
{
|
|
//---Draw margin---//
|
|
GUILayout.Space(14);
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Space(16);
|
|
|
|
//---Create lists---//
|
|
List<Texture2D> visibleIconRenders = new List<Texture2D>();
|
|
List<Texture2D> visibleIconSelectionTextures = new List<Texture2D>();
|
|
List<string> visibleIconLabels = new List<string>();
|
|
visibleIconSets = new List<IconSet>();
|
|
|
|
//---Reload objects if needed---//
|
|
if (sortedIconSetsByPath.Count != objectsLoadedFromSelectedFolders.Count || assetList.selectedFolders.Count != assetList.lastNumberOfSelected || assetList.selectedFolders[0] != lastSelectedIndividualFolder)
|
|
{
|
|
ReloadObjects();
|
|
}
|
|
|
|
//---Deselect icons if no longer in selected folders / search (i.e. if not visible in the grid)---//
|
|
foreach (IconSet iconSet in objectIconSets.Values)
|
|
{
|
|
if (!assetList.selectedFolders.Contains(iconSet.folderPath) || (assetList.doSearch && !assetList.searchFolders.Contains(iconSet.folderPath + "/" + iconSet.assetName)))
|
|
{
|
|
iconSet.selected = false;
|
|
if (selectedIconSets.Contains(iconSet))
|
|
selectedIconSets.Remove(iconSet);
|
|
}
|
|
}
|
|
|
|
int index = 0;
|
|
foreach (KeyValuePair<string, IconSet> iconSet in sortedIconSetsByPath)
|
|
{
|
|
//---Skip this icon if it's flagged as deleted---//
|
|
if (iconSet.Value.deleted)
|
|
continue;
|
|
|
|
//---Flag the icon as deleted if asset object is null---//
|
|
else if (iconSet.Value.assetObject == null)
|
|
{
|
|
iconSet.Value.deleted = true;
|
|
iconSet.Value.assetObject = null;
|
|
selectedIconSets.Remove(iconSet.Value);
|
|
continue;
|
|
}
|
|
|
|
//---Render the icon preview if it is missing---//
|
|
if (iconSet.Value.GetCurrentIcon().previewRender == null)
|
|
{
|
|
EditorUtility.DisplayProgressBar("Generating Icon Previews (" + index + "/" + (sortedIconSetsByPath.Count) + ")", iconSet.Value.assetPath, ((float)index++ / sortedIconSetsByPath.Count));
|
|
iconSet.Value.GetCurrentIcon().previewRender = Utils.RenderIcon(iconSet.Value.GetCurrentIcon(), previewSize, (int)(((float)iconSet.Value.GetCurrentIcon().iconSettings.exportResolution.y / (float)iconSet.Value.GetCurrentIcon().iconSettings.exportResolution.x) * previewSize));
|
|
}
|
|
|
|
//---Set the selection texture---//
|
|
if (EditorGUIUtility.isProSkin)
|
|
iconSet.Value.selectionTexture = iconSet.Value.selected ? (assetGridFocused ? assetSelectionTextures[1] : assetSelectionTextures[2]) : assetSelectionTextures[0];
|
|
else
|
|
iconSet.Value.selectionTexture = iconSet.Value.selected ? (assetGridFocused ? assetSelectionTextures[3] : assetSelectionTextures[4]) : assetSelectionTextures[0];
|
|
|
|
//---Add the icon to visibleIcons if it's within the selected folders, or the search---//
|
|
if (assetList.selectedFolders.Contains(iconSet.Value.folderPath) && (!assetList.doSearch || assetList.searchFolders.Contains(iconSet.Value.folderPath + "/" + iconSet.Value.assetName)))
|
|
{
|
|
visibleIconSets.Add(iconSet.Value);
|
|
|
|
//Use warning image if animations enabled
|
|
visibleIconRenders.Add(iconSet.Value.GetCurrentIcon().previewRender);
|
|
|
|
visibleIconSelectionTextures.Add(iconSet.Value.selectionTexture);
|
|
visibleIconLabels.Add(iconSet.Value.assetShortenedName);
|
|
}
|
|
}
|
|
EditorUtility.ClearProgressBar();
|
|
|
|
//---Draw the grid of icons---///
|
|
int count = Mathf.FloorToInt((gridWidth - 16) / (previewSize + 16));
|
|
count = Mathf.Min(count, visibleIconSets.Count);
|
|
int clicked = GUILayout.SelectionGrid(-1, visibleIconRenders.ToArray(), count, gridStyle, GUILayout.Width(32 + count * (previewSize + 16)));
|
|
Rect r = GUILayoutUtility.GetLastRect();
|
|
r.y += previewSize + 2;
|
|
|
|
//---Draw the label background textures on the grid---//
|
|
int labelClicked = GUI.SelectionGrid(r, -1, visibleIconSelectionTextures.ToArray(), count, gridLabelStyle);
|
|
|
|
//---Draw the label texts on the grid---//
|
|
clicked = GUI.SelectionGrid(r, clicked, visibleIconLabels.ToArray(), count, gridLabelStyle);
|
|
if (clicked == -1 && labelClicked != -1)
|
|
clicked = labelClicked;
|
|
|
|
//---Draw margin and end GUI elements---//
|
|
GUILayout.Space(16);
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndHorizontal();
|
|
|
|
//---Check mouse clicks and arrow key presses for grid selection---//
|
|
CheckMouseClicks(clicked, visibleIconSets);
|
|
CheckArrowKeys(visibleIconSets, count);
|
|
}
|
|
|
|
void CheckMouseClicks(int clicked, List<IconSet> visibleIconSets)
|
|
{
|
|
if (clicked >= 0)
|
|
{
|
|
if (!Event.current.control && !Event.current.shift)
|
|
{
|
|
//---Regular click, no ctrl/shift - select the icon---//
|
|
foreach (KeyValuePair<UnityEngine.Object, IconSet> iconSet in objectIconSets)
|
|
iconSet.Value.selected = false;
|
|
|
|
visibleIconSets[clicked].selected = true;
|
|
visibleIconSets[clicked].assetGridIconIndex = clicked;
|
|
selectedIconSets.Clear();
|
|
selectionMinIndex = clicked;
|
|
selectionMaxIndex = clicked;
|
|
}
|
|
else if (Event.current.control)
|
|
{
|
|
//---Ctrl click - add icon to existing selection---//
|
|
visibleIconSets[clicked].selected = !visibleIconSets[clicked].selected;
|
|
visibleIconSets[clicked].assetGridIconIndex = clicked;
|
|
}
|
|
else if (Event.current.shift)
|
|
{
|
|
//---Shift click - add all icons between clicks---//
|
|
if (selectionMinIndex != -1 && selectionMaxIndex != -1 && clicked >= selectionMinIndex && clicked <= selectionMaxIndex)
|
|
{
|
|
for (int i = selectionMinIndex; i <= selectionMaxIndex; i++)
|
|
{
|
|
visibleIconSets[i].selected = false;
|
|
if (selectedIconSets.Contains(visibleIconSets[i]))
|
|
selectedIconSets.Remove(visibleIconSets[i]);
|
|
}
|
|
|
|
selectionMinIndex = Mathf.Min(lastSelectedIconIndex, clicked);
|
|
selectionMaxIndex = Math.Max(lastSelectedIconIndex, clicked);
|
|
}
|
|
int minI = Mathf.Min(lastSelectedIconIndex, clicked);
|
|
int maxI = Math.Max(lastSelectedIconIndex, clicked);
|
|
if (minI < 0) minI = 0;
|
|
if (maxI < 0) maxI = 0;
|
|
|
|
for (int i = minI; i <= maxI; i++)
|
|
{
|
|
visibleIconSets[i].selected = true;
|
|
visibleIconSets[i].assetGridIconIndex = i;
|
|
if (!selectedIconSets.Contains(visibleIconSets[i]))
|
|
selectedIconSets.Add(visibleIconSets[i]);
|
|
}
|
|
|
|
}
|
|
|
|
//---If not shift click then toggle the icon from the selection---//
|
|
if (!Event.current.shift)
|
|
{
|
|
if (visibleIconSets[clicked].selected && !selectedIconSets.Contains(visibleIconSets[clicked]))
|
|
selectedIconSets.Add(visibleIconSets[clicked]);
|
|
else if (selectedIconSets.Contains(visibleIconSets[clicked]))
|
|
selectedIconSets.Remove(visibleIconSets[clicked]);
|
|
}
|
|
|
|
//---Sort the selected icons by grid index---//
|
|
if (selectedIconSets.Count > 1)
|
|
selectedIconSets = selectedIconSets.OrderBy(a => a.assetGridIconIndex).ToList();
|
|
|
|
//---Update variables---//
|
|
selectionMinIndex = Mathf.Min(selectionMinIndex, clicked);
|
|
selectionMaxIndex = Mathf.Max(selectionMaxIndex, clicked);
|
|
lastSelectedIconIndex = clicked;
|
|
assetGridFocused = true;
|
|
window.Repaint();
|
|
}
|
|
else if (Event.current.rawType == EventType.MouseDown && !window.leftSeparator.mouseOver && !window.rightSeparator.mouseOver)
|
|
{
|
|
//---Clear selection if mouse clicked in empty space in asset grid region---//
|
|
Vector2 correctMousePos = Event.current.mousePosition + rect.position;
|
|
if (rect.Contains(correctMousePos))
|
|
{
|
|
selectedIconSets.Clear();
|
|
foreach (IconSet iconSet in visibleIconSets)
|
|
iconSet.selected = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CheckArrowKeys(List<IconSet> iconSets, int gridXIcons)
|
|
{
|
|
//---Check if a key is pressed---//
|
|
if (assetGridFocused && Event.current.isKey && Event.current.type != EventType.KeyUp)
|
|
{
|
|
//---Right arrow key pressed---//
|
|
if (Event.current.keyCode == KeyCode.RightArrow && lastSelectedIconIndex < iconSets.Count - 1)
|
|
{
|
|
if (!Event.current.shift && !Event.current.control)
|
|
{
|
|
//---Select only this icon if no shift/ctrl pressed---//
|
|
foreach (IconSet iconSet in iconSets)
|
|
iconSet.selected = false;
|
|
selectedIconSets.Clear();
|
|
|
|
iconSets[lastSelectedIconIndex + 1].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex + 1]);
|
|
}
|
|
else
|
|
{
|
|
//---Add to current selection if shift/ctrl pressed---///
|
|
if (!iconSets[lastSelectedIconIndex + 1].selected)
|
|
{
|
|
iconSets[lastSelectedIconIndex + 1].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex + 1]);
|
|
}
|
|
else
|
|
{
|
|
iconSets[lastSelectedIconIndex].selected = false;
|
|
selectedIconSets.Remove(iconSets[lastSelectedIconIndex]);
|
|
}
|
|
|
|
}
|
|
lastSelectedIconIndex++;
|
|
}
|
|
//---Left arrow key pressed---//
|
|
else if (Event.current.keyCode == KeyCode.LeftArrow && lastSelectedIconIndex > 0)
|
|
{
|
|
if (!Event.current.shift && !Event.current.control)
|
|
{
|
|
//---Select only this icon if no shift/ctrl pressed---//
|
|
foreach (IconSet iconSet in iconSets)
|
|
iconSet.selected = false;
|
|
selectedIconSets.Clear();
|
|
|
|
iconSets[lastSelectedIconIndex - 1].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex - 1]);
|
|
}
|
|
else
|
|
{
|
|
//---Add to current selection if shift/ctrl pressed---///
|
|
if (!iconSets[lastSelectedIconIndex - 1].selected)
|
|
{
|
|
iconSets[lastSelectedIconIndex - 1].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex - 1]);
|
|
}
|
|
else
|
|
{
|
|
iconSets[lastSelectedIconIndex].selected = false;
|
|
selectedIconSets.Remove(iconSets[lastSelectedIconIndex]);
|
|
}
|
|
}
|
|
lastSelectedIconIndex--;
|
|
}
|
|
//---Down arrow key pressed---//
|
|
else if (Event.current.keyCode == KeyCode.DownArrow)
|
|
{
|
|
if (lastSelectedIconIndex < iconSets.Count - gridXIcons)
|
|
{
|
|
if (!Event.current.shift && !Event.current.control)
|
|
{
|
|
//---Select only this icon if no shift/ctrl pressed---//
|
|
foreach (IconSet iconSet in iconSets)
|
|
iconSet.selected = false;
|
|
selectedIconSets.Clear();
|
|
|
|
iconSets[lastSelectedIconIndex + gridXIcons].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex + gridXIcons]);
|
|
}
|
|
else
|
|
{
|
|
//---Add to current selection if shift/ctrl pressed---///
|
|
if (!iconSets[lastSelectedIconIndex + gridXIcons].selected)
|
|
{
|
|
iconSets[lastSelectedIconIndex + gridXIcons].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex + gridXIcons]);
|
|
for (int i = lastSelectedIconIndex; i < lastSelectedIconIndex + gridXIcons; i++)
|
|
{
|
|
iconSets[i].selected = true;
|
|
selectedIconSets.Add(iconSets[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iconSets[lastSelectedIconIndex].selected = false;
|
|
selectedIconSets.Remove(iconSets[lastSelectedIconIndex]);
|
|
for (int i = lastSelectedIconIndex; i < lastSelectedIconIndex + gridXIcons; i++)
|
|
{
|
|
iconSets[i].selected = false;
|
|
selectedIconSets.Remove(iconSets[i]);
|
|
}
|
|
}
|
|
|
|
}
|
|
lastSelectedIconIndex += gridXIcons;
|
|
}
|
|
else if (lastSelectedIconIndex < Mathf.Floor((float)iconSets.Count / gridXIcons) * gridXIcons)
|
|
{
|
|
if (!Event.current.shift && !Event.current.control)
|
|
{
|
|
//---Select only this icon if no shift/ctrl pressed---//
|
|
foreach (IconSet iconSet in iconSets)
|
|
iconSet.selected = false;
|
|
selectedIconSets.Clear();
|
|
|
|
iconSets[iconSets.Count - 1].selected = true;
|
|
selectedIconSets.Add(iconSets[iconSets.Count - 1]);
|
|
}
|
|
else
|
|
{
|
|
//---Add to current selection if shift/ctrl pressed---///
|
|
if (!iconSets[iconSets.Count - 1].selected)
|
|
{
|
|
iconSets[iconSets.Count - 1].selected = true;
|
|
selectedIconSets.Add(iconSets[iconSets.Count - 1]);
|
|
for (int i = lastSelectedIconIndex; i < iconSets.Count; i++)
|
|
{
|
|
iconSets[i].selected = true;
|
|
selectedIconSets.Add(iconSets[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iconSets[lastSelectedIconIndex].selected = false;
|
|
selectedIconSets.Remove(iconSets[lastSelectedIconIndex]);
|
|
for (int i = lastSelectedIconIndex; i < iconSets.Count - 1; i++)
|
|
{
|
|
iconSets[i].selected = false;
|
|
selectedIconSets.Remove(iconSets[i]);
|
|
}
|
|
}
|
|
|
|
}
|
|
lastSelectedIconIndex = iconSets.Count - 1;
|
|
}
|
|
}
|
|
//---Up arrow key pressed---//
|
|
else if (Event.current.keyCode == KeyCode.UpArrow && lastSelectedIconIndex >= gridXIcons)
|
|
{
|
|
if (!Event.current.shift && !Event.current.control)
|
|
{
|
|
//---Select only this icon if no shift/ctrl pressed---//
|
|
foreach (IconSet iconSet in iconSets)
|
|
iconSet.selected = false;
|
|
selectedIconSets.Clear();
|
|
|
|
iconSets[lastSelectedIconIndex - gridXIcons].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex - gridXIcons]);
|
|
}
|
|
else
|
|
{
|
|
//---Add to current selection if shift/ctrl pressed---///
|
|
if (!iconSets[lastSelectedIconIndex - gridXIcons].selected)
|
|
{
|
|
iconSets[lastSelectedIconIndex - gridXIcons].selected = true;
|
|
selectedIconSets.Add(iconSets[lastSelectedIconIndex - gridXIcons]);
|
|
for (int i = lastSelectedIconIndex; i > lastSelectedIconIndex - gridXIcons; i--)
|
|
{
|
|
iconSets[i].selected = true;
|
|
selectedIconSets.Add(iconSets[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iconSets[lastSelectedIconIndex].selected = false;
|
|
selectedIconSets.Remove(iconSets[lastSelectedIconIndex]);
|
|
for (int i = lastSelectedIconIndex; i > lastSelectedIconIndex - gridXIcons; i--)
|
|
{
|
|
iconSets[i].selected = false;
|
|
selectedIconSets.Remove(iconSets[i]);
|
|
}
|
|
}
|
|
|
|
}
|
|
lastSelectedIconIndex -= gridXIcons;
|
|
}
|
|
else if (Event.current.keyCode == KeyCode.A && Event.current.modifiers == EventModifiers.Control)
|
|
{
|
|
//---Select all if ctrl-A pressed---//
|
|
selectedIconSets.Clear();
|
|
foreach (KeyValuePair<string, IconSet> iconSet in sortedIconSetsByPath)
|
|
{
|
|
if (assetList.selectedFolders.Contains(iconSet.Value.folderPath))
|
|
{
|
|
iconSet.Value.selected = true;
|
|
selectedIconSets.Add(iconSet.Value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Dictionary<string, IconSet> SortIconSetsByFolder(Dictionary<string, IconSet> data)
|
|
{
|
|
//---Get a string array of asset paths---//
|
|
string[] assetPaths = new string[data.Keys.Count];
|
|
data.Keys.CopyTo(assetPaths, 0);
|
|
|
|
//---Create a dictionary that will hold folder paths as keys, and a list of asset paths in the values (assets within the folder)---//
|
|
Dictionary<string, List<string>> folders = new Dictionary<string, List<string>>();
|
|
|
|
//---Create a list for just the folder names---//
|
|
List<string> folderNames = new List<string>();
|
|
|
|
foreach (string assetPath in assetPaths)
|
|
{
|
|
//---Get folder path from asset path---//
|
|
string[] split = assetPath.Split('/');
|
|
string folderPath = "";
|
|
for (int i = 0; i < split.Length - 1; i++)
|
|
folderPath += split[i] + (i < split.Length - 2 ? "/" : "");
|
|
|
|
//---Add folder to folders dictionary if not already in there---//
|
|
if (!folders.ContainsKey(folderPath))
|
|
{
|
|
folders.Add(folderPath, new List<string>());
|
|
folderNames.Add(folderPath);
|
|
}
|
|
|
|
//---Add asset path in the list at the [folderPath] index of the folders dictionary---//
|
|
folders[folderPath].Add(assetPath);
|
|
}
|
|
|
|
//---Sort the folder names---//
|
|
folderNames.Sort();
|
|
|
|
//---For each of the sorted folders, sort the assets within that folder---//
|
|
string[] sortedAssetPaths = new string[assetPaths.Length];
|
|
int index = 0;
|
|
foreach (string folder in folderNames)
|
|
{
|
|
folders[folder].Sort();
|
|
foreach (string assetPath in folders[folder])
|
|
{
|
|
//---Add the asset paths to the new list in sorted order---//
|
|
sortedAssetPaths[index++] = assetPath;
|
|
}
|
|
}
|
|
|
|
//---Use the sorted list of asset paths to create a dictionary of sorted icons---//
|
|
Dictionary<string, IconSet> sortedData = new Dictionary<string, IconSet>();
|
|
foreach (string assetPath in sortedAssetPaths)
|
|
{
|
|
sortedData.Add(assetPath, data[assetPath]);
|
|
}
|
|
|
|
return sortedData;
|
|
}
|
|
|
|
void CheckFocus(Rect checkRect)
|
|
{
|
|
//---Check if last mouse click was in the asset grid rect---//
|
|
if (Event.current.rawType == EventType.MouseDown)
|
|
{
|
|
assetGridFocused = checkRect.Contains(Event.current.mousePosition);
|
|
}
|
|
|
|
//---Check the RapidIcon window is in focus---//
|
|
if (EditorWindow.focusedWindow != null && EditorWindow.focusedWindow.GetType() != typeof(RapidIconWindow))
|
|
assetGridFocused = false;
|
|
}
|
|
|
|
IconSet GetIconSetFromPath(string path)
|
|
{
|
|
//---Loop through icons and check if the path matches---//
|
|
foreach (IconSet iconSet in objectIconSets.Values)
|
|
{
|
|
if (iconSet.assetPath == path)
|
|
return iconSet;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
} |