diff --git a/EditorIcons.cs b/EditorIcons.cs index ced9e1d..dda8059 100644 --- a/EditorIcons.cs +++ b/EditorIcons.cs @@ -1,11 +1,11 @@ #if UNITY_EDITOR using System; -using UnityEngine; -using UnityEditor; using System.Collections.Generic; -using System.Linq; using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; public class EditorIcons : EditorWindow { @@ -33,36 +33,39 @@ public static void EditorIconsOpen() void SearchGUI() { - using( new GUILayout.HorizontalScope()) + using (new GUILayout.HorizontalScope()) { - if (isWide) GUILayout.Space(10); + if (isWide) + GUILayout.Space(10); #if UNITY_2018 search = EditorGUILayout.TextField(search, EditorStyles.toolbarTextField); #else search = EditorGUILayout.TextField(search, EditorStyles.toolbarSearchField); #endif - if ( GUILayout.Button(EditorGUIUtility.IconContent("winbtn_mac_close_h"), //SVN_DeletedLocal - EditorStyles.toolbarButton, + if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_mac_close_h"), //SVN_DeletedLocal + EditorStyles.toolbarButton, GUILayout.Width(22)) - ) search = ""; + ) + search = ""; } } bool isWide => Screen.width > 550; - bool doSearch => ! string.IsNullOrWhiteSpace(search) && search != ""; + bool doSearch => !string.IsNullOrWhiteSpace(search) && search != ""; - GUIContent GetIcon( string icon_name ) + GUIContent GetIcon(string icon_name) { GUIContent valid = null; Debug.unityLogger.logEnabled = false; - if (!string.IsNullOrEmpty(icon_name)) valid = EditorGUIUtility.IconContent(icon_name); + if (!string.IsNullOrEmpty(icon_name)) + valid = EditorGUIUtility.IconContent(icon_name); Debug.unityLogger.logEnabled = true; return valid?.image == null ? null : valid; } - void SaveIcon( string icon_name ) + void SaveIcon(string icon_name) { Texture2D tex = EditorGUIUtility.IconContent(icon_name).image as Texture2D; @@ -100,7 +103,7 @@ void SaveIcon( string icon_name ) Debug.LogError("Cannot save the icon : null texture error!"); } } - + void SaveAllIcons() { var folderpath = EditorUtility.SaveFolderPanel("", "", ""); @@ -111,13 +114,14 @@ void SaveAllIcons() var split = icon.Split('/').Last(); Texture2D tex = EditorGUIUtility.IconContent(icon).image as Texture2D; - if (tex == null) continue; + if (tex == null) + continue; if (string.IsNullOrWhiteSpace(folderpath)) { Debug.LogError("Folder path invalid..."); break; } - + var path = folderpath + "//" + $"{split}.png"; if (File.Exists(path)) @@ -137,8 +141,8 @@ void SaveAllIcons() #endif Graphics.CopyTexture(tex, outTex); - - + + File.WriteAllBytes(path, outTex.EncodeToPNG()); } } @@ -153,7 +157,7 @@ private void OnEnable() { //InitIcons(); //var all_icons = iconContentListAll.Select(x => x.tooltip).ToArray(); - var all_icons = ico_list.Where( x => GetIcon( x ) != null ); + var all_icons = ico_list.Where(x => GetIcon(x) != null); //List found = new List(); List unique = new List(); //var skip_flag = HideFlags.HideInInspector | HideFlags.HideAndDontSave; @@ -166,8 +170,9 @@ private void OnEnable() //if (!EditorUtility.IsPersistent(x)) skipped_not_persistent++; // skipped 39 none persistent //if (x.hideFlags != HideFlags.HideAndDontSave && x.hideFlags != skip_flag) skipped_flags++; // skipped 27 icons - GUIContent icoContent = GetIcon( x.name ); - if ( icoContent == null ) continue; // skipped 14 icons + GUIContent icoContent = GetIcon(x.name); + if (icoContent == null) + continue; // skipped 14 icons //{ // skipped_nulls++; // continue; @@ -178,7 +183,7 @@ private void OnEnable() //unique_to_resources++; unique.Add(x.name); } - + //found.Add( x.name ); } @@ -189,7 +194,16 @@ private void OnEnable() //Debug.Log($"totals , list: {all_icons.Length} resource: {found.Count}"); //Debug.Log($"Unique list={ unique_to_list } resources={unique_to_resources}") ; - ico_list = ico_list.ToList().Concat(unique).ToArray(); + ico_list = ico_list.Concat(unique) + .Distinct(StringComparer.Ordinal) + .OrderBy(x => x) // light and dark icon order is not stable, sort 2 times + .OrderBy(x => // not ThenBy + { + if (x.StartsWith("d_", StringComparison.Ordinal)) + return x.Substring(2); + return x; + }) + .ToArray(); // Static list icons count : 1315 ( unique = 749 ) // Found icons in resources : 1416 ( unique = 855 ) @@ -204,20 +218,24 @@ private void OnGUI() InitIcons(); - if (!isWide) SearchGUI(); + if (!isWide) + SearchGUI(); - using ( new GUILayout.HorizontalScope( EditorStyles.toolbar ) ) + using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { - if(GUILayout.Button("Save all icons to folder...",EditorStyles.miniButton)) SaveAllIcons(); - GUILayout.Label("Select what icons to show", GUILayout.Width( 160 )); + if (GUILayout.Button("Save all icons to folder...", EditorStyles.miniButton)) + SaveAllIcons(); + GUILayout.Label("Select what icons to show", GUILayout.Width(160)); viewBigIcons = GUILayout.SelectionGrid( - viewBigIcons ? 1 : 0, new string[] { "Small", "Big" }, - 2 , EditorStyles.toolbarButton) == 1; + viewBigIcons ? 1 : 0, new string[] { "Small", "Big" }, + 2, EditorStyles.toolbarButton) == 1; - if (isWide) SearchGUI(); + if (isWide) + SearchGUI(); } - if (isWide) GUILayout.Space(3); + if (isWide) + GUILayout.Space(3); using (var scope = new GUILayout.ScrollViewScope(scroll)) { @@ -229,94 +247,152 @@ private void OnGUI() // scrollbar_width = ~ 12.5 var render_width = (Screen.width / ppp - 13f); - var gridW = Mathf.FloorToInt( render_width / buttonSize ); - var margin_left = ( render_width - buttonSize * gridW ) / 2; + var gridW = Mathf.FloorToInt(render_width / buttonSize); + var margin_left = (render_width - buttonSize * gridW) / 2; int row = 0, index = 0; List iconList; - if( doSearch ) iconList = iconContentListAll.Where( x => x.tooltip.ToLower() - .Contains( search.ToLower() ) ).ToList(); - else iconList = viewBigIcons ? iconContentListBig : iconContentListSmall; + if (doSearch) + iconList = iconContentListAll.Where(x => x.tooltip.ToLower() + .Contains(search.ToLower())).ToList(); + else + iconList = viewBigIcons ? iconContentListBig : iconContentListSmall; - while ( index < iconList.Count ) + while (index < iconList.Count) { - using( new GUILayout.HorizontalScope() ) + using (new GUILayout.HorizontalScope()) { GUILayout.Space(margin_left); - for( var i = 0; i < gridW; ++ i ) + for (var i = 0; i < gridW; ++i) { int k = i + row * gridW; - var icon = iconList[ k ]; + var icon = iconList[k]; if (GUILayout.Button(icon, iconButtonStyle, GUILayout.Width(buttonSize), - GUILayout.Height(buttonSize))) { + GUILayout.Height(buttonSize))) + { EditorGUI.FocusTextInControl(""); iconSelected = icon; } - index ++ ; + index++; - if( index == iconList.Count ) break; + if (index == iconList.Count) + break; } } - row ++ ; + row++; } GUILayout.Space(10); } - if (iconSelected == null) return; - + if (iconSelected == null) + return; + GUILayout.FlexibleSpace(); - using (new GUILayout.HorizontalScope( EditorStyles.helpBox, GUILayout.MaxHeight(viewBigIcons ? 140 : 120 ) ) ) + using (new GUILayout.HorizontalScope(EditorStyles.helpBox, GUILayout.MaxHeight(viewBigIcons ? 140 : 120))) { - using( new GUILayout.VerticalScope( GUILayout.Width( 130 ) ) ) + using (new GUILayout.VerticalScope(GUILayout.Width(128))) { - GUILayout.Space(2); + GUILayout.Button(iconSelected, + iconPreviewBlack, + GUILayout.Width(128), GUILayout.Height(viewBigIcons ? 128 : 128/*40*/)); - GUILayout.Button(iconSelected, - darkPreview? iconPreviewBlack:iconPreviewWhite, - GUILayout.Width(128), GUILayout.Height( viewBigIcons ? 128 : 40 )); - - GUILayout.Space(5); - - darkPreview = GUILayout.SelectionGrid( - darkPreview ? 1 : 0, new string[] { "Light", "Dark" }, - 2, EditorStyles.miniButton) == 1; + GUILayout.Button(iconSelected, + iconPreviewWhite, + GUILayout.Width(128), GUILayout.Height(viewBigIcons ? 128 : 128/*40*/)); + + //GUILayout.Space(5); + + //darkPreview = GUILayout.SelectionGrid( + // darkPreview ? 1 : 0, new string[] { "Light", "Dark" }, + // 2, EditorStyles.miniButton) == 1; GUILayout.FlexibleSpace(); } - GUILayout.Space(10); - using (new GUILayout.VerticalScope()) { var s = $"Size: {iconSelected.image.width}x{iconSelected.image.height}"; - s += "\nIs Pro Skin Icon: " + ( iconSelected.tooltip.IndexOf("d_") == 0 ? "Yes" : "No" ); + s += "\nIs Pro Skin Icon: " + (iconSelected.tooltip.IndexOf("d_") == 0 ? "Yes" : "No"); s += $"\nTotal {iconContentListAll.Count} icons"; - GUILayout.Space(5); - EditorGUILayout.HelpBox(s,MessageType.None); + + EditorGUILayout.HelpBox(s, MessageType.None); GUILayout.Space(5); EditorGUILayout.TextField("EditorGUIUtility.IconContent(\"" + iconSelected.tooltip + "\")"); GUILayout.Space(5); - if(GUILayout.Button("Copy to clipboard",EditorStyles.miniButton)) + + if (GUILayout.Button("Copy to clipboard", EditorStyles.miniButton)) EditorGUIUtility.systemCopyBuffer = iconSelected.tooltip; - if(GUILayout.Button("Save icon to file ...",EditorStyles.miniButton)) + if (GUILayout.Button("Save icon to file ...", EditorStyles.miniButton)) SaveIcon(iconSelected.tooltip); - } - GUILayout.Space(10); - if (GUILayout.Button( "X", GUILayout.ExpandHeight(true))) + // USS for Unity Editor + var ussName = iconSelected.tooltip; + int isDark = 0; + if (ico_list.Contains("d_" + ussName)) + { + isDark = 1; + } + else if (ussName.StartsWith("d_", StringComparison.Ordinal)) + { + if (ico_list.Contains(ussName.Substring(2))) + { + ussName = ussName.Substring(2); + isDark = 1; + } + } + var iconFileName = ussName; + // remove redundant 'icon' + if (ussName.EndsWith("icon", StringComparison.OrdinalIgnoreCase)) + ussName = ussName[..^4]; + if (ussName.StartsWith("icon", StringComparison.OrdinalIgnoreCase)) + ussName = ussName[4..]; + var trimChars = new char[] { '-', '_', ' ', '.' }; + foreach (var trim in trimChars) + { + int pos; + while (true) + { + pos = ussName.IndexOf(trim + "icon", StringComparison.OrdinalIgnoreCase); + if (pos < 0) + break; + + ussName = ussName[..pos] + ussName[(pos + 5)..]; + } + } + ussName = ussName.Trim(trimChars); + + ussName = ".editor--" + + ussName.Replace(' ', '-').Replace('.', '-').Replace('@', '-').ToLowerInvariant() + "--icon"; + // always export both light and dark + var uss = string.Empty; + while (isDark-- >= 0) + { + uss += $@"{ussName} {{ + background-image: resource('{iconFileName}'); + -unity-background-scale-mode: scale-to-fit; +}} +" + ; + iconFileName = "d_" + iconFileName; + ussName += "-dark"; + } + EditorGUILayout.TextField(uss, GUILayout.ExpandHeight(true)); + } + + if (GUILayout.Button("X", GUILayout.ExpandHeight(true))) { iconSelected = null; } @@ -334,15 +410,15 @@ private void OnGUI() static GUIStyle iconPreviewBlack = null; static GUIStyle iconPreviewWhite = null; - void AllTheTEXTURES( ref GUIStyle s, Texture2D t ) + void AllTheTEXTURES(ref GUIStyle s, Texture2D t) { s.hover.background = s.onHover.background = s.focused.background = s.onFocused.background = s.active.background = s.onActive.background = s.normal.background = s.onNormal.background = t; s.hover.scaledBackgrounds = s.onHover.scaledBackgrounds = s.focused.scaledBackgrounds = s.onFocused.scaledBackgrounds = s.active.scaledBackgrounds = s.onActive.scaledBackgrounds = s.normal.scaledBackgrounds = s.onNormal.scaledBackgrounds = new Texture2D[] { t }; } - Texture2D Texture2DPixel( Color c ) + Texture2D Texture2DPixel(Color c) { - Texture2D t = new Texture2D(1,1); + Texture2D t = new Texture2D(1, 1); t.SetPixel(0, 0, c); t.Apply(); return t; @@ -350,17 +426,18 @@ Texture2D Texture2DPixel( Color c ) void InitIcons() { - if( iconContentListSmall != null ) return; + if (iconContentListSmall != null) + return; - iconButtonStyle = new GUIStyle( EditorStyles.miniButton ); - iconButtonStyle.margin = new RectOffset(0,0,0,0); + iconButtonStyle = new GUIStyle(EditorStyles.miniButton); + iconButtonStyle.margin = new RectOffset(0, 0, 0, 0); iconButtonStyle.fixedHeight = 0; iconPreviewBlack = new GUIStyle(iconButtonStyle); - AllTheTEXTURES( ref iconPreviewBlack, Texture2DPixel(new Color(0.15f,0.15f,0.15f))); - + AllTheTEXTURES(ref iconPreviewBlack, Texture2DPixel(new Color(0.15f, 0.15f, 0.15f))); + iconPreviewWhite = new GUIStyle(iconButtonStyle); - AllTheTEXTURES( ref iconPreviewWhite, Texture2DPixel(new Color(0.85f, 0.85f, 0.85f))); + AllTheTEXTURES(ref iconPreviewWhite, Texture2DPixel(new Color(0.85f, 0.85f, 0.85f))); iconMissingNames = new List(); iconContentListSmall = new List(); @@ -369,9 +446,9 @@ void InitIcons() for (var i = 0; i < ico_list.Length; ++i) { - GUIContent ico = GetIcon( ico_list[ i ] ); - - if( ico == null ) + GUIContent ico = GetIcon(ico_list[i]); + + if (ico == null) { iconMissingNames.Add(ico_list[i]); continue; @@ -380,10 +457,11 @@ void InitIcons() ico.tooltip = ico_list[i]; iconContentListAll.Add(ico); - - if ( !( ico.image.width <= 36 || ico.image.height <= 36 ) ) + + if (!(ico.image.width <= 36 || ico.image.height <= 36)) iconContentListBig.Add(ico); - else iconContentListSmall.Add(ico); + else + iconContentListSmall.Add(ico); } } @@ -392,7 +470,7 @@ void InitIcons() #region ICONS - public static string[] ico_list = + public static string[] ico_list = { "_Help","_Popup","aboutwindow.mainheader","ageialogo","AlphabeticalSorting","Animation.AddEvent", "Animation.AddKeyframe","Animation.EventMarker","Animation.FirstKey","Animation.LastKey", @@ -743,4 +821,4 @@ void InitIcons() #endregion } -#endif \ No newline at end of file +#endif