123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- using System;
- using JetBrains.Annotations;
- using Unity.Cloud.Collaborate.Assets;
- using Unity.Cloud.Collaborate.Components;
- using Unity.Cloud.Collaborate.Presenters;
- using Unity.Cloud.Collaborate.UserInterface;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.Assertions;
- using UnityEngine.UIElements;
- namespace Unity.Cloud.Collaborate.Views
- {
- internal class MainPageView : PageComponent, IMainView
- {
- IMainPresenter m_Presenter;
- public const string UssClassName = "main-page-view";
- public const string TopBarUssClassName = UssClassName + "__top-bar";
- public const string AlertBoxUssClassName = UssClassName + "__alert-box";
- public const string TabViewUssClassName = UssClassName + "__tab-view";
- public const string ContainerUssClassName = UssClassName + "__container";
- // WARNING - These are hard-coded values. If you do anything to change the order
- // these tabs are initialized, you'll need to change these
- public const int ChangesTabIndex = 0;
- public const int HistoryTabIndex = 1;
- static readonly string k_LayoutPath = $"{CollaborateWindow.LayoutPath}/{nameof(MainPageView)}.uxml";
- static readonly string k_StylePath = $"{CollaborateWindow.StylePath}/{nameof(MainPageView)}.uss";
- readonly AlertBox m_AlertBox;
- readonly TabView m_TabView;
- readonly HistoryTabPageView m_HistoryView;
- readonly ChangesTabPageView m_ChangesView;
- readonly VisualElement m_Container;
- readonly TopBar m_TopBar;
- ProgressView m_ProgressView;
- DisplayMode m_DisplayMode;
- public MainPageView()
- {
- AddToClassList(UssClassName);
- AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_LayoutPath).CloneTree(this);
- styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_StylePath));
- m_TopBar = this.Q<TopBar>(className: TopBarUssClassName);
- m_AlertBox = this.Q<AlertBox>(className: AlertBoxUssClassName);
- m_TabView = this.Q<TabView>(className: TabViewUssClassName);
- m_Container = this.Q<VisualElement>(className: ContainerUssClassName);
- m_ChangesView = new ChangesTabPageView();
- m_HistoryView = new HistoryTabPageView();
- m_TabView.AddTab(StringAssets.changes, m_ChangesView);
- m_TabView.AddTab(StringAssets.history, m_HistoryView);
- // Set the current display mode.
- m_DisplayMode = DisplayMode.TabView;
- }
- /// <inheritdoc />
- public IMainPresenter Presenter
- {
- set
- {
- m_Presenter = value;
- m_Presenter.AssignHistoryPresenter(m_HistoryView);
- m_Presenter.AssignChangesPresenter(m_ChangesView);
- m_TabView.TabSwitched += OnTabSwitched;
- m_TopBar.BackButtonClicked += OnBackButtonClicked;
- // If page active before presenter has been added, call start once we have it.
- if (Active)
- {
- m_Presenter.Start();
- }
- }
- }
- /// <inheritdoc />
- protected override void SetActive()
- {
- // Set TabView active if it's currently being displayed.
- if (m_DisplayMode == DisplayMode.TabView)
- {
- m_TabView.SetActive();
- }
- m_Presenter?.Start();
- }
- /// <inheritdoc />
- protected override void SetInactive()
- {
- // Set TabView inactive if it's current being displayed.
- if (m_DisplayMode == DisplayMode.TabView)
- {
- m_TabView.SetInactive();
- }
- m_Presenter?.Stop();
- }
- /// <inheritdoc />
- public void AddAlert(string id, AlertBox.AlertLevel level, string message, (string text, Action action)? button = null)
- {
- m_AlertBox.QueueAlert(id, level, message, button);
- }
- /// <inheritdoc />
- public void RemoveAlert(string id)
- {
- m_AlertBox.DequeueAlert(id);
- }
- /// <inheritdoc />
- public void SetTab(int index)
- {
- m_TabView.SwitchTab(index);
- }
- /// <inheritdoc />
- public void AddOperationProgress()
- {
- SetDisplay(DisplayMode.ProgressView);
- }
- /// <inheritdoc />
- public void RemoveOperationProgress()
- {
- SetDisplay(DisplayMode.TabView);
- }
- /// <inheritdoc />
- public void SetOperationProgress(string title, string details, int percentage, int completed, int total, bool isPercentage, bool canCancel)
- {
- Assert.IsNotNull(m_ProgressView);
- if (m_ProgressView == null) return;
- var progress = isPercentage ? $"{percentage}%" : $"({completed} of {total})";
- m_ProgressView.SetText($"{title}\n\n{details}", progress);
- m_ProgressView.SetPercentComplete(percentage);
- m_ProgressView.SetCancelButtonActive(canCancel);
- }
- /// <inheritdoc />
- public void ClearBackNavigation()
- {
- m_TopBar.HideBackNavigation();
- }
- /// <inheritdoc />
- public void DisplayBackNavigation(string text)
- {
- m_TopBar.DisplayBackNavigation(text);
- }
- void SetDisplay(DisplayMode mode)
- {
- Assert.AreNotEqual(m_DisplayMode, mode, "Cannot switch to the current display mode.");
- m_DisplayMode = mode;
- // Switch into tab or progress view.
- if (m_DisplayMode == DisplayMode.TabView)
- {
- m_ProgressView?.AddToClassList(UiConstants.ussHidden);
- m_TabView.RemoveFromClassList(UiConstants.ussHidden);
- m_TabView.SetActive();
- }
- else
- {
- if (m_ProgressView == null)
- {
- m_ProgressView = new ProgressView();
- m_ProgressView.SetCancelCallback(m_Presenter.RequestCancelJob);
- m_Container.Add(m_ProgressView);
- }
- m_ProgressView.RemoveFromClassList(UiConstants.ussHidden);
- m_TabView.AddToClassList(UiConstants.ussHidden);
- m_TabView.SetInactive();
- }
- }
- void OnTabSwitched(int index)
- {
- m_Presenter.UpdateTabIndex(index);
- }
- void OnBackButtonClicked()
- {
- m_Presenter.NavigateBack();
- }
- [UsedImplicitly]
- public new class UxmlFactory : UxmlFactory<MainPageView> { }
- enum DisplayMode
- {
- TabView,
- ProgressView
- }
- }
- }
|