From d023d29e54b48dc56dc782ba5c9c57872aef1bab Mon Sep 17 00:00:00 2001 From: Spatison <137375981+Spatison@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:58:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20=D0=9F=D0=94=D0=90=20(#564)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add: Сообщения в ПДА * Search bar and colors in messages on the PDA --- Content.Client/PDA/PdaMenu.xaml.cs | 14 +- .../CartridgeLoader/Cartridges/MessagesUi.cs | 38 +++ .../Cartridges/MessagesUiFragment.cs | 129 ++++++++ .../Cartridges/MessagesUiFragment.xaml | 17 + .../Systems/SingletonDeviceNetServerSystem.cs | 2 +- Content.Server/Mind/Commands/RenameCommand.cs | 2 +- Content.Server/PDA/PdaSystem.cs | 16 +- .../Station/Systems/StationSpawningSystem.cs | 11 +- .../Cartridges/MessagesCartridgeComponent.cs | 20 ++ .../Cartridges/MessagesCartridgeSystem.cs | 290 ++++++++++++++++++ .../RandomHumanSystem/RandomHumanSystem.cs | 2 +- .../Components/MessagesServerComponent.cs | 26 ++ .../EntitySystems/MessagesServerSystem.cs | 128 ++++++++ Content.Shared/PDA/PdaComponent.cs | 3 + Content.Shared/PDA/PdaUpdateState.cs | 1 + .../Cartridges/MessagesUiMessageEvent.cs | 26 ++ .../Cartridges/MessagesUiState.cs | 47 +++ .../en-US/cartridge-loader/cartridges.ftl | 1 + .../en-US/radio/components/pda-messages.ftl | 9 + .../ru-RU/cartridge-loader/cartridges.ftl | 1 + Resources/Locale/ru-RU/pda/pda-component.ftl | 2 +- .../ru-RU/radio/components/pda-messages.ftl | 9 + .../entities/objects/devices/cartridges.ftl | 6 + .../structures/machines/telecomms.ftl | 4 + .../Device/devicenet_frequencies.yml | 20 ++ .../Entities/Objects/Devices/cartridges.yml | 48 +++ .../Entities/Objects/Devices/pda.yml | 4 + .../Structures/Machines/telecomms.yml | 66 ++++ 28 files changed, 929 insertions(+), 13 deletions(-) create mode 100644 Content.Client/_White/CartridgeLoader/Cartridges/MessagesUi.cs create mode 100644 Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.cs create mode 100644 Content.Client/_White/CartridgeLoader/Cartridges/MessagesUiFragment.xaml create mode 100644 Content.Server/_White/CartridgeLoader/Cartridges/MessagesCartridgeComponent.cs create mode 100644 Content.Server/_White/CartridgeLoader/Cartridges/MessagesCartridgeSystem.cs create mode 100644 Content.Server/_White/Radio/Components/MessagesServerComponent.cs create mode 100644 Content.Server/_White/Radio/EntitySystems/MessagesServerSystem.cs create mode 100644 Content.Shared/_White/CartridgeLoader/Cartridges/MessagesUiMessageEvent.cs create mode 100644 Content.Shared/_White/CartridgeLoader/Cartridges/MessagesUiState.cs create mode 100644 Resources/Locale/en-US/radio/components/pda-messages.ftl create mode 100644 Resources/Locale/ru-RU/radio/components/pda-messages.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/machines/telecomms.ftl 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 @@ + + + + +