331 lines
10 KiB
C#
331 lines
10 KiB
C#
|
using System;
|
||
|
using System.Linq;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEditor.Collaboration;
|
||
|
|
||
|
#if UNITY_2019_1_OR_NEWER
|
||
|
using UnityEditor.UIElements;
|
||
|
using UnityEngine.UIElements;
|
||
|
#else
|
||
|
using UnityEditor.Experimental.UIElements;
|
||
|
using UnityEngine.Experimental.UIElements;
|
||
|
using UnityEngine.Experimental.UIElements.StyleEnums;
|
||
|
#endif
|
||
|
|
||
|
using UnityEngine;
|
||
|
using UnityEditor.Connect;
|
||
|
|
||
|
namespace UnityEditor
|
||
|
{
|
||
|
internal class CollabHistoryWindow : EditorWindow, ICollabHistoryWindow
|
||
|
{
|
||
|
#if UNITY_2019_1_OR_NEWER
|
||
|
private const string ResourcesPath = "Packages/com.unity.collab-proxy/Editor/Resources/Styles/";
|
||
|
#else
|
||
|
private const string ResourcesPath = "StyleSheets/";
|
||
|
#endif
|
||
|
|
||
|
|
||
|
const string kWindowTitle = "Collab History";
|
||
|
const string kServiceUrl = "developer.cloud.unity3d.com";
|
||
|
|
||
|
[MenuItem("Window/Asset Management/Collab History", false, 1)]
|
||
|
public static void ShowHistoryWindow()
|
||
|
{
|
||
|
EditorWindow.GetWindow<CollabHistoryWindow>(kWindowTitle);
|
||
|
}
|
||
|
|
||
|
[MenuItem("Window/Asset Management/Collab History", true)]
|
||
|
public static bool ValidateShowHistoryWindow()
|
||
|
{
|
||
|
return Collab.instance.IsCollabEnabledForCurrentProject();
|
||
|
}
|
||
|
|
||
|
CollabHistoryPresenter m_Presenter;
|
||
|
Dictionary<HistoryState, VisualElement> m_Views;
|
||
|
List<CollabHistoryItem> m_HistoryItems = new List<CollabHistoryItem>();
|
||
|
HistoryState m_State;
|
||
|
VisualElement m_Container;
|
||
|
PagedListView m_Pager;
|
||
|
ScrollView m_HistoryView;
|
||
|
int m_ItemsPerPage = 5;
|
||
|
string m_InProgressRev;
|
||
|
bool m_RevisionActionsEnabled;
|
||
|
|
||
|
public CollabHistoryWindow()
|
||
|
{
|
||
|
minSize = new Vector2(275, 50);
|
||
|
}
|
||
|
|
||
|
public void OnEnable()
|
||
|
{
|
||
|
SetupGUI();
|
||
|
name = "CollabHistory";
|
||
|
|
||
|
if (m_Presenter == null)
|
||
|
{
|
||
|
m_Presenter = new CollabHistoryPresenter(this, new CollabHistoryItemFactory(), new RevisionsService(Collab.instance, UnityConnect.instance));
|
||
|
}
|
||
|
m_Presenter.OnWindowEnabled();
|
||
|
}
|
||
|
|
||
|
public void OnDisable()
|
||
|
{
|
||
|
m_Presenter.OnWindowDisabled();
|
||
|
}
|
||
|
|
||
|
public bool revisionActionsEnabled
|
||
|
{
|
||
|
get { return m_RevisionActionsEnabled; }
|
||
|
set
|
||
|
{
|
||
|
if (m_RevisionActionsEnabled == value)
|
||
|
return;
|
||
|
|
||
|
m_RevisionActionsEnabled = value;
|
||
|
foreach (var historyItem in m_HistoryItems)
|
||
|
{
|
||
|
historyItem.RevisionActionsEnabled = value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void AddStyleSheetPath(VisualElement root, string path)
|
||
|
{
|
||
|
#if UNITY_2019_1_OR_NEWER
|
||
|
root.styleSheets.Add(EditorGUIUtility.Load(path) as StyleSheet);
|
||
|
#else
|
||
|
root.AddStyleSheetPath(path);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
public void SetupGUI()
|
||
|
{
|
||
|
#if UNITY_2019_1_OR_NEWER
|
||
|
var root = this.rootVisualElement;
|
||
|
#else
|
||
|
var root = this.GetRootVisualContainer();
|
||
|
#endif
|
||
|
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryCommon.uss");
|
||
|
if (EditorGUIUtility.isProSkin)
|
||
|
{
|
||
|
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryDark.uss");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
AddStyleSheetPath(root, ResourcesPath + "CollabHistoryLight.uss");
|
||
|
}
|
||
|
|
||
|
m_Container = new VisualElement();
|
||
|
m_Container.StretchToParentSize();
|
||
|
root.Add(m_Container);
|
||
|
|
||
|
m_Pager = new PagedListView()
|
||
|
{
|
||
|
name = "PagedElement",
|
||
|
pageSize = m_ItemsPerPage
|
||
|
};
|
||
|
|
||
|
var errorView = new StatusView()
|
||
|
{
|
||
|
message = "An Error Occurred",
|
||
|
icon = EditorGUIUtility.LoadIconRequired("Collab.Warning") as Texture,
|
||
|
};
|
||
|
|
||
|
var noInternetView = new StatusView()
|
||
|
{
|
||
|
message = "No Internet Connection",
|
||
|
icon = EditorGUIUtility.LoadIconRequired("Collab.NoInternet") as Texture,
|
||
|
};
|
||
|
|
||
|
var maintenanceView = new StatusView()
|
||
|
{
|
||
|
message = "Maintenance",
|
||
|
};
|
||
|
|
||
|
var loginView = new StatusView()
|
||
|
{
|
||
|
message = "Sign in to access Collaborate",
|
||
|
buttonText = "Sign in...",
|
||
|
callback = SignInClick,
|
||
|
};
|
||
|
|
||
|
var noSeatView = new StatusView()
|
||
|
{
|
||
|
message = "Ask your project owner for access to Unity Teams",
|
||
|
buttonText = "Learn More",
|
||
|
callback = NoSeatClick,
|
||
|
};
|
||
|
|
||
|
var waitingView = new StatusView()
|
||
|
{
|
||
|
message = "Updating...",
|
||
|
};
|
||
|
|
||
|
m_HistoryView = new ScrollView() { name = "HistoryContainer", showHorizontal = false};
|
||
|
m_HistoryView.contentContainer.StretchToParentWidth();
|
||
|
m_HistoryView.Add(m_Pager);
|
||
|
|
||
|
m_Views = new Dictionary<HistoryState, VisualElement>()
|
||
|
{
|
||
|
{HistoryState.Error, errorView},
|
||
|
{HistoryState.Offline, noInternetView},
|
||
|
{HistoryState.Maintenance, maintenanceView},
|
||
|
{HistoryState.LoggedOut, loginView},
|
||
|
{HistoryState.NoSeat, noSeatView},
|
||
|
{HistoryState.Waiting, waitingView},
|
||
|
{HistoryState.Ready, m_HistoryView}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
public void UpdateState(HistoryState state, bool force)
|
||
|
{
|
||
|
if (state == m_State && !force)
|
||
|
return;
|
||
|
|
||
|
m_State = state;
|
||
|
switch (state)
|
||
|
{
|
||
|
case HistoryState.Ready:
|
||
|
UpdateHistoryView(m_Pager);
|
||
|
break;
|
||
|
case HistoryState.Disabled:
|
||
|
Close();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_Container.Clear();
|
||
|
m_Container.Add(m_Views[m_State]);
|
||
|
}
|
||
|
|
||
|
public void UpdateRevisions(IEnumerable<RevisionData> datas, string tip, int totalRevisions, int currentPage)
|
||
|
{
|
||
|
var elements = new List<VisualElement>();
|
||
|
var isFullDateObtained = false; // Has everything from this date been obtained?
|
||
|
m_HistoryItems.Clear();
|
||
|
|
||
|
if (datas != null)
|
||
|
{
|
||
|
DateTime currentDate = DateTime.MinValue;
|
||
|
foreach (var data in datas)
|
||
|
{
|
||
|
if (data.timeStamp.Date != currentDate.Date)
|
||
|
{
|
||
|
elements.Add(new CollabHistoryRevisionLine(data.timeStamp, isFullDateObtained));
|
||
|
currentDate = data.timeStamp;
|
||
|
}
|
||
|
|
||
|
var item = new CollabHistoryItem(data);
|
||
|
m_HistoryItems.Add(item);
|
||
|
|
||
|
var container = new VisualElement();
|
||
|
container.style.flexDirection = FlexDirection.Row;
|
||
|
if (data.current)
|
||
|
{
|
||
|
isFullDateObtained = true;
|
||
|
container.AddToClassList("currentRevision");
|
||
|
container.AddToClassList("obtainedRevision");
|
||
|
}
|
||
|
else if (data.obtained)
|
||
|
{
|
||
|
container.AddToClassList("obtainedRevision");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
container.AddToClassList("absentRevision");
|
||
|
}
|
||
|
// If we use the index as-is, the latest commit will become #1, but we want it to be last
|
||
|
container.Add(new CollabHistoryRevisionLine(data.index));
|
||
|
container.Add(item);
|
||
|
elements.Add(container);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_HistoryView.scrollOffset = new Vector2(0, 0);
|
||
|
m_Pager.totalItems = totalRevisions;
|
||
|
m_Pager.curPage = currentPage;
|
||
|
m_Pager.items = elements;
|
||
|
}
|
||
|
|
||
|
public string inProgressRevision
|
||
|
{
|
||
|
get { return m_InProgressRev; }
|
||
|
set
|
||
|
{
|
||
|
m_InProgressRev = value;
|
||
|
foreach (var historyItem in m_HistoryItems)
|
||
|
{
|
||
|
historyItem.SetInProgressStatus(value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int itemsPerPage
|
||
|
{
|
||
|
set
|
||
|
{
|
||
|
if (m_ItemsPerPage == value)
|
||
|
return;
|
||
|
m_Pager.pageSize = m_ItemsPerPage;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public PageChangeAction OnPageChangeAction
|
||
|
{
|
||
|
set { m_Pager.OnPageChanged = value; }
|
||
|
}
|
||
|
|
||
|
public RevisionAction OnGoBackAction
|
||
|
{
|
||
|
set { CollabHistoryItem.s_OnGoBack = value; }
|
||
|
}
|
||
|
|
||
|
public RevisionAction OnUpdateAction
|
||
|
{
|
||
|
set { CollabHistoryItem.s_OnUpdate = value; }
|
||
|
}
|
||
|
|
||
|
public RevisionAction OnRestoreAction
|
||
|
{
|
||
|
set { CollabHistoryItem.s_OnRestore = value; }
|
||
|
}
|
||
|
|
||
|
public ShowBuildAction OnShowBuildAction
|
||
|
{
|
||
|
set { CollabHistoryItem.s_OnShowBuild = value; }
|
||
|
}
|
||
|
|
||
|
public Action OnShowServicesAction
|
||
|
{
|
||
|
set { CollabHistoryItem.s_OnShowServices = value; }
|
||
|
}
|
||
|
|
||
|
void UpdateHistoryView(VisualElement history)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void NoSeatClick()
|
||
|
{
|
||
|
var connection = UnityConnect.instance;
|
||
|
var env = connection.GetEnvironment();
|
||
|
// Map environment to url - prod is special
|
||
|
if (env == "production")
|
||
|
env = "";
|
||
|
else
|
||
|
env += "-";
|
||
|
|
||
|
var url = "https://" + env + kServiceUrl
|
||
|
+ "/orgs/" + connection.GetOrganizationId()
|
||
|
+ "/projects/" + connection.GetProjectName()
|
||
|
+ "/unity-teams/";
|
||
|
Application.OpenURL(url);
|
||
|
}
|
||
|
|
||
|
void SignInClick()
|
||
|
{
|
||
|
UnityConnect.instance.ShowLogin();
|
||
|
}
|
||
|
}
|
||
|
}
|