123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- using System.Collections.Generic;
- using UnityEditor.Connect;
- using UnityEditor.Web;
- namespace UnityEditor.Collaboration
- {
- internal class CollabHistoryPresenter
- {
- public const int ItemsPerPage = 5;
- ICollabHistoryWindow m_Window;
- ICollabHistoryItemFactory m_Factory;
- IRevisionsService m_Service;
- ConnectInfo m_ConnectState;
- CollabInfo m_CollabState;
- bool m_IsCollabError;
- int m_TotalRevisions;
- int m_CurrentPage;
- int m_RequestedPage;
- bool m_FetchInProgress;
- BuildAccess m_BuildAccess;
- string m_ProgressRevision;
- public bool BuildServiceEnabled {get; set; }
- public CollabHistoryPresenter(ICollabHistoryWindow window, ICollabHistoryItemFactory factory, IRevisionsService service)
- {
- m_Window = window;
- m_Factory = factory;
- m_Service = service;
- m_CurrentPage = 0;
- m_BuildAccess = new BuildAccess();
- m_Service.FetchRevisionsCallback += OnFetchRevisions;
- }
- public void OnWindowEnabled()
- {
- UnityConnect.instance.StateChanged += OnConnectStateChanged;
- Collab.instance.StateChanged += OnCollabStateChanged;
- Collab.instance.RevisionUpdated += OnCollabRevisionUpdated;
- Collab.instance.JobsCompleted += OnCollabJobsCompleted;
- Collab.instance.ErrorOccurred += OnCollabError;
- Collab.instance.ErrorCleared += OnCollabErrorCleared;
- EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
- m_ConnectState = UnityConnect.instance.GetConnectInfo();
- m_CollabState = Collab.instance.GetCollabInfo();
- m_Window.revisionActionsEnabled = !EditorApplication.isPlayingOrWillChangePlaymode;
- // Setup window callbacks
- m_Window.OnPageChangeAction = OnUpdatePage;
- m_Window.OnUpdateAction = OnUpdate;
- m_Window.OnRestoreAction = OnRestore;
- m_Window.OnGoBackAction = OnGoBack;
- m_Window.OnShowBuildAction = ShowBuildForCommit;
- m_Window.OnShowServicesAction = ShowServicePage;
- m_Window.itemsPerPage = ItemsPerPage;
- // Initialize data
- UpdateBuildServiceStatus();
- var state = RecalculateState();
- // Only try to load the page if we're ready
- if (state == HistoryState.Ready)
- OnUpdatePage(m_CurrentPage);
- m_Window.UpdateState(state, true);
- }
- public void OnWindowDisabled()
- {
- UnityConnect.instance.StateChanged -= OnConnectStateChanged;
- Collab.instance.StateChanged -= OnCollabStateChanged;
- Collab.instance.RevisionUpdated -= OnCollabRevisionUpdated;
- Collab.instance.JobsCompleted -= OnCollabJobsCompleted;
- EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
- }
- private void OnConnectStateChanged(ConnectInfo state)
- {
- m_ConnectState = state;
- m_Window.UpdateState(RecalculateState(), false);
- }
- private void OnCollabStateChanged(CollabInfo state)
- {
- // Sometimes a collab state change will trigger even though everything is the same
- if (m_CollabState.Equals(state))
- return;
- if (m_CollabState.tip != state.tip)
- OnUpdatePage(m_CurrentPage);
- m_CollabState = state;
- m_Window.UpdateState(RecalculateState(), false);
- if (state.inProgress)
- {
- m_Window.inProgressRevision = m_ProgressRevision;
- }
- else
- {
- m_Window.inProgressRevision = null;
- }
- }
- private void OnCollabRevisionUpdated(CollabInfo state)
- {
- OnUpdatePage(m_CurrentPage);
- }
- private void OnCollabJobsCompleted(CollabInfo state)
- {
- m_ProgressRevision = null;
- }
- private void OnCollabError()
- {
- m_IsCollabError = true;
- m_Window.UpdateState(RecalculateState(), false);
- }
- private void OnCollabErrorCleared()
- {
- m_IsCollabError = false;
- m_FetchInProgress = true;
- m_Service.GetRevisions(m_CurrentPage * ItemsPerPage, ItemsPerPage);
- m_Window.UpdateState(RecalculateState(), false);
- }
- private void OnPlayModeStateChanged(PlayModeStateChange stateChange)
- {
- // If entering play mode, disable
- if (stateChange == PlayModeStateChange.ExitingEditMode ||
- stateChange == PlayModeStateChange.EnteredPlayMode)
- {
- m_Window.revisionActionsEnabled = false;
- }
- // If exiting play mode, enable!
- else if (stateChange == PlayModeStateChange.EnteredEditMode ||
- stateChange == PlayModeStateChange.ExitingPlayMode)
- {
- m_Window.revisionActionsEnabled = true;
- }
- }
- private HistoryState RecalculateState()
- {
- if (!m_ConnectState.online)
- return HistoryState.Offline;
- if (m_ConnectState.maintenance || m_CollabState.maintenance)
- return HistoryState.Maintenance;
- if (!m_ConnectState.loggedIn)
- return HistoryState.LoggedOut;
- if (!m_CollabState.seat)
- return HistoryState.NoSeat;
- if (!Collab.instance.IsCollabEnabledForCurrentProject())
- return HistoryState.Disabled;
- if (!Collab.instance.IsConnected() || !m_CollabState.ready || m_FetchInProgress)
- return HistoryState.Waiting;
- if (m_ConnectState.error || m_IsCollabError)
- return HistoryState.Error;
- return HistoryState.Ready;
- }
- // TODO: Eventually this can be a listener on the build service status
- public void UpdateBuildServiceStatus()
- {
- foreach (var service in UnityConnectServiceCollection.instance.GetAllServiceInfos())
- {
- if (service.name.Equals("Build"))
- {
- BuildServiceEnabled = service.enabled;
- }
- }
- }
- public void ShowBuildForCommit(string revisionID)
- {
- m_BuildAccess.ShowBuildForCommit(revisionID);
- }
- public void ShowServicePage()
- {
- m_BuildAccess.ShowServicePage();
- }
- public void OnUpdatePage(int page)
- {
- m_FetchInProgress = true;
- m_Service.GetRevisions(page * ItemsPerPage, ItemsPerPage);
- m_Window.UpdateState(RecalculateState(), false);
- m_RequestedPage = page;
- }
- private void OnFetchRevisions(RevisionsResult data)
- {
- m_FetchInProgress = false;
- IEnumerable<RevisionData> items = null;
- if (data != null)
- {
- m_CurrentPage = m_RequestedPage;
- m_TotalRevisions = data.RevisionsInRepo;
- items = m_Factory.GenerateElements(data.Revisions, m_TotalRevisions, m_CurrentPage * ItemsPerPage, m_Service.tipRevision, m_Window.inProgressRevision, m_Window.revisionActionsEnabled, BuildServiceEnabled, m_Service.currentUser);
- }
- // State must be recalculated prior to inserting items
- m_Window.UpdateState(RecalculateState(), false);
- m_Window.UpdateRevisions(items, m_Service.tipRevision, m_TotalRevisions, m_CurrentPage);
- }
- private void OnRestore(string revisionId, bool updatetorevision)
- {
- m_ProgressRevision = revisionId;
- Collab.instance.ResyncToRevision(revisionId);
- }
- private void OnGoBack(string revisionId, bool updatetorevision)
- {
- m_ProgressRevision = revisionId;
- Collab.instance.GoBackToRevision(revisionId, false);
- }
- private void OnUpdate(string revisionId, bool updatetorevision)
- {
- m_ProgressRevision = revisionId;
- Collab.instance.Update(revisionId, updatetorevision);
- }
- }
- }
|