238 lines
7.4 KiB
C#
238 lines
7.4 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace FMODUnity
|
|
{
|
|
public class BankRefreshWindow : EditorWindow
|
|
{
|
|
private static BankRefreshWindow instance = null;
|
|
|
|
private SerializedObject serializedSettings;
|
|
private SerializedProperty cooldown;
|
|
private SerializedProperty showWindow;
|
|
|
|
private bool readyToRefreshBanks = false;
|
|
private float closeTime = float.MaxValue;
|
|
private string lastRefreshError = null;
|
|
|
|
private const float CloseDelay = 5;
|
|
|
|
public static bool IsVisible { get { return instance != null; } }
|
|
|
|
public static bool ReadyToRefreshBanks { get { return instance == null || instance.readyToRefreshBanks; } }
|
|
|
|
public static void ShowWindow()
|
|
{
|
|
if (instance == null)
|
|
{
|
|
instance = CreateInstance<BankRefreshWindow>();
|
|
instance.titleContent = new GUIContent(L10n.Tr("FMOD Bank Refresh Status"));
|
|
instance.minSize = new Vector2(400, 200);
|
|
instance.maxSize = new Vector2(1000, 200);
|
|
|
|
instance.ShowUtility();
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
serializedSettings = new SerializedObject(Settings.Instance);
|
|
cooldown = serializedSettings.FindProperty("BankRefreshCooldown");
|
|
showWindow = serializedSettings.FindProperty("ShowBankRefreshWindow");
|
|
|
|
// instance is set to null when scripts are recompiled
|
|
if (instance == null)
|
|
{
|
|
instance = this;
|
|
}
|
|
else if (instance != this)
|
|
{
|
|
Close();
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (instance == this)
|
|
{
|
|
instance = null;
|
|
}
|
|
}
|
|
|
|
private void OnInspectorUpdate()
|
|
{
|
|
Repaint();
|
|
|
|
if (BankRefresher.TimeUntilBankRefresh() != float.MaxValue)
|
|
{
|
|
closeTime = float.MaxValue;
|
|
}
|
|
|
|
if (Time.realtimeSinceStartup > closeTime)
|
|
{
|
|
Close();
|
|
}
|
|
}
|
|
|
|
public static void HandleBankRefresh(string error)
|
|
{
|
|
if (error != null)
|
|
{
|
|
RuntimeUtils.DebugLogErrorFormat("FMOD: Bank refresh failed: {0}", error);
|
|
}
|
|
|
|
if (instance != null)
|
|
{
|
|
instance.readyToRefreshBanks = false;
|
|
instance.lastRefreshError = error;
|
|
|
|
if (error == null)
|
|
{
|
|
instance.closeTime = Time.realtimeSinceStartup + CloseDelay;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnGUI()
|
|
{
|
|
serializedSettings.Update();
|
|
|
|
DrawStatus();
|
|
|
|
GUILayout.FlexibleSpace();
|
|
|
|
SettingsEditor.DisplayBankRefreshSettings(cooldown, showWindow, false);
|
|
|
|
DrawButtons();
|
|
|
|
serializedSettings.ApplyModifiedProperties();
|
|
}
|
|
|
|
private bool ConsumeEscapeKey()
|
|
{
|
|
if ((focusedWindow == this) && Event.current.isKey && Event.current.keyCode == KeyCode.Escape)
|
|
{
|
|
Event.current.Use();
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private void DrawStatus()
|
|
{
|
|
GUIStyle labelStyle = new GUIStyle(EditorStyles.whiteLargeLabel);
|
|
labelStyle.alignment = TextAnchor.MiddleCenter;
|
|
|
|
GUIStyle largeErrorStyle = new GUIStyle(labelStyle);
|
|
largeErrorStyle.normal.textColor = Color.red;
|
|
|
|
GUIStyle errorStyle = new GUIStyle(GUI.skin.box);
|
|
errorStyle.alignment = TextAnchor.UpperLeft;
|
|
errorStyle.wordWrap = true;
|
|
errorStyle.normal.textColor = Color.red;
|
|
|
|
float timeSinceFileChange = BankRefresher.TimeSinceSourceFileChange();
|
|
|
|
if (timeSinceFileChange != float.MaxValue)
|
|
{
|
|
GUILayout.Label(string.Format(L10n.Tr("The FMOD source banks changed {0} ago."),
|
|
EditorUtils.DurationString(timeSinceFileChange)), labelStyle);
|
|
|
|
float timeUntilBankRefresh = BankRefresher.TimeUntilBankRefresh();
|
|
|
|
if (timeUntilBankRefresh == 0)
|
|
{
|
|
GUILayout.Label(L10n.Tr("Refreshing banks now..."), labelStyle);
|
|
readyToRefreshBanks = true;
|
|
}
|
|
else if (timeUntilBankRefresh != float.MaxValue)
|
|
{
|
|
if (DrawCountdown(L10n.Tr("Refreshing banks"), timeUntilBankRefresh, Settings.Instance.BankRefreshCooldown, labelStyle)
|
|
|| ConsumeEscapeKey())
|
|
{
|
|
BankRefresher.DisableAutoRefresh();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GUILayout.Label(L10n.Tr("Would you like to refresh banks?"), labelStyle);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lastRefreshError == null)
|
|
{
|
|
GUILayout.Label(L10n.Tr("The FMOD banks are up to date."), labelStyle);
|
|
}
|
|
else
|
|
{
|
|
GUILayout.Label(L10n.Tr("Bank refresh failed:"), largeErrorStyle);
|
|
GUILayout.Box(lastRefreshError, errorStyle, GUILayout.ExpandWidth(true));
|
|
}
|
|
}
|
|
|
|
if (closeTime != float.MaxValue)
|
|
{
|
|
float timeUntilClose = Mathf.Max(0, closeTime - Time.realtimeSinceStartup);
|
|
|
|
if (DrawCountdown(L10n.Tr("Closing"), timeUntilClose, CloseDelay, labelStyle) || ConsumeEscapeKey())
|
|
{
|
|
closeTime = float.MaxValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static bool DrawCountdown(string text, float remainingTime, float totalTime, GUIStyle labelStyle)
|
|
{
|
|
GUILayout.Label(string.Format(L10n.Tr("{0} in {1}..."), text, EditorUtils.DurationString(remainingTime)), labelStyle);
|
|
|
|
const float boxHeight = 2;
|
|
|
|
Rect controlRect = EditorGUILayout.GetControlRect(false, boxHeight * 2);
|
|
|
|
Rect boxRect = controlRect;
|
|
boxRect.width *= remainingTime / totalTime;
|
|
boxRect.x += (controlRect.width - boxRect.width) / 2;
|
|
boxRect.height = 2;
|
|
|
|
GUI.DrawTexture(boxRect, EditorGUIUtility.whiteTexture);
|
|
|
|
GUIContent cancelContent = new GUIContent(L10n.Tr("Cancel"));
|
|
|
|
controlRect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * 2);
|
|
|
|
Rect buttonRect = controlRect;
|
|
buttonRect.width = 100;
|
|
buttonRect.x += (controlRect.width - buttonRect.width) / 2;
|
|
|
|
return GUI.Button(buttonRect, cancelContent);
|
|
}
|
|
|
|
private void DrawButtons()
|
|
{
|
|
Rect rect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight * 2);
|
|
|
|
int buttonCount = 2;
|
|
|
|
Rect closeRect = rect;
|
|
closeRect.width = rect.width / buttonCount;
|
|
|
|
Rect refreshRect = rect;
|
|
refreshRect.xMin = closeRect.xMax;
|
|
|
|
if (GUI.Button(closeRect, L10n.Tr("Close")))
|
|
{
|
|
Close();
|
|
}
|
|
|
|
if (GUI.Button(refreshRect, L10n.Tr("Refresh Banks Now")))
|
|
{
|
|
EventManager.RefreshBanks();
|
|
}
|
|
}
|
|
}
|
|
}
|