using System; using JetBrains.Annotations; using Unity.Cloud.Collaborate.Assets; using Unity.Cloud.Collaborate.Components.Menus; using Unity.Cloud.Collaborate.UserInterface; using Unity.Cloud.Collaborate.Utilities; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; namespace Unity.Cloud.Collaborate.Components { [UsedImplicitly] internal class TopBar : VisualElement { public const string UssClassName = "top-bar"; public const string IconUssClassName = UssClassName + "__icon"; public const string BranchInfoUssClassName = UssClassName + "__branch-info"; public const string OverflowMenuUssClassName = UssClassName + "__overflow-button"; public const string BackUssClassName = UssClassName + "__back"; public const string BackButtonUssClassName = UssClassName + "__back-button"; public const string BackTextUssClassName = UssClassName + "__back-text"; static readonly string k_LayoutPath = $"{CollaborateWindow.LayoutPath}/{nameof(TopBar)}.uxml"; static readonly string k_StylePath = $"{CollaborateWindow.StylePath}/{nameof(TopBar)}.uss"; public event Action BackButtonClicked; readonly VisualElement m_Icon; readonly TextElement m_BranchInfo; readonly IconButton m_OverflowMenu; readonly VisualElement m_BackContainer; readonly IconButton m_BackButton; readonly TextElement m_BackText; [CanBeNull] string m_BranchName; public TopBar() { // Get the layout AddToClassList(UssClassName); AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(k_LayoutPath).CloneTree(this); styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_StylePath)); // Initialise fields m_Icon = this.Q<VisualElement>(className: IconUssClassName); m_BranchInfo = this.Q<TextElement>(className: BranchInfoUssClassName); m_OverflowMenu = this.Q<IconButton>(className: OverflowMenuUssClassName); m_BackContainer = this.Q<VisualElement>(className: BackUssClassName); m_BackButton = this.Q<IconButton>(className: BackButtonUssClassName); m_BackText = this.Q<TextElement>(className: BackTextUssClassName); m_OverflowMenu.Clicked += ClickableOnClicked; m_BackButton.Clicked += () => BackButtonClicked?.Invoke(); HideBackNavigation(); } /// <summary> /// Hide the current back navigation. /// </summary> public void HideBackNavigation() { m_BackContainer.AddToClassList(UiConstants.ussHidden); m_BackButton.SetEnabled(false); m_BackText.text = string.Empty; } /// <summary> /// Register back navigation to be made available to the user to navigate backwards in the UI. /// </summary> /// <param name="text">Destination of the back navigation</param> public void DisplayBackNavigation([NotNull] string text) { m_BackText.text = text; m_BackButton.SetEnabled(true); m_BackContainer.RemoveFromClassList(UiConstants.ussHidden); } void ClickableOnClicked() { var (x, y) = MenuUtilities.GetMenuPosition(m_OverflowMenu, MenuUtilities.AnchorPoint.BottomRight); new FloatingMenu() .AddEntry("Invite Teammate", OpenLinksUtility.OpenMembersLink, true) .SetOpenDirection(MenuUtilities.OpenDirection.DownLeft) .Open(x, y); } [UsedImplicitly] public new class UxmlFactory : UxmlFactory<TopBar> { } } }