#if UNITY_EDITOR using UnityEngine; using UnityEditor; using Crosstales.FB.EditorUtil; using Crosstales.FB.EditorTask; using Crosstales.FB.Util; namespace Crosstales.FB.EditorIntegration { /// Base class for editor windows. public abstract class ConfigBase : EditorWindow { #region Variables private static string updateText = UpdateCheck.TEXT_NOT_CHECKED; private static UpdateStatus updateStatus = UpdateStatus.NOT_CHECKED; private System.Threading.Thread worker; private Vector2 scrollPosConfig; private Vector2 scrollPosHelp; private Vector2 scrollPosAboutUpdate; private Vector2 scrollPosAboutReadme; private Vector2 scrollPosAboutVersions; private static string readme; private static string versions; private int aboutTab; private static readonly System.Random rnd = new System.Random(); private readonly int adRnd1 = rnd.Next(0, 4); private readonly int adRnd2 = rnd.Next(0, 5); #endregion #region Protected methods protected void showConfiguration() { showPlatformNotSupported(); scrollPosConfig = EditorGUILayout.BeginScrollView(scrollPosConfig, false, false); { GUILayout.Label("Global Settings", EditorStyles.boldLabel); //EditorConfig.PREFAB_AUTOLOAD = EditorGUILayout.Toggle(new GUIContent("Prefab Auto-Load", $"Enable or disable auto-loading of the prefabs to the scene (default: {EditorConstants.DEFAULT_PREFAB_AUTOLOAD})."), EditorConfig.PREFAB_AUTOLOAD); Config.DEBUG = EditorGUILayout.Toggle(new GUIContent("Debug", $"Enable or disable debug logs (default: {Constants.DEFAULT_DEBUG})."), Config.DEBUG); EditorConfig.UPDATE_CHECK = EditorGUILayout.Toggle(new GUIContent("Update Check", $"Enable or disable the update-checks for the asset (default: {EditorConstants.DEFAULT_UPDATE_CHECK})."), EditorConfig.UPDATE_CHECK); //EditorConfig.COMPILE_DEFINES = EditorGUILayout.Toggle(new GUIContent("Compile Defines", $"Enable or disable adding compile define 'CT_FB' for the asset (default: {EditorConstants.DEFAULT_COMPILE_DEFINES})."), EditorConfig.COMPILE_DEFINES); EditorHelper.SeparatorUI(); GUILayout.Label("FileBrowser", EditorStyles.boldLabel); EditorConfig.HIERARCHY_ICON = EditorGUILayout.Toggle(new GUIContent("Show Hierarchy Icon", $"Show hierarchy icon (default: {EditorConstants.DEFAULT_HIERARCHY_ICON})."), EditorConfig.HIERARCHY_ICON); EditorHelper.SeparatorUI(); GUILayout.Label("Windows", EditorStyles.boldLabel); Config.NATIVE_WINDOWS = EditorGUILayout.Toggle(new GUIContent("Native Inside Editor", $"Enable or disable native file browser inside the Unity Editor under Windows (default: {Constants.DEFAULT_NATIVE_WINDOWS})."), Config.NATIVE_WINDOWS); if (Config.NATIVE_WINDOWS) EditorGUILayout.HelpBox("'Native Inside Editor' can cause the Editor to freeze or even to crash.\nWe recommend enabling this setting only during FileBrowser-related tests inside the Editor.", MessageType.Warning); EditorHelper.SeparatorUI(); GUILayout.Label("macOS", EditorStyles.boldLabel); EditorConfig.MACOS_MODIFY_BUNDLE = EditorGUILayout.Toggle(new GUIContent("Modify Bundle", "Modify the 'FileBrowser.bundle' for macOS builds. This should ease the macOS App Store approval process (default: " + EditorConstants.DEFAULT_MACOS_MODIFY_BUNDLE + ")."), EditorConfig.MACOS_MODIFY_BUNDLE); EditorHelper.SeparatorUI(); GUILayout.Label("UWP (WSA)", EditorStyles.boldLabel); EditorConfig.WSA_MODIFY_MANIFEST = EditorGUILayout.Toggle(new GUIContent("Modify Manifest", "Modify the 'Package.appxmanifest' for UWP (WSA) builds to access all files of the system (default: " + EditorConstants.DEFAULT_WSA_MODIFY_MANIFEST + ")."), EditorConfig.WSA_MODIFY_MANIFEST); } EditorGUILayout.EndScrollView(); } protected void showHelp() { showPlatformNotSupported(); scrollPosHelp = EditorGUILayout.BeginScrollView(scrollPosHelp, false, false); { GUILayout.Label("Resources", EditorStyles.boldLabel); GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(); { if (GUILayout.Button(new GUIContent(" Manual", EditorHelper.Icon_Manual, "Show the manual."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_MANUAL_URL); GUILayout.Space(6); if (GUILayout.Button(new GUIContent(" Forum", EditorHelper.Icon_Forum, "Visit the forum page."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_FORUM_URL); } GUILayout.EndVertical(); GUILayout.BeginVertical(); { if (GUILayout.Button(new GUIContent(" API", EditorHelper.Icon_API, "Show the API."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_API_URL); GUILayout.Space(6); if (GUILayout.Button(new GUIContent(" Product", EditorHelper.Icon_Product, "Visit the product page."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_WEB_URL); } GUILayout.EndVertical(); } GUILayout.EndHorizontal(); EditorHelper.SeparatorUI(); GUILayout.Label("Videos", EditorStyles.boldLabel); /* GUILayout.BeginHorizontal(); { if (GUILayout.Button(new GUIContent(" Promo", EditorHelper.Video_Promo, "View the promotion video on 'Youtube'."))) { Helper.OpenURL(Constants.ASSET_VIDEO_PROMO); } if (GUILayout.Button(new GUIContent(" Tutorial", EditorHelper.Video_Tutorial, "View the tutorial video on 'Youtube'."))) { Helper.OpenURL(Constants.ASSET_VIDEO_TUTORIAL); } } GUILayout.EndHorizontal(); GUILayout.Space(6); */ if (GUILayout.Button(new GUIContent(" Tutorial", EditorHelper.Video_Tutorial, "View the tutorial video on 'Youtube'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_VIDEO_TUTORIAL); GUILayout.Space(6); if (GUILayout.Button(new GUIContent(" All Videos", EditorHelper.Icon_Videos, "Visit our 'Youtube'-channel for more videos."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_SOCIAL_YOUTUBE); EditorHelper.SeparatorUI(); GUILayout.Label("3rd Party Assets", EditorStyles.boldLabel); GUILayout.BeginHorizontal(); { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Asset_PlayMaker, "More information about 'PlayMaker'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_3P_PLAYMAKER); if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Asset_RTFB, "More information about 'Runtime File Browser'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_3P_RTFB); //CT Ads switch (adRnd1) { case 0: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_BWF, "More information about 'Bad Word Filter'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_BWF); break; } case 1: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_DJ, "More information about 'DJ'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_DJ); break; } case 2: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_TR, "More information about 'True Random'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_TR); break; } default: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_TPB, "More information about 'Turbo Builder'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_TPB); break; } } switch (adRnd2) { case 0: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_Radio, "More information about 'Radio'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_RADIO); break; } case 1: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_TB, "More information about 'Turbo Backup'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_TB); break; } case 2: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_TPS, "More information about 'Turbo Switch'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_TPS); break; } case 3: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_RTV, "More information about 'RT-Voice'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_RTV); break; } default: { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset_OC, "More information about 'Online Check'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_OC); break; } } } GUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); GUILayout.Space(6); } protected void showAbout() { showPlatformNotSupported(); GUILayout.Space(3); GUILayout.Label(Constants.ASSET_NAME, EditorStyles.boldLabel); GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(GUILayout.Width(60)); { GUILayout.Label("Version:"); GUILayout.Space(12); GUILayout.Label("Web:"); GUILayout.Space(2); GUILayout.Label("Email:"); } GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(170)); { GUILayout.Space(0); GUILayout.Label(Constants.ASSET_VERSION); GUILayout.Space(12); EditorGUILayout.SelectableLabel(Constants.ASSET_AUTHOR_URL, GUILayout.Height(16), GUILayout.ExpandHeight(false)); GUILayout.Space(2); EditorGUILayout.SelectableLabel(Constants.ASSET_CONTACT, GUILayout.Height(16), GUILayout.ExpandHeight(false)); } GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.ExpandWidth(true)); { //GUILayout.Space(0); } GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(64)); { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Logo_Asset, "Visit asset website"))) Crosstales.Common.Util.NetworkHelper.OpenURL(EditorConstants.ASSET_URL); } GUILayout.EndVertical(); } GUILayout.EndHorizontal(); GUILayout.Label($"© 2017-2023 by {Constants.ASSET_AUTHOR}"); EditorHelper.SeparatorUI(); GUILayout.BeginHorizontal(); { if (GUILayout.Button(new GUIContent(" AssetStore", EditorHelper.Logo_Unity, "Visit the 'Unity AssetStore' website."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_CT_URL); if (GUILayout.Button(new GUIContent($" {Constants.ASSET_AUTHOR}", EditorHelper.Logo_CT, $"Visit the '{Constants.ASSET_AUTHOR}' website."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_AUTHOR_URL); } GUILayout.EndHorizontal(); EditorHelper.SeparatorUI(); aboutTab = GUILayout.Toolbar(aboutTab, new[] { "Readme", "Versions", "Update" }); switch (aboutTab) { case 2: { scrollPosAboutUpdate = EditorGUILayout.BeginScrollView(scrollPosAboutUpdate, false, false); { Color fgColor = GUI.color; GUI.color = Color.yellow; switch (updateStatus) { case UpdateStatus.NO_UPDATE: GUI.color = Color.green; GUILayout.Label(updateText); break; case UpdateStatus.UPDATE: { GUILayout.Label(updateText); if (GUILayout.Button(new GUIContent(" Download", "Visit the 'Unity AssetStore' to download the latest version."))) UnityEditorInternal.AssetStore.Open($"content/{EditorConstants.ASSET_ID}"); break; } case UpdateStatus.UPDATE_VERSION: { GUILayout.Label(updateText); if (GUILayout.Button(new GUIContent(" Upgrade", "Upgrade to the newer version in the 'Unity AssetStore'"))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_CT_URL); break; } case UpdateStatus.DEPRECATED: { GUILayout.Label(updateText); if (GUILayout.Button(new GUIContent(" More Information", "Visit the 'crosstales'-site for more information."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_AUTHOR_URL); break; } default: GUI.color = Color.cyan; GUILayout.Label(updateText); break; } GUI.color = fgColor; } EditorGUILayout.EndScrollView(); if (updateStatus == UpdateStatus.NOT_CHECKED || updateStatus == UpdateStatus.NO_UPDATE) { bool isChecking = !(worker == null || worker?.IsAlive == false); GUI.enabled = Crosstales.Common.Util.NetworkHelper.isInternetAvailable && !isChecking; if (GUILayout.Button(new GUIContent(isChecking ? "Checking... Please wait." : " Check For Update", EditorHelper.Icon_Check, $"Checks for available updates of {Constants.ASSET_NAME}"))) { worker = new System.Threading.Thread(() => UpdateCheck.UpdateCheckForEditor(out updateText, out updateStatus)); worker.Start(); } GUI.enabled = true; } break; } case 0: { if (readme == null) { string path = $"{Application.dataPath}{EditorConfig.ASSET_PATH}README.txt"; try { readme = Crosstales.Common.Util.FileHelper.ReadAllText(path); } catch (System.Exception) { readme = $"README not found: {path}"; } } scrollPosAboutReadme = EditorGUILayout.BeginScrollView(scrollPosAboutReadme, false, false); { GUILayout.Label(readme); } EditorGUILayout.EndScrollView(); break; } default: { if (versions == null) { string path = $"{Application.dataPath}{EditorConfig.ASSET_PATH}Documentation/VERSIONS.txt"; try { versions = Crosstales.Common.Util.FileHelper.ReadAllText(path); } catch (System.Exception) { versions = $"VERSIONS not found: {path}"; } } scrollPosAboutVersions = EditorGUILayout.BeginScrollView(scrollPosAboutVersions, false, false); { GUILayout.Label(versions); } EditorGUILayout.EndScrollView(); break; } } EditorHelper.SeparatorUI(6); GUILayout.BeginHorizontal(); { if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Social_Discord, "Communicate with us via 'Discord'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_SOCIAL_DISCORD); if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Social_Facebook, "Follow us on 'Facebook'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_SOCIAL_FACEBOOK); if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Social_Twitter, "Follow us on 'Twitter'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_SOCIAL_TWITTER); if (GUILayout.Button(new GUIContent(string.Empty, EditorHelper.Social_Linkedin, "Follow us on 'LinkedIn'."))) Crosstales.Common.Util.NetworkHelper.OpenURL(Constants.ASSET_SOCIAL_LINKEDIN); } GUILayout.EndHorizontal(); GUILayout.Space(6); } protected static void save() { Config.Save(); EditorConfig.Save(); if (Config.DEBUG) Debug.Log("Config data saved"); } protected void showPlatformNotSupported() { if (EditorHelper.isFileBrowserInScene && FileBrowser.Instance != null && !FileBrowser.Instance.isPlatformSupported) { EditorGUILayout.HelpBox("The current platform is not supported by the File Browser. Please add a custom wrapper (e.g. Runtime File Browser).", MessageType.Error); } } #endregion } } #endif // © 2019-2023 crosstales LLC (https://www.crosstales.com)