|
|
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
|