@@ -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.Users, messagesState.Messages, 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
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<string>? OnMessageSent;
|
||||
public event Action<int?>? 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<(MessagesUserData, int?)>? users, List<(string, int?)>? messages, string? name)
|
||||
{
|
||||
MessageContainer.DisposeAllChildren();
|
||||
Input.Orphan();
|
||||
BackButton.Orphan();
|
||||
|
||||
SearchBar.Visible = false;
|
||||
|
||||
if (mode == MessagesUiStateMode.Chat && messages != null)
|
||||
{
|
||||
HeaderLabel.Text = name;
|
||||
|
||||
foreach (var (senderName, message) in messages)
|
||||
{
|
||||
AddNote($"{senderName} {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 if (mode == MessagesUiStateMode.UserList && users != null)
|
||||
{
|
||||
SearchBar.Visible = true;
|
||||
HeaderLabel.Text = Loc.GetString("messages-pda-chat-choice");
|
||||
foreach (var (messagesUser, userUid) in users)
|
||||
{
|
||||
AddButton(userUid, messagesUser.Name + ", " + messagesUser.Job, messagesUser.Department);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///<summary>
|
||||
/// Adding a button for selecting a chat
|
||||
///</summary>
|
||||
private void AddButton(int? userUid, string userName, string departmentId)
|
||||
{
|
||||
var styleClass = IoCManager.Resolve<IPrototypeManager>().Index<DepartmentPrototype>(departmentId).ButtonStyle;
|
||||
|
||||
var button = new Button
|
||||
{
|
||||
Text = userName,
|
||||
HorizontalExpand = true,
|
||||
ClipText = true,
|
||||
StyleClasses = { styleClass },
|
||||
MinWidth = 60
|
||||
};
|
||||
button.OnPressed += _ => OnButtonPressed?.Invoke(userUid);
|
||||
MessageContainer.AddChild(button);
|
||||
}
|
||||
|
||||
///<summary>
|
||||
/// Adding a text label to the message container
|
||||
///</summary>
|
||||
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();
|
||||
MessagesScroll.SetScrollValue(Vector2.Zero);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<cartridges1:MessagesUiFragment
|
||||
xmlns="https://spacestation14.io"
|
||||
xmlns:cartridges1="clr-namespace:Content.Client._White.CartridgeLoader.Cartridges"
|
||||
Margin="1 0 2 0" Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
|
||||
<PanelContainer StyleClasses="BackgroundDark"/>
|
||||
<BoxContainer Name="OverContainer" Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
|
||||
<BoxContainer Name="HeaderBox">
|
||||
<Button Name="BackButton" Text="{Loc 'messages-pda-ui-back'}" HorizontalExpand="False"/>
|
||||
<Label Name="HeaderLabel"/>
|
||||
</BoxContainer>
|
||||
<LineEdit Name="SearchBar" PlaceHolder="Search" HorizontalExpand="True" Margin="0 4" />
|
||||
<ScrollContainer Name="MessagesScroll" HorizontalExpand="True" VerticalExpand="True" HScrollEnabled="True">
|
||||
<BoxContainer Orientation="Vertical" Name="MessageContainer" HorizontalExpand="True" VerticalExpand="True"/>
|
||||
</ScrollContainer>
|
||||
<LineEdit Name="Input" HorizontalExpand="True" SetHeight="32"/>
|
||||
</BoxContainer>
|
||||
</cartridges1:MessagesUiFragment>
|
||||
Reference in New Issue
Block a user