using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using Bolt.Utils;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using Debug = UnityEngine.Debug;
|
|
|
|
[InitializeOnLoad]
|
|
public partial class BoltWizardWindow : EditorWindow
|
|
{
|
|
BoltSetupStage currentStage = BoltSetupStage.Intro;
|
|
static Stopwatch watch = new Stopwatch();
|
|
|
|
static Boolean? Ready;
|
|
static Single? FirstCall;
|
|
private static volatile bool requestingAppId = false;
|
|
|
|
static bool RunCompiler;
|
|
|
|
static String FirstStartupKey
|
|
{
|
|
get { return "$Bolt$First$Startup$Wizard/" + BoltNetwork.Version; }
|
|
}
|
|
|
|
static Vector2 WindowSize;
|
|
static Vector2 WindowPosition;
|
|
|
|
static string AppIdOrEmail = "";
|
|
|
|
[NonSerialized] Func<bool> beforeNextCallback;
|
|
|
|
[NonSerialized] Dictionary<BoltInstalls, BoltPackage> packageInfo;
|
|
|
|
[NonSerialized] int ButtonWidth;
|
|
|
|
[NonSerialized] int NavMenuWidth;
|
|
|
|
[NonSerialized] string ReleaseHistoryHeader;
|
|
[NonSerialized] List<string> ReleaseHistoryTextAdded;
|
|
[NonSerialized] List<string> ReleaseHistoryTextChanged;
|
|
[NonSerialized] List<string> ReleaseHistoryTextFixed;
|
|
[NonSerialized] List<string> ReleaseHistoryTextRemoved;
|
|
|
|
// GUI
|
|
|
|
[NonSerialized] Texture2D introIcon;
|
|
|
|
[NonSerialized] Texture2D releaseIcon;
|
|
|
|
[NonSerialized] Texture2D photonCloudIcon;
|
|
|
|
[NonSerialized] Texture2D boltIcon;
|
|
|
|
[NonSerialized] Texture2D activeIcon;
|
|
|
|
[NonSerialized] Texture2D inactiveIcon;
|
|
|
|
[NonSerialized] Texture2D bugtrackerIcon;
|
|
|
|
[NonSerialized] GUIContent bugtrackerHeader;
|
|
|
|
[NonSerialized] GUIContent bugtrackerText;
|
|
|
|
[NonSerialized] Texture2D discordIcon;
|
|
|
|
[NonSerialized] GUIContent discordHeader;
|
|
|
|
[NonSerialized] GUIContent discordText;
|
|
|
|
[NonSerialized] Texture2D documentationIcon;
|
|
|
|
[NonSerialized] GUIContent documentationHeader;
|
|
|
|
[NonSerialized] GUIContent documentationText;
|
|
|
|
[NonSerialized] Texture2D reviewIcon;
|
|
|
|
[NonSerialized] GUIContent reviewHeader;
|
|
|
|
[NonSerialized] GUIContent reviewText;
|
|
|
|
[NonSerialized] Texture2D samplesIcon;
|
|
|
|
[NonSerialized] GUIStyle iconSection;
|
|
|
|
[NonSerialized] GUIStyle stepStyle;
|
|
|
|
[NonSerialized] GUIStyle headerStyle;
|
|
|
|
[NonSerialized] GUIStyle headerLabel;
|
|
|
|
[NonSerialized] GUIStyle headerLargeLabel;
|
|
|
|
[NonSerialized] GUIStyle textLabel;
|
|
|
|
[NonSerialized] GUIStyle centerInputText;
|
|
|
|
[NonSerialized] GUIStyle minimalButton;
|
|
|
|
[NonSerialized] GUIStyle simpleButton;
|
|
|
|
[NonSerialized] GUIStyle introStyle;
|
|
|
|
[NonSerialized] Vector2 scrollPosition;
|
|
|
|
static BoltWizardWindow()
|
|
{
|
|
EditorApplication.update -= ShowWizardWindow;
|
|
EditorApplication.update += ShowWizardWindow;
|
|
|
|
WindowPosition = new Vector2(100, 100);
|
|
}
|
|
|
|
static void ShowWizardWindow()
|
|
{
|
|
if (FirstCall.HasValue == false)
|
|
{
|
|
FirstCall = Time.realtimeSinceStartup;
|
|
return;
|
|
}
|
|
|
|
if ((Time.realtimeSinceStartup - FirstCall.Value) > 1)
|
|
{
|
|
if (!EditorPrefs.GetBool(FirstStartupKey, false))
|
|
{
|
|
Open();
|
|
}
|
|
|
|
EditorApplication.update -= ShowWizardWindow;
|
|
}
|
|
}
|
|
|
|
[MenuItem("Bolt/Wizard", priority = 100)]
|
|
public static void Open()
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
return;
|
|
}
|
|
|
|
BoltWizardWindow window = GetWindow<BoltWizardWindow>(true, BoltWizardText.WINDOW_TITLE, true);
|
|
window.position = new Rect(WindowPosition, WindowSize);
|
|
window.Show();
|
|
|
|
watch.Start();
|
|
}
|
|
|
|
static void ReOpen()
|
|
{
|
|
if (Ready.HasValue && Ready.Value == false)
|
|
{
|
|
Open();
|
|
}
|
|
|
|
EditorApplication.update -= ReOpen;
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
WindowSize = new Vector2(600, 600);
|
|
|
|
minSize = WindowSize;
|
|
|
|
NavMenuWidth = 210;
|
|
ButtonWidth = 120;
|
|
|
|
Ready = false;
|
|
|
|
beforeNextCallback = null;
|
|
|
|
// Pre-load Release History
|
|
PrepareReleaseHistoryText();
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
if (!EditorPrefs.GetBool(FirstStartupKey, false))
|
|
{
|
|
if (!EditorUtility.DisplayDialog(BoltWizardText.CLOSE_MSG_TITLE,
|
|
BoltWizardText.CLOSE_MSG_QUESTION, "Yes", "Back"))
|
|
{
|
|
EditorApplication.update += ReOpen;
|
|
}
|
|
}
|
|
|
|
Ready = false;
|
|
}
|
|
|
|
void InitContent()
|
|
{
|
|
if (Ready.HasValue && Ready.Value)
|
|
{
|
|
return;
|
|
}
|
|
|
|
introIcon = Resources.Load<Texture2D>("icons_welcome/information");
|
|
releaseIcon = Resources.Load<Texture2D>("icons_welcome/documentation");
|
|
photonCloudIcon = Resources.Load<Texture2D>("PhotonCloudIcon");
|
|
|
|
boltIcon = Resources.Load<Texture2D>("BoltIcon");
|
|
|
|
activeIcon = Resources.Load<Texture2D>("icons_welcome/bullet_green");
|
|
inactiveIcon = Resources.Load<Texture2D>("icons_welcome/bullet_black");
|
|
|
|
Texture2D texture = new Texture2D(1, 1);
|
|
texture.SetPixel(0, 0, Color.gray);
|
|
texture.Apply();
|
|
|
|
Color headerTextColor = EditorGUIUtility.isProSkin
|
|
? new Color(0xf2 / 255f, 0xad / 255f, 0f)
|
|
: new Color(30 / 255f, 99 / 255f, 183 / 255f);
|
|
Color commonTextColor = EditorGUIUtility.isProSkin ? Color.white : Color.black;
|
|
|
|
introStyle = new GUIStyle(EditorStyles.helpBox)
|
|
{
|
|
fontSize = 15,
|
|
padding = new RectOffset(10, 10, 10, 10),
|
|
normal =
|
|
{
|
|
textColor = commonTextColor
|
|
}
|
|
};
|
|
|
|
stepStyle = new GUIStyle(EditorStyles.helpBox)
|
|
{
|
|
padding = new RectOffset(10, 10, 10, 10),
|
|
margin = new RectOffset(0, 0, 5, 0),
|
|
normal =
|
|
{
|
|
textColor = commonTextColor
|
|
}
|
|
};
|
|
|
|
headerLabel = new GUIStyle(EditorStyles.boldLabel)
|
|
{
|
|
padding = new RectOffset(10, 0, 0, 0),
|
|
margin = new RectOffset(),
|
|
normal =
|
|
{
|
|
textColor = commonTextColor
|
|
}
|
|
};
|
|
|
|
headerStyle = new GUIStyle(EditorStyles.boldLabel)
|
|
{
|
|
fontSize = 14,
|
|
margin = new RectOffset(),
|
|
padding = new RectOffset(10, 0, 0, 0),
|
|
normal =
|
|
{
|
|
textColor = commonTextColor
|
|
}
|
|
};
|
|
|
|
headerLargeLabel = new GUIStyle(EditorStyles.boldLabel)
|
|
{
|
|
padding = new RectOffset(10, 0, 0, 0),
|
|
margin = new RectOffset(),
|
|
fontSize = 18,
|
|
normal =
|
|
{
|
|
textColor = headerTextColor
|
|
}
|
|
};
|
|
|
|
textLabel = new GUIStyle()
|
|
{
|
|
wordWrap = true,
|
|
margin = new RectOffset(),
|
|
padding = new RectOffset(10, 0, 0, 0),
|
|
normal =
|
|
{
|
|
textColor = commonTextColor
|
|
}
|
|
};
|
|
|
|
centerInputText = new GUIStyle(GUI.skin.textField)
|
|
{
|
|
alignment = TextAnchor.MiddleCenter,
|
|
fontSize = 12,
|
|
fixedHeight = 26
|
|
};
|
|
|
|
minimalButton = new GUIStyle(EditorStyles.miniButton)
|
|
{
|
|
fixedWidth = 130
|
|
};
|
|
|
|
simpleButton = new GUIStyle(GUI.skin.button)
|
|
{
|
|
fontSize = 12,
|
|
padding = new RectOffset(10, 10, 10, 10)
|
|
};
|
|
|
|
iconSection = new GUIStyle
|
|
{
|
|
margin = new RectOffset(0, 0, 0, 0)
|
|
};
|
|
|
|
discordIcon = Resources.Load<Texture2D>("icons_welcome/community");
|
|
discordText = new GUIContent(BoltWizardText.DISCORD_TEXT);
|
|
discordHeader = new GUIContent(BoltWizardText.DISCORD_HEADER);
|
|
|
|
bugtrackerIcon = Resources.Load<Texture2D>("icons_welcome/bugtracker");
|
|
bugtrackerText = new GUIContent(BoltWizardText.BUGTRACKER_TEXT);
|
|
bugtrackerHeader = new GUIContent(BoltWizardText.BUGTRACKER_HEADER);
|
|
|
|
documentationIcon = Resources.Load<Texture2D>("icons_welcome/documentation");
|
|
documentationText = new GUIContent(BoltWizardText.DOCUMENTATION_TEXT);
|
|
documentationHeader = new GUIContent(BoltWizardText.DOCUMENTATION_HEADER);
|
|
|
|
reviewIcon = Resources.Load<Texture2D>("icons_welcome/comments");
|
|
reviewText = new GUIContent(BoltWizardText.REVIEW_TEXT);
|
|
reviewHeader = new GUIContent(BoltWizardText.REVIEW_HEADER);
|
|
|
|
samplesIcon = Resources.Load<Texture2D>("icons_welcome/samples");
|
|
|
|
// Package List
|
|
|
|
packageInfo = new Dictionary<BoltInstalls, BoltPackage>
|
|
{
|
|
{
|
|
BoltInstalls.Core,
|
|
new BoltPackage()
|
|
{
|
|
name = "bolt_install",
|
|
title = "Core Package",
|
|
description = "Install core bolt package",
|
|
installTest = MainPackageInstalled,
|
|
packageFlags = PackageFlags.RunInitialSetup
|
|
}
|
|
},
|
|
|
|
// {
|
|
// BoltInstalls.Mobile,
|
|
// new BoltPackage()
|
|
// {
|
|
// name = "bolt_mobile_plugins",
|
|
// title = "Mobile Plugins",
|
|
// installTest = MobilePackageInstalled,
|
|
// description = "Install iOS / Android socket plugins"
|
|
// }
|
|
// },
|
|
|
|
{
|
|
BoltInstalls.XB1,
|
|
new BoltPackage()
|
|
{
|
|
name = "bolt_xb1",
|
|
title = "XBox One",
|
|
installTest = XB1PackageInstalled,
|
|
description = "Install XB1 support"
|
|
}
|
|
},
|
|
|
|
{
|
|
BoltInstalls.PS4,
|
|
new BoltPackage()
|
|
{
|
|
name = "bolt_ps4",
|
|
title = "Playstation 4",
|
|
installTest = PS4PackageInstalled,
|
|
description = "Install PS4 support"
|
|
}
|
|
},
|
|
|
|
{
|
|
BoltInstalls.Samples,
|
|
new BoltPackage()
|
|
{
|
|
name = "bolt_samples",
|
|
title = "Samples",
|
|
description = "Install bolt samples",
|
|
installTest = SamplesPackageInstalled,
|
|
packageFlags = PackageFlags.WarnForProjectOverwrite
|
|
}
|
|
}
|
|
};
|
|
|
|
// App ID
|
|
if (string.IsNullOrEmpty(BoltRuntimeSettings.instance.photonAppId))
|
|
{
|
|
AppIdOrEmail = "";
|
|
}
|
|
else if (IsAppId(BoltRuntimeSettings.instance.photonAppId))
|
|
{
|
|
AppIdOrEmail = BoltRuntimeSettings.instance.photonAppId;
|
|
}
|
|
|
|
Ready = true;
|
|
RunCompiler = false;
|
|
}
|
|
|
|
void OnGUI()
|
|
{
|
|
try
|
|
{
|
|
InitContent();
|
|
|
|
WindowPosition = position.position;
|
|
|
|
EditorGUILayout.BeginVertical();
|
|
DrawHeader();
|
|
|
|
// Content
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
// Nav menu
|
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.MaxWidth(NavMenuWidth),
|
|
GUILayout.MinWidth(NavMenuWidth));
|
|
DrawNavMenu();
|
|
EditorGUILayout.EndVertical();
|
|
|
|
// Main Content
|
|
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
|
DrawContent();
|
|
EditorGUILayout.EndVertical();
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.EndVertical();
|
|
|
|
if (GUI.changed)
|
|
{
|
|
Save();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
// ignored
|
|
}
|
|
}
|
|
|
|
private void DrawContent()
|
|
{
|
|
switch (currentStage)
|
|
{
|
|
case BoltSetupStage.Intro:
|
|
DrawIntro();
|
|
break;
|
|
case BoltSetupStage.ReleaseHistory:
|
|
DrawReleaseHistory();
|
|
break;
|
|
case BoltSetupStage.Photon:
|
|
DrawSetupPhoton();
|
|
break;
|
|
case BoltSetupStage.Bolt:
|
|
DrawSetupBolt();
|
|
break;
|
|
case BoltSetupStage.Support:
|
|
DrawSupport();
|
|
break;
|
|
}
|
|
|
|
GUILayout.FlexibleSpace();
|
|
DrawFooter();
|
|
}
|
|
|
|
private void DrawIntro()
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Label(BoltWizardText.WIZARD_INTRO, introStyle);
|
|
|
|
if (GUILayout.Button("Visit Getting Started Documentation", simpleButton))
|
|
{
|
|
OpenURL("https://doc.photonengine.com/en-us/bolt/")();
|
|
}
|
|
|
|
if (GUILayout.Button("Leave a review", simpleButton))
|
|
{
|
|
OpenURL("https://assetstore.unity.com/packages/tools/network/photon-bolt-free-127156")();
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
private void DrawSetupBolt()
|
|
{
|
|
DrawInputWithLabel("Bolt Setup", () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Space(5);
|
|
GUILayout.Label(BoltWizardText.PACKAGES, textLabel);
|
|
GUILayout.EndVertical();
|
|
}, false);
|
|
GUILayout.Space(15);
|
|
|
|
DrawInstallOption(BoltInstalls.Core);
|
|
|
|
EditorGUI.BeginDisabledGroup(!IsInstalled(BoltInstalls.Core));
|
|
|
|
// SAMPLES
|
|
DrawInstallOption(BoltInstalls.Samples);
|
|
|
|
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
|
|
|
|
// // MOBILE
|
|
// DrawInstallOption(BoltInstalls.Mobile);
|
|
|
|
// XB1
|
|
DrawInstallOption(BoltInstalls.XB1);
|
|
|
|
// PS4
|
|
DrawInstallOption(BoltInstalls.PS4);
|
|
|
|
EditorGUILayout.EndScrollView();
|
|
|
|
EditorGUI.EndDisabledGroup();
|
|
|
|
// Action
|
|
|
|
if (beforeNextCallback == null)
|
|
{
|
|
beforeNextCallback = () =>
|
|
{
|
|
if (!IsInstalled(BoltInstalls.Core))
|
|
{
|
|
ShowNotification(new GUIContent("You must install at least the Bolt Core package."));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
}
|
|
}
|
|
|
|
private void DrawReleaseHistory()
|
|
{
|
|
DrawInputWithLabel(string.Format("Version Changelog: {0}", ReleaseHistoryHeader), () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Space(5);
|
|
|
|
scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUIStyle.none, GUILayout.ExpandHeight(true),
|
|
GUILayout.ExpandWidth(true));
|
|
|
|
DrawReleaseHistoryItem("Added:", ReleaseHistoryTextAdded);
|
|
DrawReleaseHistoryItem("Changed:", ReleaseHistoryTextChanged);
|
|
DrawReleaseHistoryItem("Fixed:", ReleaseHistoryTextFixed);
|
|
DrawReleaseHistoryItem("Removed:", ReleaseHistoryTextRemoved);
|
|
|
|
GUILayout.EndScrollView();
|
|
|
|
GUILayout.EndVertical();
|
|
}, false, labelSize: 300);
|
|
}
|
|
|
|
private void DrawReleaseHistoryItem(string label, List<string> items)
|
|
{
|
|
if (items != null && items.Count > 0)
|
|
{
|
|
DrawInputWithLabel(label, () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Space(5);
|
|
|
|
foreach (var text in items)
|
|
{
|
|
GUILayout.Label(string.Format("- {0}.", text), textLabel);
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
}, false, true, 200);
|
|
}
|
|
}
|
|
|
|
private void DrawSetupPhoton()
|
|
{
|
|
DrawInputWithLabel("Photon Cloud Setup", () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Space(5);
|
|
GUILayout.Label(BoltWizardText.PHOTON, textLabel);
|
|
GUILayout.EndVertical();
|
|
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Label(BoltWizardText.PHOTON_DASH, textLabel);
|
|
if (GUILayout.Button("Visit Dashboard", minimalButton))
|
|
{
|
|
OpenURL("https://dashboard.photonengine.com/")();
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
}, false);
|
|
GUILayout.Space(15);
|
|
|
|
BoltRuntimeSettings settings = BoltRuntimeSettings.instance;
|
|
|
|
DrawInputWithLabel("Photon Bolt App ID or Email", () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
|
|
AppIdOrEmail = EditorGUILayout.TextField(AppIdOrEmail, centerInputText);
|
|
|
|
GUILayout.EndVertical();
|
|
}, false, true, 300);
|
|
|
|
DrawInputWithLabel("Region",
|
|
() =>
|
|
{
|
|
settings.photonCloudRegionIndex = EditorGUILayout.Popup(settings.photonCloudRegionIndex,
|
|
BoltRuntimeSettings.photonCloudRegions);
|
|
}, true, true);
|
|
|
|
DrawInputWithLabel("NAT Punchthrough Enabled",
|
|
() => { settings.photonUsePunch = BoltEditorGUI.Toggle(settings.photonUsePunch); }, true, true);
|
|
|
|
// Action
|
|
|
|
if (beforeNextCallback == null)
|
|
{
|
|
beforeNextCallback = () =>
|
|
{
|
|
if (requestingAppId)
|
|
{
|
|
BoltLog.Info("Please, wait until your request for a new AppID finishes.");
|
|
return false;
|
|
}
|
|
|
|
if (AccountService.IsValidEmail(AppIdOrEmail))
|
|
{
|
|
try
|
|
{
|
|
EditorUtility.DisplayProgressBar(BoltWizardText.CONNECTION_TITLE,
|
|
BoltWizardText.CONNECTION_INFO, 0.5f);
|
|
BoltLog.Info("Starting request");
|
|
|
|
requestingAppId = new AccountService().RegisterByEmail(
|
|
AppIdOrEmail,
|
|
new List<ServiceTypes>() {ServiceTypes.Bolt},
|
|
(response) =>
|
|
{
|
|
if (response.ReturnCode == AccountServiceReturnCodes.Success)
|
|
{
|
|
var appKey = response.ApplicationIds[((int) ServiceTypes.Bolt).ToString()];
|
|
|
|
settings.photonAppId = appKey;
|
|
AppIdOrEmail = appKey;
|
|
|
|
BoltLog.Info("You new App ID: {0}", AppIdOrEmail);
|
|
}
|
|
else
|
|
{
|
|
BoltLog.Warn(
|
|
"It was not possible to process your request, please go to the Photon Cloud Dashboard.");
|
|
BoltLog.Warn("Return Code: {0}",
|
|
AccountServiceReturnCodes.ReturnCodes[response.ReturnCode]);
|
|
}
|
|
|
|
requestingAppId = false;
|
|
EditorUtility.ClearProgressBar();
|
|
}, (err) =>
|
|
{
|
|
BoltLog.Error(err);
|
|
|
|
requestingAppId = false;
|
|
EditorUtility.ClearProgressBar();
|
|
});
|
|
|
|
if (requestingAppId)
|
|
{
|
|
BoltLog.Info("Requesting your new App ID");
|
|
}
|
|
else
|
|
{
|
|
BoltLog.Warn(
|
|
"It was not possible to process your request, please go to the Photon Cloud Dashboard.");
|
|
EditorUtility.ClearProgressBar();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
EditorUtility.DisplayDialog("Error", ex.Message, "ok");
|
|
}
|
|
}
|
|
else if (IsAppId(AppIdOrEmail))
|
|
{
|
|
settings.photonAppId = AppIdOrEmail;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
ShowNotification(new GUIContent("Please specify a valid Photon Bolt App ID or Email."));
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
}
|
|
|
|
private void DrawSupport()
|
|
{
|
|
DrawInputWithLabel("Bolt Support", () =>
|
|
{
|
|
GUILayout.BeginVertical();
|
|
GUILayout.Space(5);
|
|
GUILayout.Label(BoltWizardText.SUPPORT, textLabel);
|
|
GUILayout.EndVertical();
|
|
}, false);
|
|
GUILayout.Space(15);
|
|
|
|
DrawStepOption(discordIcon, discordHeader, discordText,
|
|
callback: OpenURL("https://discord.gg/0ya6ZpOvnShSCtbb"));
|
|
DrawStepOption(bugtrackerIcon, bugtrackerHeader, bugtrackerText,
|
|
callback: OpenURL("https://github.com/BoltEngine/Bolt-Tracker"));
|
|
DrawStepOption(documentationIcon, documentationHeader, documentationText,
|
|
callback: OpenURL("https://doc.photonengine.com/en-us/bolt/current/setup/overview"));
|
|
DrawStepOption(reviewIcon, reviewHeader, reviewText,
|
|
callback: OpenURL("https://assetstore.unity.com/packages/tools/network/photon-bolt-free-127156"));
|
|
|
|
// Action
|
|
|
|
if (beforeNextCallback == null)
|
|
{
|
|
beforeNextCallback = () =>
|
|
{
|
|
RunCompiler = EditorUtility.DisplayDialog(BoltWizardText.FINISH_TITLE, BoltWizardText.FINISH_QUESTION,
|
|
"Yes", "No");
|
|
return true;
|
|
};
|
|
}
|
|
}
|
|
|
|
private void DrawNavMenu()
|
|
{
|
|
GUILayout.Space(5);
|
|
DrawMenuHeader("Installation Steps");
|
|
GUILayout.Space(10);
|
|
|
|
DrawStepOption(introIcon, new GUIContent("Bolt Wizard Intro"),
|
|
active: currentStage ==
|
|
BoltSetupStage.Intro);
|
|
|
|
DrawStepOption(releaseIcon, new GUIContent("Release History"),
|
|
active: currentStage ==
|
|
BoltSetupStage.ReleaseHistory);
|
|
|
|
DrawStepOption(photonCloudIcon, new GUIContent("Photon Cloud"),
|
|
active: currentStage ==
|
|
BoltSetupStage.Photon);
|
|
|
|
DrawStepOption(boltIcon, new GUIContent("Bolt"),
|
|
active: currentStage ==
|
|
BoltSetupStage.Bolt);
|
|
|
|
DrawStepOption(discordIcon, new GUIContent("Support"),
|
|
active: currentStage ==
|
|
BoltSetupStage.Support);
|
|
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.Label(BoltNetwork.CurrentVersion, textLabel);
|
|
GUILayout.Space(5);
|
|
}
|
|
|
|
void DrawHeader()
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.Label(Resources.Load<Texture2D>("BoltLogo"), GUILayout.Width(200), GUILayout.Height(109));
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
void DrawFooter()
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.FlexibleSpace();
|
|
|
|
EditorGUI.BeginDisabledGroup((int) currentStage == 1);
|
|
|
|
#if !BOLT_CLOUD
|
|
if (currentStage == BoltSetupStage.Photon)
|
|
{
|
|
if (GUILayout.Button("Skip", GUILayout.Width(ButtonWidth)))
|
|
{
|
|
NextStep();
|
|
beforeNextCallback = null;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (GUILayout.Button("Back", GUILayout.Width(ButtonWidth)))
|
|
{
|
|
beforeNextCallback = null;
|
|
BackStep();
|
|
}
|
|
|
|
EditorGUI.EndDisabledGroup();
|
|
|
|
var nextLabel = "Next";
|
|
|
|
switch (currentStage)
|
|
{
|
|
case BoltSetupStage.Photon:
|
|
nextLabel = AccountService.IsValidEmail(AppIdOrEmail) ? "Register by Email" : nextLabel;
|
|
break;
|
|
case BoltSetupStage.Support:
|
|
nextLabel = "Done";
|
|
break;
|
|
default:
|
|
nextLabel = "Next";
|
|
break;
|
|
}
|
|
|
|
if (GUILayout.Button(nextLabel, GUILayout.Width(ButtonWidth)))
|
|
{
|
|
if (beforeNextCallback == null || beforeNextCallback())
|
|
{
|
|
if (currentStage == BoltSetupStage.Support)
|
|
{
|
|
EditorPrefs.SetBool(FirstStartupKey, true);
|
|
Close();
|
|
|
|
if (RunCompiler)
|
|
{
|
|
BoltMenuItems.RunCompiler();
|
|
}
|
|
}
|
|
|
|
NextStep();
|
|
beforeNextCallback = null;
|
|
}
|
|
}
|
|
|
|
GUILayout.Space(5);
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.Space(5);
|
|
}
|
|
|
|
// Utils
|
|
|
|
private void Save()
|
|
{
|
|
if (watch.ElapsedMilliseconds > 5000)
|
|
{
|
|
watch.Reset();
|
|
watch.Start();
|
|
|
|
EditorUtility.SetDirty(BoltRuntimeSettings.instance);
|
|
AssetDatabase.SaveAssets();
|
|
}
|
|
}
|
|
|
|
void DrawMenuHeader(String text)
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.FlexibleSpace();
|
|
|
|
GUILayout.Label(text, headerLargeLabel);
|
|
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
void DrawInputWithLabel(String label, Action gui, bool horizontal = true, bool box = false, int labelSize = 220)
|
|
{
|
|
GUILayout.Space(10);
|
|
|
|
if (horizontal)
|
|
{
|
|
if (box)
|
|
{
|
|
GUILayout.BeginHorizontal(stepStyle);
|
|
}
|
|
else
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (box)
|
|
{
|
|
GUILayout.BeginVertical(stepStyle);
|
|
}
|
|
else
|
|
{
|
|
GUILayout.BeginVertical();
|
|
}
|
|
}
|
|
|
|
GUILayout.Label(label, headerStyle, GUILayout.Width(labelSize));
|
|
//GUILayout.Space(5);
|
|
|
|
gui();
|
|
|
|
GUILayout.Space(5);
|
|
|
|
if (horizontal)
|
|
{
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
else
|
|
{
|
|
GUILayout.EndVertical();
|
|
}
|
|
}
|
|
|
|
void DrawInstallOption(BoltInstalls install)
|
|
{
|
|
BoltPackage package = packageInfo[install];
|
|
|
|
Action action = () =>
|
|
{
|
|
if (package.installTest())
|
|
{
|
|
ShowNotification(new GUIContent("Package already installed"));
|
|
return;
|
|
}
|
|
|
|
Install(package);
|
|
};
|
|
|
|
bool packageExists = PackageExists(package.name);
|
|
|
|
Action ignoredAction;
|
|
if (packageExists == true)
|
|
{
|
|
ignoredAction = () => { ShowNotification(new GUIContent("One of the dependencies is missing")); };
|
|
}
|
|
else
|
|
{
|
|
if (install == BoltInstalls.Core)
|
|
{
|
|
ignoredAction = () =>
|
|
{
|
|
ShowNotification(new GUIContent("Bolt Core is no longer required. You are ready to go."));
|
|
};
|
|
}
|
|
else
|
|
{
|
|
ignoredAction = () =>
|
|
{
|
|
ShowNotification(new GUIContent("Please contact us at developer@photonengine.com"));
|
|
};
|
|
}
|
|
|
|
EditorGUI.BeginDisabledGroup(true);
|
|
}
|
|
|
|
DrawStepOption(samplesIcon, new GUIContent(package.title), new GUIContent(package.description),
|
|
package.installTest(), action, ignoredAction);
|
|
|
|
if (packageExists == false)
|
|
{
|
|
EditorGUI.EndDisabledGroup();
|
|
}
|
|
}
|
|
|
|
void DrawStepOption(Texture2D icon, GUIContent header, GUIContent description = null, bool? active = null,
|
|
Action callback = null, Action ignoredCallback = null)
|
|
{
|
|
GUILayout.BeginHorizontal(stepStyle);
|
|
|
|
if (icon != null)
|
|
{
|
|
GUILayout.Label(icon, iconSection, GUILayout.Width(32), GUILayout.Height(32));
|
|
}
|
|
|
|
var height = icon != null ? 32 : 16;
|
|
|
|
GUILayout.BeginVertical(GUILayout.MinHeight(height));
|
|
GUILayout.FlexibleSpace();
|
|
|
|
GUILayout.Label(header, headerLabel, GUILayout.MinWidth(120));
|
|
|
|
if (description != null)
|
|
{
|
|
GUILayout.Label(description, textLabel);
|
|
}
|
|
|
|
GUILayout.FlexibleSpace();
|
|
GUILayout.EndVertical();
|
|
|
|
if (active == true)
|
|
{
|
|
GUILayout.Label(activeIcon, iconSection, GUILayout.Width(height), GUILayout.Height(height));
|
|
}
|
|
else if (active == false)
|
|
{
|
|
GUILayout.Label(inactiveIcon, iconSection, GUILayout.Width(height), GUILayout.Height(height));
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
|
|
if (callback != null)
|
|
{
|
|
var rect = GUILayoutUtility.GetLastRect();
|
|
EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link);
|
|
|
|
if (rect.Contains(Event.current.mousePosition))
|
|
{
|
|
if (Event.current.type == EventType.MouseDown)
|
|
{
|
|
callback();
|
|
GUIUtility.ExitGUI();
|
|
}
|
|
else if (Event.current.type == EventType.Ignore && Event.current.rawType == EventType.MouseDown)
|
|
{
|
|
if (ignoredCallback != null)
|
|
{
|
|
ignoredCallback();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void NextStep()
|
|
{
|
|
currentStage += (int) currentStage < Enum.GetValues(typeof(BoltSetupStage)).Length ? 1 : 0;
|
|
}
|
|
|
|
void BackStep()
|
|
{
|
|
currentStage -= (int) currentStage > 1 ? 1 : 0;
|
|
}
|
|
|
|
bool IsInstalled(params BoltInstalls[] installs)
|
|
{
|
|
foreach (var pack in installs)
|
|
{
|
|
if (!packageInfo[pack].installTest())
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void Install(BoltPackage package)
|
|
{
|
|
string packageName = package.name;
|
|
PackageFlags flags = package.packageFlags;
|
|
|
|
if ((flags & PackageFlags.WarnForProjectOverwrite) == PackageFlags.WarnForProjectOverwrite)
|
|
{
|
|
if (ProjectExists())
|
|
{
|
|
if (EditorUtility.DisplayDialog("Warning",
|
|
"Importing this package will overwrite the existing bolt project file that contains all your states, events, etc. Are you sure?",
|
|
"Yes", "No") == false)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((flags & PackageFlags.RunInitialSetup) == PackageFlags.RunInitialSetup)
|
|
{
|
|
InitialSetup();
|
|
}
|
|
|
|
AssetDatabase.ImportPackage(PackagePath(packageName), false);
|
|
|
|
currentStage = BoltSetupStage.Bolt;
|
|
}
|
|
}
|