From 0752acdc2ca2db43581e2c0d95a5d96041247bc9 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Tue, 27 Feb 2024 02:38:00 +0100 Subject: [PATCH] News UI overhaul and PDA notifications (#19610) --- .../CartridgeLoader/Cartridges/NewsReadUi.cs | 50 --- .../Cartridges/NewsReaderUi.cs | 54 +++ ...ragment.xaml => NewsReaderUiFragment.xaml} | 23 +- ...t.xaml.cs => NewsReaderUiFragment.xaml.cs} | 20 +- .../MassMedia/Ui/ArticleEditorPanel.xaml | 71 ++++ .../MassMedia/Ui/ArticleEditorPanel.xaml.cs | 109 ++++++ .../MassMedia/Ui/MiniArticleCardControl.xaml | 26 -- .../Ui/MiniArticleCardControl.xaml.cs | 27 -- .../MassMedia/Ui/NewsArticleCard.xaml | 29 ++ .../MassMedia/Ui/NewsArticleCard.xaml.cs | 47 +++ .../Ui/NewsWriteBoundUserInterface.cs | 79 ---- .../MassMedia/Ui/NewsWriteMenu.xaml | 68 ---- .../MassMedia/Ui/NewsWriteMenu.xaml.cs | 42 -- .../Ui/NewsWriterBoundUserInterface.cs | 84 ++++ .../MassMedia/Ui/NewsWriterMenu.xaml | 45 +++ .../MassMedia/Ui/NewsWriterMenu.xaml.cs | 97 +++++ .../Paper/UI/PaperBoundUserInterface.cs | 2 +- Content.Client/Stylesheets/StyleNano.cs | 61 ++- .../UserInterface/Controls/ConfirmButton.cs | 142 +++++++ .../Systems/Chat/ChatUIController.cs | 3 +- .../Chat/Controls/ChannelFilterPopup.xaml.cs | 1 + .../CartridgeLoader/CartridgeLoaderSystem.cs | 32 +- ...ent.cs => NewsReaderCartridgeComponent.cs} | 6 +- Content.Server/Content.Server.csproj | 1 + .../Components/NewsWriteComponent.cs | 23 -- .../Components/NewsWriterComponent.cs | 25 ++ .../MassMedia/Systems/NewsSystem.cs | 370 ++++++++++-------- Content.Server/PDA/PdaSystem.cs | 31 ++ Content.Server/PDA/Ringer/RingerSystem.cs | 11 +- .../CartridgeLoader/CartridgeComponent.cs | 3 + .../CartridgeLoaderComponent.cs | 13 +- .../Cartridges/NewsReadUiMessageEvent.cs | 22 -- .../Cartridges/NewsReaderUiMessageEvent.cs | 22 ++ ...ewsReadUiState.cs => NewsReaderUiState.cs} | 8 +- .../SharedCartridgeLoaderSystem.cs | 9 +- Content.Shared/Chat/ChatChannel.cs | 20 +- .../Components/NewsWriterBuiMessages.cs | 55 +++ .../Components/SharedNewsWriteComponent.cs | 54 --- .../Components/StationNewsComponent.cs | 10 + .../MassMedia/Systems/SharedNewsSystem.cs | 21 +- Resources/Locale/en-US/chat/ui/chat-box.ftl | 1 + Resources/Locale/en-US/generic.ftl | 2 + Resources/Locale/en-US/mass-media/news-ui.ftl | 30 +- .../en-US/pda/Ringer/ringer-component.ftl | 2 +- Resources/Locale/en-US/pda/pda-component.ftl | 3 + .../Devices/Circuitboards/computer.yml | 2 +- .../Entities/Objects/Devices/cartridges.yml | 6 +- .../Entities/Objects/Devices/pda.yml | 4 +- .../Prototypes/Entities/Stations/base.yml | 6 + .../Entities/Stations/nanotrasen.yml | 1 + .../Machines/Computers/computers.yml | 10 +- .../Textures/Interface/Nano/button_small.svg | 54 +++ .../Interface/Nano/button_small.svg.96dpi.png | Bin 0 -> 278 bytes Resources/keybinds.yml | 10 +- 54 files changed, 1310 insertions(+), 637 deletions(-) delete mode 100644 Content.Client/CartridgeLoader/Cartridges/NewsReadUi.cs create mode 100644 Content.Client/CartridgeLoader/Cartridges/NewsReaderUi.cs rename Content.Client/CartridgeLoader/Cartridges/{NewsReadUiFragment.xaml => NewsReaderUiFragment.xaml} (70%) rename Content.Client/CartridgeLoader/Cartridges/{NewsReadUiFragment.xaml.cs => NewsReaderUiFragment.xaml.cs} (69%) create mode 100644 Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml create mode 100644 Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs delete mode 100644 Content.Client/MassMedia/Ui/MiniArticleCardControl.xaml delete mode 100644 Content.Client/MassMedia/Ui/MiniArticleCardControl.xaml.cs create mode 100644 Content.Client/MassMedia/Ui/NewsArticleCard.xaml create mode 100644 Content.Client/MassMedia/Ui/NewsArticleCard.xaml.cs delete mode 100644 Content.Client/MassMedia/Ui/NewsWriteBoundUserInterface.cs delete mode 100644 Content.Client/MassMedia/Ui/NewsWriteMenu.xaml delete mode 100644 Content.Client/MassMedia/Ui/NewsWriteMenu.xaml.cs create mode 100644 Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs create mode 100644 Content.Client/MassMedia/Ui/NewsWriterMenu.xaml create mode 100644 Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs create mode 100644 Content.Client/UserInterface/Controls/ConfirmButton.cs rename Content.Server/CartridgeLoader/Cartridges/{NewsReadCartridgeComponent.cs => NewsReaderCartridgeComponent.cs} (51%) delete mode 100644 Content.Server/MassMedia/Components/NewsWriteComponent.cs create mode 100644 Content.Server/MassMedia/Components/NewsWriterComponent.cs delete mode 100644 Content.Shared/CartridgeLoader/Cartridges/NewsReadUiMessageEvent.cs create mode 100644 Content.Shared/CartridgeLoader/Cartridges/NewsReaderUiMessageEvent.cs rename Content.Shared/CartridgeLoader/Cartridges/{NewsReadUiState.cs => NewsReaderUiState.cs} (60%) create mode 100644 Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs delete mode 100644 Content.Shared/MassMedia/Components/SharedNewsWriteComponent.cs create mode 100644 Content.Shared/MassMedia/Components/StationNewsComponent.cs create mode 100644 Resources/Textures/Interface/Nano/button_small.svg create mode 100644 Resources/Textures/Interface/Nano/button_small.svg.96dpi.png diff --git a/Content.Client/CartridgeLoader/Cartridges/NewsReadUi.cs b/Content.Client/CartridgeLoader/Cartridges/NewsReadUi.cs deleted file mode 100644 index 6874e9644d..0000000000 --- a/Content.Client/CartridgeLoader/Cartridges/NewsReadUi.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Content.Client.UserInterface.Fragments; -using Content.Shared.CartridgeLoader.Cartridges; -using Content.Shared.CartridgeLoader; -using Robust.Client.GameObjects; -using Robust.Client.UserInterface; - -namespace Content.Client.CartridgeLoader.Cartridges; - -public sealed partial class NewsReadUi : UIFragment -{ - private NewsReadUiFragment? _fragment; - - public override Control GetUIFragmentRoot() - { - return _fragment!; - } - - public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) - { - _fragment = new NewsReadUiFragment(); - - _fragment.OnNextButtonPressed += () => - { - SendNewsReadMessage(NewsReadUiAction.Next, userInterface); - }; - _fragment.OnPrevButtonPressed += () => - { - SendNewsReadMessage(NewsReadUiAction.Prev, userInterface); - }; - _fragment.OnNotificationSwithPressed += () => - { - SendNewsReadMessage(NewsReadUiAction.NotificationSwith, userInterface); - }; - } - - public override void UpdateState(BoundUserInterfaceState state) - { - if (state is NewsReadBoundUserInterfaceState cast) - _fragment?.UpdateState(cast.Article, cast.TargetNum, cast.TotalNum, cast.NotificationOn); - else if (state is NewsReadEmptyBoundUserInterfaceState empty) - _fragment?.UpdateEmptyState(empty.NotificationOn); - } - - private void SendNewsReadMessage(NewsReadUiAction action, BoundUserInterface userInterface) - { - var newsMessage = new NewsReadUiMessageEvent(action); - var message = new CartridgeUiMessage(newsMessage); - userInterface.SendMessage(message); - } -} diff --git a/Content.Client/CartridgeLoader/Cartridges/NewsReaderUi.cs b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUi.cs new file mode 100644 index 0000000000..8ad665d361 --- /dev/null +++ b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUi.cs @@ -0,0 +1,54 @@ +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader.Cartridges; +using Content.Shared.CartridgeLoader; +using Robust.Client.UserInterface; + +namespace Content.Client.CartridgeLoader.Cartridges; + +public sealed partial class NewsReaderUi : UIFragment +{ + private NewsReaderUiFragment? _fragment; + + public override Control GetUIFragmentRoot() + { + return _fragment!; + } + + public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) + { + _fragment = new NewsReaderUiFragment(); + + _fragment.OnNextButtonPressed += () => + { + SendNewsReaderMessage(NewsReaderUiAction.Next, userInterface); + }; + _fragment.OnPrevButtonPressed += () => + { + SendNewsReaderMessage(NewsReaderUiAction.Prev, userInterface); + }; + _fragment.OnNotificationSwithPressed += () => + { + SendNewsReaderMessage(NewsReaderUiAction.NotificationSwitch, userInterface); + }; + } + + public override void UpdateState(BoundUserInterfaceState state) + { + switch (state) + { + case NewsReaderBoundUserInterfaceState cast: + _fragment?.UpdateState(cast.Article, cast.TargetNum, cast.TotalNum, cast.NotificationOn); + break; + case NewsReaderEmptyBoundUserInterfaceState empty: + _fragment?.UpdateEmptyState(empty.NotificationOn); + break; + } + } + + private void SendNewsReaderMessage(NewsReaderUiAction action, BoundUserInterface userInterface) + { + var newsMessage = new NewsReaderUiMessageEvent(action); + var message = new CartridgeUiMessage(newsMessage); + userInterface.SendMessage(message); + } +} diff --git a/Content.Client/CartridgeLoader/Cartridges/NewsReadUiFragment.xaml b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml similarity index 70% rename from Content.Client/CartridgeLoader/Cartridges/NewsReadUiFragment.xaml rename to Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml index 7431713ea8..bd5879408e 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NewsReadUiFragment.xaml +++ b/Content.Client/CartridgeLoader/Cartridges/NewsReaderUiFragment.xaml @@ -1,21 +1,30 @@ - + xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls" + xmlns="https://spacestation14.io" + Margin="1 0 2 0" + Orientation="Vertical" + HorizontalExpand="True" + VerticalExpand="True"> - - - diff --git a/Content.Client/MassMedia/Ui/NewsWriteMenu.xaml.cs b/Content.Client/MassMedia/Ui/NewsWriteMenu.xaml.cs deleted file mode 100644 index 89ab1490af..0000000000 --- a/Content.Client/MassMedia/Ui/NewsWriteMenu.xaml.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Prototypes; -using Content.Shared.MassMedia.Systems; - -namespace Content.Client.MassMedia.Ui; - -[GenerateTypedNameReferences] -public sealed partial class NewsWriteMenu : DefaultWindow -{ - public event Action? ShareButtonPressed; - public event Action? DeleteButtonPressed; - - public NewsWriteMenu(string name) - { - RobustXamlLoader.Load(this); - IoCManager.InjectDependencies(this); - - if (Window != null) - Window.Title = name; - - Share.OnPressed += _ => ShareButtonPressed?.Invoke(); - } - - public void UpdateUI(NewsArticle[] articles, bool shareAvalible) - { - ArticleCardsContainer.Children.Clear(); - - for (int i = 0; i < articles.Length; i++) - { - var article = articles[i]; - var mini = new MiniArticleCardControl(article.Name, (article.Author != null ? article.Author : Loc.GetString("news-read-ui-no-author"))); - mini.ArticleNum = i; - mini.OnDeletePressed += () => DeleteButtonPressed?.Invoke(mini.ArticleNum); - - ArticleCardsContainer.AddChild(mini); - } - - Share.Disabled = !shareAvalible; - } -} diff --git a/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs b/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs new file mode 100644 index 0000000000..80eca82e32 --- /dev/null +++ b/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs @@ -0,0 +1,84 @@ +using JetBrains.Annotations; +using Content.Shared.MassMedia.Systems; +using Content.Shared.MassMedia.Components; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.Client.MassMedia.Ui; + +[UsedImplicitly] +public sealed class NewsWriterBoundUserInterface : BoundUserInterface +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + + [ViewVariables] + private NewsWriterMenu? _menu; + + public NewsWriterBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + + } + + protected override void Open() + { + _menu = new NewsWriterMenu(_gameTiming); + + _menu.OpenCentered(); + _menu.OnClose += Close; + + _menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed; + _menu.DeleteButtonPressed += OnDeleteButtonPressed; + + SendMessage(new NewsWriterArticlesRequestMessage()); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _menu?.Close(); + _menu?.Dispose(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (state is not NewsWriterBoundUserInterfaceState cast) + return; + + _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish); + } + + private void OnPublishButtonPressed() + { + var title = _menu?.ArticleEditorPanel.TitleField.Text.Trim() ?? ""; + if (_menu == null || title.Length == 0) + return; + + var stringContent = Rope.Collapse(_menu.ArticleEditorPanel.ContentField.TextRope).Trim(); + + if (stringContent.Length == 0) + return; + + var name = title.Length <= SharedNewsSystem.MaxTitleLength + ? title + : $"{title[..(SharedNewsSystem.MaxTitleLength - 3)]}..."; + + var content = stringContent.Length <= SharedNewsSystem.MaxContentLength + ? stringContent + : $"{stringContent[..(SharedNewsSystem.MaxContentLength - 3)]}..."; + + + SendMessage(new NewsWriterPublishMessage(name, content)); + } + + private void OnDeleteButtonPressed(int articleNum) + { + if (_menu == null) + return; + + SendMessage(new NewsWriterDeleteMessage(articleNum)); + } +} diff --git a/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml b/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml new file mode 100644 index 0000000000..64932bc6cf --- /dev/null +++ b/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + +