using Content.Client.Message; using Content.Shared.CartridgeLoader; using Content.Shared.PDA; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Utility; namespace Content.Client.PDA { [GenerateTypedNameReferences] public sealed partial class PDAMenu : PDAWindow { public const int HomeView = 0; public const int ProgramListView = 1; public const int SettingsView = 2; public const int ProgramContentView = 3; private int _currentView = 0; public event Action? OnProgramItemPressed; public event Action? OnUninstallButtonPressed; public event Action? OnInstallButtonPressed; public PDAMenu() { RobustXamlLoader.Load(this); ViewContainer.OnChildAdded += control => control.Visible = false; HomeButton.IconTexture = new SpriteSpecifier.Texture(new ("/Textures/Interface/home.png")); FlashLightToggleButton.IconTexture = new SpriteSpecifier.Texture(new ("/Textures/Interface/light.png")); EjectPenButton.IconTexture = new SpriteSpecifier.Texture(new ("/Textures/Interface/pencil.png")); EjectIdButton.IconTexture = new SpriteSpecifier.Texture(new ("/Textures/Interface/eject.png")); ProgramCloseButton.IconTexture = new SpriteSpecifier.Texture(new ("/Textures/Interface/Nano/cross.svg.png")); HomeButton.OnPressed += _ => ToHomeScreen(); ProgramListButton.OnPressed += _ => { HomeButton.IsCurrent = false; ProgramListButton.IsCurrent = true; SettingsButton.IsCurrent = false; ProgramTitle.IsCurrent = false; ChangeView(ProgramListView); }; SettingsButton.OnPressed += _ => { HomeButton.IsCurrent = false; ProgramListButton.IsCurrent = false; SettingsButton.IsCurrent = true; ProgramTitle.IsCurrent = false; ChangeView(SettingsView); }; ProgramTitle.OnPressed += _ => { HomeButton.IsCurrent = false; ProgramListButton.IsCurrent = false; SettingsButton.IsCurrent = false; ProgramTitle.IsCurrent = true; ChangeView(ProgramContentView); }; ProgramCloseButton.OnPressed += _ => { HideProgramHeader(); ToHomeScreen(); }; HideAllViews(); ToHomeScreen(); } public void UpdateState(PDAUpdateState state) { FlashLightToggleButton.IsActive = state.FlashlightEnabled; if (state.PDAOwnerInfo.ActualOwnerName != null) { PdaOwnerLabel.SetMarkup(Loc.GetString("comp-pda-ui-owner", ("ActualOwnerName", state.PDAOwnerInfo.ActualOwnerName))); } if (state.PDAOwnerInfo.IdOwner != null || state.PDAOwnerInfo.JobTitle != null) { IdInfoLabel.SetMarkup(Loc.GetString("comp-pda-ui", ("Owner",state.PDAOwnerInfo.IdOwner ?? Loc.GetString("comp-pda-ui-unknown")), ("JobTitle",state.PDAOwnerInfo.JobTitle ?? Loc.GetString("comp-pda-ui-unassigned")))); } else { IdInfoLabel.SetMarkup(Loc.GetString("comp-pda-ui-blank")); } StationNameLabel.SetMarkup(Loc.GetString("comp-pda-ui-station", ("Station",state.StationName ?? Loc.GetString("comp-pda-ui-unknown")))); AddressLabel.Text = state.Address?.ToUpper() ?? " - "; EjectIdButton.IsActive = state.PDAOwnerInfo.IdOwner != null || state.PDAOwnerInfo.JobTitle != null; EjectPenButton.IsActive = state.HasPen; ActivateUplinkButton.Visible = state.HasUplink; ActivateMusicButton.Visible = state.CanPlayMusic; } public void UpdateAvailablePrograms(List<(EntityUid, CartridgeComponent)> programs) { ProgramList.RemoveAllChildren(); if (programs.Count == 0) { ProgramList.AddChild(new Label() { Text = Loc.GetString("comp-pda-io-no-programs-available"), HorizontalAlignment = HAlignment.Center, VerticalAlignment = VAlignment.Center, VerticalExpand = true }); return; } var row = CreateProgramListRow(); var itemCount = 1; ProgramList.AddChild(row); foreach (var (uid, component) in programs) { //Create a new row every second program item starting from the first if (itemCount % 2 != 0) { row = CreateProgramListRow(); ProgramList.AddChild(row); } var item = new PDAProgramItem(); if (component.Icon is not null) item.Icon.SetFromSpriteSpecifier(component.Icon); item.OnPressed += _ => OnProgramItemPressed?.Invoke(uid); switch (component.InstallationStatus) { case InstallationStatus.Cartridge: item.InstallButton.Visible = true; item.InstallButton.Text = Loc.GetString("cartridge-bound-user-interface-install-button"); item.InstallButton.OnPressed += _ => OnInstallButtonPressed?.Invoke(uid); break; case InstallationStatus.Installed: item.InstallButton.Visible = true; item.InstallButton.Text = Loc.GetString("cartridge-bound-user-interface-uninstall-button"); item.InstallButton.OnPressed += _ => OnUninstallButtonPressed?.Invoke(uid); break; } item.ProgramName.Text = Loc.GetString(component.ProgramName); item.SetHeight = 20; row.AddChild(item); itemCount++; } //Add a filler item to the last row when it only contains one item if (itemCount % 2 == 0) row.AddChild(new Control() { HorizontalExpand = true }); } /// /// Changes the current view to the home screen (view 0) and sets the tabs `IsCurrent` flag accordingly /// public void ToHomeScreen() { HomeButton.IsCurrent = true; ProgramListButton.IsCurrent = false; SettingsButton.IsCurrent = false; ProgramTitle.IsCurrent = false; ChangeView(HomeView); } /// /// Hides the program title and close button. /// public void HideProgramHeader() { ProgramTitle.IsCurrent = false; ProgramTitle.Visible = false; ProgramCloseButton.Visible = false; ProgramListButton.Visible = true; SettingsButton.Visible = true; } /// /// Changes the current view to the program content view (view 3), sets the program title and sets the tabs `IsCurrent` flag accordingly /// public void ToProgramView(string title) { HomeButton.IsCurrent = false; ProgramListButton.IsCurrent = false; SettingsButton.IsCurrent = false; ProgramTitle.IsCurrent = false; ProgramTitle.IsCurrent = true; ProgramTitle.Visible = true; ProgramCloseButton.Visible = true; ProgramListButton.Visible = false; SettingsButton.Visible = false; ProgramTitle.LabelText = title; ChangeView(ProgramContentView); } /// /// Changes the current view to the given view number /// public void ChangeView(int view) { if (ViewContainer.ChildCount <= view) return; ViewContainer.GetChild(_currentView).Visible = false; ViewContainer.GetChild(view).Visible = true; _currentView = view; } private BoxContainer CreateProgramListRow() { return new BoxContainer() { Orientation = BoxContainer.LayoutOrientation.Horizontal, HorizontalExpand = true }; } private void HideAllViews() { var views = ViewContainer.Children; foreach (var view in views) { view.Visible = false; } } } }