297 lines
11 KiB
C#
297 lines
11 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using UnityEditor.Collaboration;
|
|||
|
using UnityEditor.Connect;
|
|||
|
using UnityEditor.Web;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace UnityEditor
|
|||
|
{
|
|||
|
internal class CollabToolbarButton : SubToolbar, IDisposable
|
|||
|
{
|
|||
|
// Must match s_CollabIcon array
|
|||
|
enum CollabToolbarState
|
|||
|
{
|
|||
|
NeedToEnableCollab,
|
|||
|
UpToDate,
|
|||
|
Conflict,
|
|||
|
OperationError,
|
|||
|
ServerHasChanges,
|
|||
|
FilesToPush,
|
|||
|
InProgress,
|
|||
|
Disabled,
|
|||
|
Offline
|
|||
|
}
|
|||
|
|
|||
|
private class CollabToolbarContent
|
|||
|
{
|
|||
|
readonly string m_iconName;
|
|||
|
readonly string m_toolTip;
|
|||
|
readonly CollabToolbarState m_state;
|
|||
|
|
|||
|
static Dictionary<CollabToolbarContent, GUIContent> m_CollabIcons;
|
|||
|
|
|||
|
public CollabToolbarState RegisteredForState
|
|||
|
{
|
|||
|
get { return m_state; }
|
|||
|
}
|
|||
|
|
|||
|
public GUIContent GuiContent
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (m_CollabIcons == null)
|
|||
|
{
|
|||
|
m_CollabIcons = new Dictionary<CollabToolbarContent, GUIContent>();
|
|||
|
}
|
|||
|
|
|||
|
if (!m_CollabIcons.ContainsKey(this))
|
|||
|
{
|
|||
|
m_CollabIcons.Add(this, EditorGUIUtility.TrTextContentWithIcon("Collab", m_toolTip, m_iconName));
|
|||
|
}
|
|||
|
|
|||
|
return m_CollabIcons[this];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public CollabToolbarContent(CollabToolbarState state, string iconName, string toolTip)
|
|||
|
{
|
|||
|
m_state = state;
|
|||
|
m_iconName = iconName;
|
|||
|
m_toolTip = toolTip;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CollabToolbarContent[] m_toolbarContents;
|
|||
|
CollabToolbarState m_CollabToolbarState = CollabToolbarState.UpToDate;
|
|||
|
const float kCollabButtonWidth = 78.0f;
|
|||
|
ButtonWithAnimatedIconRotation m_CollabButton;
|
|||
|
string m_DynamicTooltip;
|
|||
|
static bool m_ShowCollabTooltip = false;
|
|||
|
|
|||
|
private GUIContent currentCollabContent
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
CollabToolbarContent toolbarContent =
|
|||
|
m_toolbarContents.FirstOrDefault(c => c.RegisteredForState.Equals(m_CollabToolbarState));
|
|||
|
GUIContent content = new GUIContent(toolbarContent == null? m_toolbarContents.First().GuiContent : toolbarContent.GuiContent);
|
|||
|
if (!m_ShowCollabTooltip)
|
|||
|
{
|
|||
|
content.tooltip = null;
|
|||
|
}
|
|||
|
else if (m_DynamicTooltip != "")
|
|||
|
{
|
|||
|
content.tooltip = m_DynamicTooltip;
|
|||
|
}
|
|||
|
|
|||
|
if (Collab.instance.AreTestsRunning())
|
|||
|
{
|
|||
|
content.text = "CTF";
|
|||
|
}
|
|||
|
|
|||
|
return content;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public CollabToolbarButton()
|
|||
|
{
|
|||
|
m_toolbarContents = new[]
|
|||
|
{
|
|||
|
new CollabToolbarContent(CollabToolbarState.NeedToEnableCollab, "CollabNew", " You need to enable collab."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.UpToDate, "Collab", " You are up to date."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.Conflict, "CollabConflict", " Please fix your conflicts prior to publishing."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.OperationError, "CollabError", " Last operation failed. Please retry later."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.ServerHasChanges, "CollabPull", " Please update, there are server changes."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.FilesToPush, "CollabPush", " You have files to publish."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.InProgress, "CollabProgress", " Operation in progress."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.Disabled, "CollabNew", " Collab is disabled."),
|
|||
|
new CollabToolbarContent(CollabToolbarState.Offline, "CollabNew", " Please check your network connection.")
|
|||
|
};
|
|||
|
|
|||
|
Collab.instance.StateChanged += OnCollabStateChanged;
|
|||
|
UnityConnect.instance.StateChanged += OnUnityConnectStateChanged;
|
|||
|
UnityConnect.instance.UserStateChanged += OnUnityConnectUserStateChanged;
|
|||
|
}
|
|||
|
|
|||
|
void OnUnityConnectUserStateChanged(UserInfo state)
|
|||
|
{
|
|||
|
UpdateCollabToolbarState();
|
|||
|
}
|
|||
|
|
|||
|
void OnUnityConnectStateChanged(ConnectInfo state)
|
|||
|
{
|
|||
|
UpdateCollabToolbarState();
|
|||
|
}
|
|||
|
|
|||
|
public override void OnGUI(Rect rect)
|
|||
|
{
|
|||
|
DoCollabDropDown(rect);
|
|||
|
}
|
|||
|
|
|||
|
Rect GUIToScreenRect(Rect guiRect)
|
|||
|
{
|
|||
|
Vector2 screenPoint = GUIUtility.GUIToScreenPoint(new Vector2(guiRect.x, guiRect.y));
|
|||
|
guiRect.x = screenPoint.x;
|
|||
|
guiRect.y = screenPoint.y;
|
|||
|
return guiRect;
|
|||
|
}
|
|||
|
|
|||
|
void ShowPopup(Rect rect)
|
|||
|
{
|
|||
|
// window should be centered on the button
|
|||
|
ReserveRight(kCollabButtonWidth / 2, ref rect);
|
|||
|
ReserveBottom(5, ref rect);
|
|||
|
// calculate screen rect before saving assets since it might open the AssetSaveDialog window
|
|||
|
var screenRect = GUIToScreenRect(rect);
|
|||
|
// save all the assets
|
|||
|
AssetDatabase.SaveAssets();
|
|||
|
if (Collab.ShowToolbarAtPosition != null && Collab.ShowToolbarAtPosition(screenRect))
|
|||
|
{
|
|||
|
GUIUtility.ExitGUI();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void DoCollabDropDown(Rect rect)
|
|||
|
{
|
|||
|
UpdateCollabToolbarState();
|
|||
|
GUIStyle collabButtonStyle = "OffsetDropDown";
|
|||
|
bool showPopup = Toolbar.requestShowCollabToolbar;
|
|||
|
Toolbar.requestShowCollabToolbar = false;
|
|||
|
|
|||
|
bool enable = !EditorApplication.isPlaying;
|
|||
|
|
|||
|
using (new EditorGUI.DisabledScope(!enable))
|
|||
|
{
|
|||
|
bool animate = m_CollabToolbarState == CollabToolbarState.InProgress;
|
|||
|
|
|||
|
EditorGUIUtility.SetIconSize(new Vector2(12, 12));
|
|||
|
if (GetCollabButton().OnGUI(rect, currentCollabContent, animate, collabButtonStyle))
|
|||
|
{
|
|||
|
showPopup = true;
|
|||
|
}
|
|||
|
EditorGUIUtility.SetIconSize(Vector2.zero);
|
|||
|
}
|
|||
|
|
|||
|
if (m_CollabToolbarState == CollabToolbarState.Disabled)
|
|||
|
return;
|
|||
|
|
|||
|
if (showPopup)
|
|||
|
{
|
|||
|
ShowPopup(rect);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void OnCollabStateChanged(CollabInfo info)
|
|||
|
{
|
|||
|
UpdateCollabToolbarState();
|
|||
|
}
|
|||
|
|
|||
|
public void UpdateCollabToolbarState()
|
|||
|
{
|
|||
|
var currentCollabState = CollabToolbarState.UpToDate;
|
|||
|
bool networkAvailable = UnityConnect.instance.connectInfo.online && UnityConnect.instance.connectInfo.loggedIn;
|
|||
|
m_DynamicTooltip = "";
|
|||
|
|
|||
|
if (UnityConnect.instance.isDisableCollabWindow)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.Disabled;
|
|||
|
}
|
|||
|
else if (networkAvailable)
|
|||
|
{
|
|||
|
Collab collab = Collab.instance;
|
|||
|
CollabInfo currentInfo = collab.collabInfo;
|
|||
|
UnityErrorInfo errInfo;
|
|||
|
bool error = false;
|
|||
|
if (collab.GetError((UnityConnect.UnityErrorFilter.ByContext | UnityConnect.UnityErrorFilter.ByChild), out errInfo))
|
|||
|
{
|
|||
|
error = (errInfo.priority <= (int)UnityConnect.UnityErrorPriority.Error);
|
|||
|
m_DynamicTooltip = errInfo.shortMsg;
|
|||
|
}
|
|||
|
|
|||
|
if (!currentInfo.ready)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.InProgress;
|
|||
|
}
|
|||
|
else if (error)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.OperationError;
|
|||
|
}
|
|||
|
else if (currentInfo.inProgress)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.InProgress;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bool collabEnable = Collab.instance.IsCollabEnabledForCurrentProject();
|
|||
|
|
|||
|
if (UnityConnect.instance.projectInfo.projectBound == false || !collabEnable)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.NeedToEnableCollab;
|
|||
|
}
|
|||
|
else if (currentInfo.update)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.ServerHasChanges;
|
|||
|
}
|
|||
|
else if (currentInfo.conflict)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.Conflict;
|
|||
|
}
|
|||
|
else if (currentInfo.publish)
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.FilesToPush;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
currentCollabState = CollabToolbarState.Offline;
|
|||
|
}
|
|||
|
|
|||
|
if (Collab.IsToolbarVisible != null)
|
|||
|
{
|
|||
|
if (currentCollabState != m_CollabToolbarState ||
|
|||
|
Collab.IsToolbarVisible() == m_ShowCollabTooltip)
|
|||
|
{
|
|||
|
m_CollabToolbarState = currentCollabState;
|
|||
|
m_ShowCollabTooltip = !Collab.IsToolbarVisible();
|
|||
|
Toolbar.RepaintToolbar();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void ReserveRight(float width, ref Rect pos)
|
|||
|
{
|
|||
|
pos.x += width;
|
|||
|
}
|
|||
|
|
|||
|
void ReserveBottom(float height, ref Rect pos)
|
|||
|
{
|
|||
|
pos.y += height;
|
|||
|
}
|
|||
|
|
|||
|
ButtonWithAnimatedIconRotation GetCollabButton()
|
|||
|
{
|
|||
|
if (m_CollabButton == null)
|
|||
|
{
|
|||
|
const int repaintsPerSecond = 20;
|
|||
|
const float animSpeed = 500f;
|
|||
|
const bool mouseDownButton = true;
|
|||
|
m_CollabButton = new ButtonWithAnimatedIconRotation(() => (float)EditorApplication.timeSinceStartup * animSpeed, Toolbar.RepaintToolbar, repaintsPerSecond, mouseDownButton);
|
|||
|
}
|
|||
|
|
|||
|
return m_CollabButton;
|
|||
|
}
|
|||
|
|
|||
|
public void Dispose()
|
|||
|
{
|
|||
|
Collab.instance.StateChanged -= OnCollabStateChanged;
|
|||
|
UnityConnect.instance.StateChanged -= OnUnityConnectStateChanged;
|
|||
|
UnityConnect.instance.UserStateChanged -= OnUnityConnectUserStateChanged;
|
|||
|
|
|||
|
if (m_CollabButton != null)
|
|||
|
m_CollabButton.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
} // namespace
|