MainPageView.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System;
  2. using JetBrains.Annotations;
  3. using Unity.Cloud.Collaborate.Assets;
  4. using Unity.Cloud.Collaborate.Components;
  5. using Unity.Cloud.Collaborate.Presenters;
  6. using Unity.Cloud.Collaborate.UserInterface;
  7. using UnityEditor;
  8. using UnityEngine;
  9. using UnityEngine.Assertions;
  10. using UnityEngine.UIElements;
  11. namespace Unity.Cloud.Collaborate.Views
  12. {
  13. internal class MainPageView : PageComponent, IMainView
  14. {
  15. IMainPresenter m_Presenter;
  16. public const string UssClassName = "main-page-view";
  17. public const string TopBarUssClassName = UssClassName + "__top-bar";
  18. public const string AlertBoxUssClassName = UssClassName + "__alert-box";
  19. public const string TabViewUssClassName = UssClassName + "__tab-view";
  20. public const string ContainerUssClassName = UssClassName + "__container";
  21. // WARNING - These are hard-coded values. If you do anything to change the order
  22. // these tabs are initialized, you'll need to change these
  23. public const int ChangesTabIndex = 0;
  24. public const int HistoryTabIndex = 1;
  25. static readonly string k_LayoutPath = $"{CollaborateWindow.LayoutPath}/{nameof(MainPageView)}.uxml";
  26. static readonly string k_StylePath = $"{CollaborateWindow.StylePath}/{nameof(MainPageView)}.uss";
  27. readonly AlertBox m_AlertBox;
  28. readonly TabView m_TabView;
  29. readonly HistoryTabPageView m_HistoryView;
  30. readonly ChangesTabPageView m_ChangesView;
  31. readonly VisualElement m_Container;
  32. readonly TopBar m_TopBar;
  33. ProgressView m_ProgressView;
  34. DisplayMode m_DisplayMode;
  35. public MainPageView()
  36. {
  37. AddToClassList(UssClassName);
  38. AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_LayoutPath).CloneTree(this);
  39. styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_StylePath));
  40. m_TopBar = this.Q<TopBar>(className: TopBarUssClassName);
  41. m_AlertBox = this.Q<AlertBox>(className: AlertBoxUssClassName);
  42. m_TabView = this.Q<TabView>(className: TabViewUssClassName);
  43. m_Container = this.Q<VisualElement>(className: ContainerUssClassName);
  44. m_ChangesView = new ChangesTabPageView();
  45. m_HistoryView = new HistoryTabPageView();
  46. m_TabView.AddTab(StringAssets.changes, m_ChangesView);
  47. m_TabView.AddTab(StringAssets.history, m_HistoryView);
  48. // Set the current display mode.
  49. m_DisplayMode = DisplayMode.TabView;
  50. }
  51. /// <inheritdoc />
  52. public IMainPresenter Presenter
  53. {
  54. set
  55. {
  56. m_Presenter = value;
  57. m_Presenter.AssignHistoryPresenter(m_HistoryView);
  58. m_Presenter.AssignChangesPresenter(m_ChangesView);
  59. m_TabView.TabSwitched += OnTabSwitched;
  60. m_TopBar.BackButtonClicked += OnBackButtonClicked;
  61. // If page active before presenter has been added, call start once we have it.
  62. if (Active)
  63. {
  64. m_Presenter.Start();
  65. }
  66. }
  67. }
  68. /// <inheritdoc />
  69. protected override void SetActive()
  70. {
  71. // Set TabView active if it's currently being displayed.
  72. if (m_DisplayMode == DisplayMode.TabView)
  73. {
  74. m_TabView.SetActive();
  75. }
  76. m_Presenter?.Start();
  77. }
  78. /// <inheritdoc />
  79. protected override void SetInactive()
  80. {
  81. // Set TabView inactive if it's current being displayed.
  82. if (m_DisplayMode == DisplayMode.TabView)
  83. {
  84. m_TabView.SetInactive();
  85. }
  86. m_Presenter?.Stop();
  87. }
  88. /// <inheritdoc />
  89. public void AddAlert(string id, AlertBox.AlertLevel level, string message, (string text, Action action)? button = null)
  90. {
  91. m_AlertBox.QueueAlert(id, level, message, button);
  92. }
  93. /// <inheritdoc />
  94. public void RemoveAlert(string id)
  95. {
  96. m_AlertBox.DequeueAlert(id);
  97. }
  98. /// <inheritdoc />
  99. public void SetTab(int index)
  100. {
  101. m_TabView.SwitchTab(index);
  102. }
  103. /// <inheritdoc />
  104. public void AddOperationProgress()
  105. {
  106. SetDisplay(DisplayMode.ProgressView);
  107. }
  108. /// <inheritdoc />
  109. public void RemoveOperationProgress()
  110. {
  111. SetDisplay(DisplayMode.TabView);
  112. }
  113. /// <inheritdoc />
  114. public void SetOperationProgress(string title, string details, int percentage, int completed, int total, bool isPercentage, bool canCancel)
  115. {
  116. Assert.IsNotNull(m_ProgressView);
  117. if (m_ProgressView == null) return;
  118. var progress = isPercentage ? $"{percentage}%" : $"({completed} of {total})";
  119. m_ProgressView.SetText($"{title}\n\n{details}", progress);
  120. m_ProgressView.SetPercentComplete(percentage);
  121. m_ProgressView.SetCancelButtonActive(canCancel);
  122. }
  123. /// <inheritdoc />
  124. public void ClearBackNavigation()
  125. {
  126. m_TopBar.HideBackNavigation();
  127. }
  128. /// <inheritdoc />
  129. public void DisplayBackNavigation(string text)
  130. {
  131. m_TopBar.DisplayBackNavigation(text);
  132. }
  133. void SetDisplay(DisplayMode mode)
  134. {
  135. Assert.AreNotEqual(m_DisplayMode, mode, "Cannot switch to the current display mode.");
  136. m_DisplayMode = mode;
  137. // Switch into tab or progress view.
  138. if (m_DisplayMode == DisplayMode.TabView)
  139. {
  140. m_ProgressView?.AddToClassList(UiConstants.ussHidden);
  141. m_TabView.RemoveFromClassList(UiConstants.ussHidden);
  142. m_TabView.SetActive();
  143. }
  144. else
  145. {
  146. if (m_ProgressView == null)
  147. {
  148. m_ProgressView = new ProgressView();
  149. m_ProgressView.SetCancelCallback(m_Presenter.RequestCancelJob);
  150. m_Container.Add(m_ProgressView);
  151. }
  152. m_ProgressView.RemoveFromClassList(UiConstants.ussHidden);
  153. m_TabView.AddToClassList(UiConstants.ussHidden);
  154. m_TabView.SetInactive();
  155. }
  156. }
  157. void OnTabSwitched(int index)
  158. {
  159. m_Presenter.UpdateTabIndex(index);
  160. }
  161. void OnBackButtonClicked()
  162. {
  163. m_Presenter.NavigateBack();
  164. }
  165. [UsedImplicitly]
  166. public new class UxmlFactory : UxmlFactory<MainPageView> { }
  167. enum DisplayMode
  168. {
  169. TabView,
  170. ProgressView
  171. }
  172. }
  173. }