Files
Spatison cced3cc98b Сообщения в ПДА 2 (#583)
* add: AdminLog

* tweak: clean up

* fix: Changeling -> Network

* add: сортировка сообщений

* fix: ТексТ
2024-08-08 13:20:06 +03:00

126 lines
3.8 KiB
C#

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);
}
}