using System; using System.Collections.Generic; using System.Reflection; using UnityEditor; using UnityEngine; namespace AssetStoreTools.Utility { internal class ASToolsPreferences { private static ASToolsPreferences s_instance; public static ASToolsPreferences Instance => s_instance ?? (s_instance = new ASToolsPreferences()); public static event Action OnSettingsChange; private ASToolsPreferences() { Load(); } private void Load() { CheckForUpdates = PlayerPrefs.GetInt("AST_CheckForUpdates", 1) == 1; LegacyVersionCheck = PlayerPrefs.GetInt("AST_LegacyVersionCheck", 1) == 1; UploadVersionCheck = PlayerPrefs.GetInt("AST_UploadVersionCheck", 1) == 1; DisplayHiddenMetaDialog = PlayerPrefs.GetInt("AST_HiddenFolderMetaCheck", 1) == 1; EnableSymlinkSupport = PlayerPrefs.GetInt("AST_EnableSymlinkSupport", 0) == 1; UseLegacyExporting = PlayerPrefs.GetInt("AST_UseLegacyExporting", 0) == 1; } public void Save(bool triggerSettingsChange = false) { PlayerPrefs.SetInt("AST_CheckForUpdates", CheckForUpdates ? 1 : 0); PlayerPrefs.SetInt("AST_LegacyVersionCheck", LegacyVersionCheck ? 1 : 0); PlayerPrefs.SetInt("AST_UploadVersionCheck", UploadVersionCheck ? 1 : 0); PlayerPrefs.SetInt("AST_HiddenFolderMetaCheck", DisplayHiddenMetaDialog ? 1 : 0); PlayerPrefs.SetInt("AST_EnableSymlinkSupport", EnableSymlinkSupport ? 1 : 0); PlayerPrefs.SetInt("AST_UseLegacyExporting", UseLegacyExporting ? 1 : 0); PlayerPrefs.Save(); if (triggerSettingsChange) OnSettingsChange?.Invoke(); } /// /// Periodically check if an update for the Asset Store Publishing Tools is available /// public bool CheckForUpdates; /// /// Check if legacy Asset Store Tools are in the Project /// public bool LegacyVersionCheck; /// /// Enables a DisplayDialog when hidden folders are found to be missing meta files /// public bool DisplayHiddenMetaDialog; /// /// Check if the package has been uploaded from a correct Unity version at least once /// public bool UploadVersionCheck; /// /// Enables Junction symlink support /// public bool EnableSymlinkSupport; /// /// Enables legacy exporting for Folder Upload workflow /// public bool UseLegacyExporting; } internal class ASToolsPreferencesProvider : SettingsProvider { private const string SettingsPath = "Project/Asset Store Tools"; private class Styles { public static readonly GUIContent CheckForUpdatesLabel = EditorGUIUtility.TrTextContent("Check for Updates", "Periodically check if an update for the Asset Store Publishing Tools is available."); public static readonly GUIContent LegacyVersionCheckLabel = EditorGUIUtility.TrTextContent("Legacy ASTools Check", "Enable Legacy Asset Store Tools version checking."); public static readonly GUIContent UploadVersionCheckLabel = EditorGUIUtility.TrTextContent("Upload Version Check", "Check if the package has been uploader from a correct Unity version at least once."); public static readonly GUIContent DisplayHiddenMetaDialogLabel = EditorGUIUtility.TrTextContent("Display Hidden Folder Meta Dialog", "Show a DisplayDialog when hidden folders are found to be missing meta files.\nNote: this only affects hidden folders ending with a '~' character"); public static readonly GUIContent EnableSymlinkSupportLabel = EditorGUIUtility.TrTextContent("Enable Symlink Support", "Enable Junction Symlink support. Note: folder selection validation will take longer."); public static readonly GUIContent UseLegacyExportingLabel = EditorGUIUtility.TrTextContent("Use Legacy Exporting", "Enabling this option uses native Unity methods when exporting packages for the Folder Upload workflow.\nNote: individual package dependency selection when choosing to 'Include Package Manifest' is unavailable when this option is enabled."); public static readonly GUIContent UseCustomPreviewsLabel = EditorGUIUtility.TrTextContent("Enable High Quality Previews (experimental)", "Override native asset preview retrieval with higher-quality preview generation"); } public static void OpenSettings() { SettingsService.OpenProjectSettings(SettingsPath); } private ASToolsPreferencesProvider(string path, SettingsScope scopes, IEnumerable keywords = null) : base(path, scopes, keywords) { } public override void OnGUI(string searchContext) { var preferences = ASToolsPreferences.Instance; EditorGUI.BeginChangeCheck(); using (CreateSettingsWindowGUIScope()) { preferences.CheckForUpdates = EditorGUILayout.Toggle(Styles.CheckForUpdatesLabel, preferences.CheckForUpdates); preferences.LegacyVersionCheck = EditorGUILayout.Toggle(Styles.LegacyVersionCheckLabel, preferences.LegacyVersionCheck); preferences.UploadVersionCheck = EditorGUILayout.Toggle(Styles.UploadVersionCheckLabel, preferences.UploadVersionCheck); preferences.DisplayHiddenMetaDialog = EditorGUILayout.Toggle(Styles.DisplayHiddenMetaDialogLabel, preferences.DisplayHiddenMetaDialog); preferences.EnableSymlinkSupport = EditorGUILayout.Toggle(Styles.EnableSymlinkSupportLabel, preferences.EnableSymlinkSupport); preferences.UseLegacyExporting = EditorGUILayout.Toggle(Styles.UseLegacyExportingLabel, preferences.UseLegacyExporting); } if (EditorGUI.EndChangeCheck()) { ASToolsPreferences.Instance.Save(true); } } [SettingsProvider] public static SettingsProvider CreateAssetStoreToolsSettingProvider() { var provider = new ASToolsPreferencesProvider(SettingsPath, SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties()); return provider; } private IDisposable CreateSettingsWindowGUIScope() { var unityEditorAssembly = Assembly.GetAssembly(typeof(EditorWindow)); var type = unityEditorAssembly.GetType("UnityEditor.SettingsWindow+GUIScope"); return Activator.CreateInstance(type) as IDisposable; } } }