* add: AdminLog * tweak: clean up * fix: Changeling -> Network * add: сортировка сообщений * fix: ТексТ
126 lines
3.8 KiB
C#
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);
|
|
}
|
|
}
|