diff --git a/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs b/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs new file mode 100644 index 0000000..b14a448 --- /dev/null +++ b/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs @@ -0,0 +1,92 @@ +#if UNITY_6000_3_OR_NEWER +using System; +using System.Reflection; +using UnityEditor; +using UnityEditor.Toolbars; +using UnityEngine; +using UnityEngine.Scripting; + +namespace Module.NavigationTool.Editor.Burst.Toolbar +{ + internal static class MainToolbarBurstElement + { + [Preserve] + [MainToolbarElement("Toolbar/Burst", ussName = "", defaultDockIndex = 0, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 500)] + public static MainToolbarElement Draw() + { + Styles.Initialize(); + + var isBurstEnabled = IsBurstEnabled(); + var icon = isBurstEnabled ? Styles.IconEnabled : Styles.IconDisabled; + var content = new MainToolbarContent(icon, "Enable/disable burst compiler"); + return new MainToolbarToggle(content, IsBurstEnabled(), _ => + { + EditorApplication.ExecuteMenuItem("Jobs/Burst/Enable Compilation"); + MainToolbar.Refresh("Toolbar/Burst"); + }); + } + + private static bool IsBurstEnabled() + { + const string typeFullname = "Unity.Burst.Editor.BurstEditorOptions, Unity.Burst"; + const string propertyName = "EnableBurstCompilation"; + + var type = Type.GetType(typeFullname, false, true); + + if (type == null) + { + Debug.LogWarningFormat("Failed to find type with name: {0}", typeFullname); + return false; + } + + var property = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Static); + + if (property == null) + { + Debug.LogWarningFormat("Failed to find property with name: {0} on type: {1}", propertyName, typeFullname); + return false; + } + + return (bool)property.GetValue(null); + } + + private static class Styles + { + private static bool _isInitialized; + public static Texture2D IconEnabled; + public static Texture2D IconDisabled; + + private const string EditorIconFileNameLight = "tex_icon_burst_light"; + private const string EditorIconFileNameDark = "tex_icon_burst_dark"; + + public static void Initialize() + { + if (_isInitialized) + return; + + IconEnabled = LoadIcon("_enabled"); + IconDisabled = LoadIcon("_disabled"); + _isInitialized = true; + } + + private static Texture2D LoadIcon(string postfix) + { + var iconPrefix = EditorGUIUtility.isProSkin ? EditorIconFileNameDark : EditorIconFileNameLight; + var filename = $"{iconPrefix}{postfix}"; + var guids = AssetDatabase.FindAssets("t:texture " + filename); + + for (var i = 0; i < guids.Length; i++) + { + var path = AssetDatabase.GUIDToAssetPath(guids[i]); + var tex = AssetDatabase.LoadAssetAtPath(path); + + if (tex != null) + return tex; + } + + return null; + } + } + } +} +#endif diff --git a/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs.meta b/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs.meta new file mode 100644 index 0000000..2c1afe5 --- /dev/null +++ b/Samples~/SamplesToolbarBurst/MainToolbarBurstElement.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9987eb28543a4bf288fc7cd66a5b707f +timeCreated: 1765029787 \ No newline at end of file diff --git a/Samples~/SamplesToolbarBurst/Settings/ToolbarBurstSettings.cs b/Samples~/SamplesToolbarBurst/Settings/ToolbarBurstSettings.cs index 09bc0b2..df02bcb 100644 --- a/Samples~/SamplesToolbarBurst/Settings/ToolbarBurstSettings.cs +++ b/Samples~/SamplesToolbarBurst/Settings/ToolbarBurstSettings.cs @@ -1,3 +1,4 @@ +#if !UNITY_6000_3_OR_NEWER using Module.NavigationTool.Editor.Toolbar; using UnityEditor; @@ -24,4 +25,5 @@ namespace Module.NavigationTool.Editor.Burst.Toolbar IsEnabled = EditorGUILayout.Toggle("Enable Burst", IsEnabled); } } -} \ No newline at end of file +} +#endif diff --git a/Samples~/SamplesToolbarBurst/ToolBurst.cs b/Samples~/SamplesToolbarBurst/ToolBurst.cs index 4e00285..3673e53 100644 --- a/Samples~/SamplesToolbarBurst/ToolBurst.cs +++ b/Samples~/SamplesToolbarBurst/ToolBurst.cs @@ -1,3 +1,4 @@ +#if !UNITY_6000_3_OR_NEWER using System; using System.Reflection; using JetBrains.Annotations; @@ -95,4 +96,5 @@ namespace Module.NavigationTool.Editor.Burst.Toolbar } } } -} \ No newline at end of file +} +#endif diff --git a/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs b/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs new file mode 100644 index 0000000..903bb90 --- /dev/null +++ b/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs @@ -0,0 +1,98 @@ +#if UNITY_6000_3_OR_NEWER +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Toolbars; +using UnityEngine; +using UnityEngine.Scripting; + +namespace Module.NavigationTool.Editor.Entities.Toolbar +{ + internal static class MainToolbarEntitiesElement + { + [Preserve] + [MainToolbarElement("Toolbar/Entities", ussName = "", defaultDockIndex = 0, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 500)] + public static IEnumerable Draw() + { + Styles.Initialize(); + + return new List(5) + { + new MainToolbarButton(new MainToolbarContent(Styles.IconHierarchy, "Show/Hide entities hierarchy window"), () => ToggleWindow("HierarchyWindow")), + new MainToolbarButton(new MainToolbarContent(Styles.IconComponents, "Show/Hide entities components window"), () => ToggleWindow("ComponentsWindow")), + new MainToolbarButton(new MainToolbarContent(Styles.IconSystems, "Show/Hide entities systems window"), () => ToggleWindow("SystemScheduleWindow")), + new MainToolbarButton(new MainToolbarContent(Styles.IconArchetypes, "Show/Hide entities archetypes window"), () => ToggleWindow("ArchetypesWindow")), + new MainToolbarButton(new MainToolbarContent(Styles.IconJournaling, "Show/Hide entities journaling window"), () => ToggleWindow("EntitiesJournalingWindow")) + }; + } + + private static void ToggleWindow(string typeName) + { + var fullname = $"{nameof(Unity)}.Entities.Editor.{typeName}, Unity.Entities.Editor"; + var type = Type.GetType(fullname, false, true); + + if (type != null) + { + var all = Resources.FindObjectsOfTypeAll(type); + + if (all.Length != 0) + { + for (var i = 0; i < all.Length; i++) + { + if (all[i] is EditorWindow window) + window.Close(); + } + } + else + { + EditorWindow.GetWindow(type); + } + } + else + { + Debug.LogWarningFormat("Failed to find type with name: {0}", fullname); + } + } + + private static class Styles + { + public static Texture2D IconHierarchy; + public static Texture2D IconComponents; + public static Texture2D IconSystems; + public static Texture2D IconArchetypes; + public static Texture2D IconJournaling; + + private static bool _isInitialized; + + private const string EditorDefaultResourcesPath = "Packages/com.unity.entities/Editor Default Resources/"; + private const string EditorIconsLightDirectory = EditorDefaultResourcesPath + "icons/light"; + private const string EditorIconsDarkDirectory = EditorDefaultResourcesPath + "icons/dark"; + + public static void Initialize() + { + if (_isInitialized) + return; + + IconHierarchy = LoadIcon("EntityGroup/EntityGroup"); + IconComponents = LoadIcon("Component/Component"); + IconSystems = LoadIcon("System/System"); + IconArchetypes = LoadIcon("Archetype/Archetype"); + IconJournaling = LoadIcon("Journaling/Journaling"); + + _isInitialized = true; + } + + private static Texture2D LoadIcon(string name) + { + var iconsDirectory = EditorIconsLightDirectory; + + if (EditorGUIUtility.isProSkin) + iconsDirectory = EditorIconsDarkDirectory; + + var obj = AssetDatabase.LoadAssetAtPath($"{iconsDirectory}/{name}.png", typeof(Texture2D)); + return obj != null ? (Texture2D)obj : null; + } + } + } +} +#endif diff --git a/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs.meta b/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs.meta new file mode 100644 index 0000000..2245389 --- /dev/null +++ b/Samples~/SamplesToolbarEntities/MainToolbarEntitiesElement.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b08f1787e67e40bb81f8f1d80d459ffe +timeCreated: 1765029703 \ No newline at end of file diff --git a/Samples~/SamplesToolbarEntities/Settings/ToolbarEntitiesSettings.cs b/Samples~/SamplesToolbarEntities/Settings/ToolbarEntitiesSettings.cs index 414bfc3..19b1d6d 100644 --- a/Samples~/SamplesToolbarEntities/Settings/ToolbarEntitiesSettings.cs +++ b/Samples~/SamplesToolbarEntities/Settings/ToolbarEntitiesSettings.cs @@ -1,3 +1,4 @@ +#if !UNITY_6000_3_OR_NEWER using Module.NavigationTool.Editor.Toolbar; using UnityEditor; @@ -24,4 +25,5 @@ namespace Module.NavigationTool.Editor.Entities.Toolbar IsEnabled = EditorGUILayout.Toggle("Enable Entities", IsEnabled); } } -} \ No newline at end of file +} +#endif diff --git a/Samples~/SamplesToolbarEntities/ToolEntities.cs b/Samples~/SamplesToolbarEntities/ToolEntities.cs index 0e65c32..8811e35 100644 --- a/Samples~/SamplesToolbarEntities/ToolEntities.cs +++ b/Samples~/SamplesToolbarEntities/ToolEntities.cs @@ -1,3 +1,4 @@ +#if !UNITY_6000_3_OR_NEWER using System; using JetBrains.Annotations; using Module.NavigationTool.Editor.Toolbar; @@ -122,4 +123,5 @@ namespace Module.NavigationTool.Editor.Entities.Toolbar } } } -} \ No newline at end of file +} +#endif