Editor/Window/GameLiftPlugin.cs (120 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; namespace AmazonGameLift.Editor { public class GameLiftPlugin : EditorWindow { [SerializeField] private Texture _icon; internal Texture Icon => _icon; internal readonly StateManager StateManager; private VisualTreeAsset _visualTreeAsset; private VisualElement _root; private VisualElement _currentTab; private VisualElement _containersTab; private Button _landingButton; private List<Button> _tabButtons; private List<VisualElement> _tabContent; private const string MainContentClassName = "main__content"; private const string TabContentSelectedClassName = "tab__content--selected"; private const string TabButtonSelectedClassName = "tab__button__default--selected"; private const string TabButtonClassName = "tab__button__default"; private const string TabContentClassName = "tab__content"; private GameLiftPlugin() { StateManager = new StateManager(new CoreApi()); } private void CreateGUI() { _root = rootVisualElement; _visualTreeAsset = Resources.Load<VisualTreeAsset>("EditorWindow/GameLiftPlugin"); if (_visualTreeAsset == null) { return; } VisualElement uxml = _visualTreeAsset.Instantiate(); _root.Add(uxml); LocalizeText(); var tabContentContainer = _root.Q(className: MainContentClassName); var landingPage = new LandingPage(CreateContentContainer(Pages.Landing, tabContentContainer), StateManager); var credentialsPage = new AwsUserProfilesPage(CreateContentContainer(Pages.Credentials, tabContentContainer), StateManager); var anywherePage = new AnywherePage(CreateContentContainer(Pages.Anywhere, tabContentContainer), StateManager); var ec2Page = new ManagedEC2Page(CreateContentContainer(Pages.ManagedEC2, tabContentContainer), StateManager); var containersPage = new ContainersPage(CreateContentContainer(Pages.Containers, tabContentContainer), StateManager); var helpPage = new HelpAndDocumentationPage(CreateContentContainer(Pages.Help, tabContentContainer)); _landingButton = _root.Query<Button>(className: "tab__button__large__bold"); _tabButtons = _root.Query<Button>(className: TabButtonClassName).ToList(); _tabButtons.Add(_landingButton); _tabContent = _root.Query(className: TabContentClassName).ToList(); _containersTab = _root.Query<VisualElement>("Containers"); _tabButtons.ForEach(button => button.RegisterCallback<ClickEvent>(_ => { OpenTab(button.name); })); if (string.IsNullOrWhiteSpace(StateManager.LastOpenTab)) { OpenTab(Pages.Landing); } else { OpenTab(StateManager.LastOpenTab); } } private void LocalizeText() { var l = new ElementLocalizer(_root); l.SetElementText(GetPageName(Pages.Landing), Strings.TabLanding); l.SetElementText(GetPageName(Pages.Credentials), Strings.TabCredentials); l.SetElementText(GetPageName(Pages.Anywhere), Strings.TabAnywhere); l.SetElementText(GetPageName(Pages.ManagedEC2), Strings.TabManagedEC2); l.SetElementText(GetPageName(Pages.Containers), Strings.TabContainers); l.SetElementText(GetPageName(Pages.Help), Strings.TabHelp); } internal void OpenTab(Pages tabName) => OpenTab(GetPageName(tabName)); private VisualElement CreateContentContainer(Pages page, VisualElement contentContainer) { var container = new VisualElement { name = $"{GetPageName(page)}Content", }; container.AddToClassList(TabContentClassName); contentContainer.Add(container); return container; } private void OpenTab(string tabName) { StateManager.LastOpenTab = tabName; _tabContent.ForEach(page => { if (page.name == $"{tabName}Content") { page.AddToClassList(TabContentSelectedClassName); } else { page.RemoveFromClassList(TabContentSelectedClassName); } }); _tabButtons.ForEach(button => { if (button.name == tabName) { button.AddToClassList(TabButtonSelectedClassName); } else { button.RemoveFromClassList(TabButtonSelectedClassName); } }); } private static string GetPageName(Pages page) => Enum.GetName(typeof(Pages), page); internal enum Pages { Landing, Containers, Credentials, Anywhere, ManagedEC2, Help, } } }