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(kWindowTitle); } [MenuItem("Window/Asset Management/Collab History", true)] public static bool ValidateShowHistoryWindow() { return Collab.instance.IsCollabEnabledForCurrentProject(); } CollabHistoryPresenter m_Presenter; Dictionary m_Views; List m_HistoryItems = new List(); 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.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 datas, string tip, int totalRevisions, int currentPage) { var elements = new List(); 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(); } } }