diff --git a/Content.Client/PDA/PdaMenu.xaml.cs b/Content.Client/PDA/PdaMenu.xaml.cs index 630861d084..c62acd0fc5 100644 --- a/Content.Client/PDA/PdaMenu.xaml.cs +++ b/Content.Client/PDA/PdaMenu.xaml.cs @@ -26,13 +26,13 @@ namespace Content.Client.PDA public const int ProgramContentView = 3; - private string _pdaOwner = Loc.GetString("comp-pda-ui-unknown"); + private string _pdaOwnerName = Loc.GetString("comp-pda-ui-unknown"); private string _owner = Loc.GetString("comp-pda-ui-unknown"); private string _jobTitle = Loc.GetString("comp-pda-ui-unassigned"); private string _stationName = Loc.GetString("comp-pda-ui-unknown"); private string _alertLevel = Loc.GetString("comp-pda-ui-unknown"); private string _instructions = Loc.GetString("comp-pda-ui-unknown"); - + private int _currentView; @@ -96,7 +96,7 @@ namespace Content.Client.PDA PdaOwnerButton.OnPressed += _ => { - _clipboard.SetText(_pdaOwner); + _clipboard.SetText(_pdaOwnerName); }; IdInfoButton.OnPressed += _ => @@ -125,7 +125,7 @@ namespace Content.Client.PDA _clipboard.SetText(_instructions); }; - + HideAllViews(); @@ -138,9 +138,9 @@ namespace Content.Client.PDA if (state.PdaOwnerInfo.ActualOwnerName != null) { - _pdaOwner = state.PdaOwnerInfo.ActualOwnerName; + _pdaOwnerName = state.PdaOwnerInfo.ActualOwnerName; PdaOwnerLabel.SetMarkup(Loc.GetString("comp-pda-ui-owner", - ("actualOwnerName", _pdaOwner))); + ("actualOwnerName", _pdaOwnerName))); } @@ -160,7 +160,7 @@ namespace Content.Client.PDA _stationName = state.StationName ?? Loc.GetString("comp-pda-ui-unknown"); StationNameLabel.SetMarkup(Loc.GetString("comp-pda-ui-station", ("station", _stationName))); - + var stationTime = _gameTiming.CurTime.Subtract(_gameTicker.RoundStartTimeSpan); diff --git a/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUi.cs b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUi.cs new file mode 100644 index 0000000000..7dcb845527 --- /dev/null +++ b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUi.cs @@ -0,0 +1,38 @@ +using Content.Client.UserInterface.Fragments; +using Content.Shared._White.CartridgeLoader.Cartridges; +using Content.Shared.CartridgeLoader; +using Robust.Client.UserInterface; + +namespace Content.Client._White.CartridgeLoader.Cartridges; + +public sealed partial class MessagesUi : UIFragment +{ + private MessagesUiFragment _fragment; + + public override Control GetUIFragmentRoot() + { + return _fragment; + } + + public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) + { + _fragment = new MessagesUiFragment(); + _fragment.OnMessageSent += note => SendMessagesMessage(MessagesUiAction.Send, note, null, userInterface); + _fragment.OnButtonPressed += userUid => SendMessagesMessage(MessagesUiAction.ChangeChat, null, userUid, userInterface); + } + + public override void UpdateState(BoundUserInterfaceState state) + { + if (state is not MessagesUiState messagesState) + return; + + _fragment.UpdateState(messagesState.Mode, messagesState.Contents, messagesState.Name); + } + + private void SendMessagesMessage(MessagesUiAction action, string? stringInput, int? uidInput, BoundUserInterface userInterface) + { + var messagesMessage = new MessagesUiMessageEvent(action, stringInput, uidInput); + var message = new CartridgeUiMessage(messagesMessage); + userInterface.SendMessage(message); + } +} diff --git a/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.cs b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.cs new file mode 100644 index 0000000000..dbadc56078 --- /dev/null +++ b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.cs @@ -0,0 +1,129 @@ +using System.Numerics; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Content.Shared._White.CartridgeLoader.Cartridges; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; + +namespace Content.Client._White.CartridgeLoader.Cartridges; + +[GenerateTypedNameReferences] +public sealed partial class MessagesUiFragment : BoxContainer +{ + public event Action? OnMessageSent; + public event Action? OnButtonPressed; + + private string _searchText = string.Empty; + + public MessagesUiFragment() + { + RobustXamlLoader.Load(this); + Input.OnTextEntered += _ => + { + if (!string.IsNullOrEmpty(Input.Text)) + OnMessageSent?.Invoke(Input.Text); + Input.Clear(); + }; + + BackButton.OnPressed += _ => OnButtonPressed?.Invoke(null); + SearchBar.OnTextChanged += OnSearchTextChanged; + + UpdateState(MessagesUiStateMode.UserList, [], null); + } + + public void UpdateState(MessagesUiStateMode mode, List<(MessagesUser, int?)>? contents, string? name) + { + MessageContainer.DisposeAllChildren(); + Input.Orphan(); + BackButton.Orphan(); + + SearchBar.Visible = false; + + if (contents == null) + return; + + if (mode == MessagesUiStateMode.Chat) + { + HeaderLabel.Text = name; + + foreach (var (senderName, message) in contents) + { + AddNote($"{senderName.Name} {message}"); + } + + OverContainer.AddChild(Input); + HeaderBox.AddChild(BackButton); + BackButton.SetPositionInParent(0); + } + else if (mode == MessagesUiStateMode.Error) + { + HeaderLabel.Text = Loc.GetString("messages-pda-error-header"); + AddNote(Loc.GetString("messages-pda-error-message")); + } + else + { + SearchBar.Visible = true; + HeaderLabel.Text = Loc.GetString("messages-pda-chat-choice"); + foreach (var (messagesUser, userUid) in contents) + { + AddButton(userUid, messagesUser.Name + ", " + messagesUser.Job, messagesUser.Department); + } + } + } + + /// + /// Adding a button for selecting a chat + /// + private void AddButton(int? userUid, string userName, string departmentId) + { + var styleClass = IoCManager.Resolve().Index(departmentId).ButtonStyle; + + var button = new Button + { + Text = userName, + HorizontalExpand = true, + ClipText = true, + StyleClasses = { styleClass }, + MinWidth = 60 + }; + button.OnPressed += _ => OnButtonPressed?.Invoke(userUid); + MessageContainer.AddChild(button); + } + + /// + /// Adding a text label to the message container + /// + private void AddNote(string note) + { + MessageContainer.AddChild(new Label + { + Text = note, + HorizontalExpand = true, + ClipText = false + }); + } + + private bool ButtonIsVisible(Button button) + { + return string.IsNullOrEmpty(_searchText) || button.Text == null || button.Text.Contains(_searchText, StringComparison.OrdinalIgnoreCase); + } + + private void UpdateVisibleButtons() + { + foreach (var child in MessageContainer.Children) + { + if (child is Button button) + button.Visible = ButtonIsVisible(button); + } + } + + private void OnSearchTextChanged(LineEdit.LineEditEventArgs args) + { + _searchText = args.Text; + + UpdateVisibleButtons(); + // Reset scroll bar so they can see the relevant results. + MessagesScroll.SetScrollValue(Vector2.Zero); + } +} diff --git a/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.xaml b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.xaml new file mode 100644 index 0000000000..2871d8693b --- /dev/null +++ b/Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.xaml @@ -0,0 +1,17 @@ + + + + +