Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<DefaultWindow xmlns="https://spacestation14.io"
Title="{Loc nano-chat-group-create-title}"
MinSize="360 420">
<PanelContainer StyleClasses="AngleRect">
<BoxContainer Orientation="Vertical" Margin="4">
<!-- Name input -->
<BoxContainer Orientation="Vertical" Margin="0 4">
<Label Text="{Loc nano-chat-group-name-label}"
StyleClasses="LabelHeading" />
<PanelContainer StyleClasses="ButtonSquare">
<LineEdit Name="NameInput"
PlaceHolder="{Loc nano-chat-group-name-placeholder}" />
</PanelContainer>
</BoxContainer>

<!-- Public toggle -->
<CheckBox Name="PublicCheck"
Text="{Loc nano-chat-group-public}"
Margin="0 4" />

<!-- Members -->
<Label Text="{Loc nano-chat-group-select-members}"
StyleClasses="LabelHeading"
Margin="0 4 0 0" />
<ScrollContainer VerticalExpand="True"
HorizontalExpand="True"
MinSize="0 160">
<BoxContainer Name="MembersList"
Orientation="Vertical"
HorizontalExpand="True" />
</ScrollContainer>

<!-- Action buttons -->
<BoxContainer Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="0 8 0 0">
<Button Name="CancelButton"
Text="{Loc nano-chat-cancel}"
StyleClasses="OpenRight"
MinSize="80 0" />
<Button Name="CreateButton"
Text="{Loc nano-chat-create}"
StyleClasses="OpenLeft"
MinSize="80 0"
Disabled="True" />
</BoxContainer>
</BoxContainer>
</PanelContainer>
</DefaultWindow>
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using System.Linq;
using Content.Shared.ADT.CartridgeLoader.Cartridges;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;

namespace Content.Client.ADT.CartridgeLoader.Cartridges;

[GenerateTypedNameReferences]
public sealed partial class CreateGroupPopup : DefaultWindow
{
private const int MaxNameLength = 32;

private readonly List<(uint number, CheckBox box)> _memberBoxes = new();
private uint _ownNumber;

public event Action<string, bool, List<uint>>? OnGroupCreated;

public CreateGroupPopup()
{
RobustXamlLoader.Load(this);

ContentsContainer.Margin = new Thickness(3);

CancelButton.OnPressed += _ => Close();
CreateButton.OnPressed += _ => CreateGroup();

NameInput.OnTextChanged += args =>
{
if (args.Text.Length > MaxNameLength)
NameInput.Text = args.Text[..MaxNameLength];
ValidateInputs();
};

PublicCheck.OnToggled += _ => ValidateInputs();
}

public void SetContacts(List<NanoChatRecipient>? contacts, uint ownNumber)
{
_memberBoxes.Clear();
MembersList.RemoveAllChildren();
_ownNumber = ownNumber;

if (contacts == null)
return;

foreach (var contact in contacts.OrderBy(c => c.Name))
{
if (contact.Number == _ownNumber)
continue;

var box = new CheckBox()
{
Text = $"{contact.Name} (#{contact.Number:D4})",
HorizontalExpand = true,
};
box.OnToggled += _ => ValidateInputs();
MembersList.AddChild(box);
_memberBoxes.Add((contact.Number, box));
}
}

public void ClearInputs()
{
NameInput.Text = string.Empty;
PublicCheck.Pressed = false;
foreach (var (_, box) in _memberBoxes)
box.Pressed = false;
ValidateInputs();
}

private void ValidateInputs()
{
CreateButton.Disabled = string.IsNullOrWhiteSpace(NameInput.Text);
}

private void CreateGroup()
{
var name = NameInput.Text.Trim();
if (string.IsNullOrWhiteSpace(name))
return;

var members = _memberBoxes
.Where(m => m.box.Pressed)
.Select(m => m.number)
.ToList();

OnGroupCreated?.Invoke(name, PublicCheck.Pressed, members);
Close();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<DefaultWindow xmlns="https://spacestation14.io"
Title="{Loc nano-chat-group-members}"
MinSize="360 440">
<PanelContainer StyleClasses="AngleRect">
<BoxContainer Orientation="Vertical" Margin="4">
<Label Name="GroupNameLabel"
StyleClasses="LabelHeading"
HorizontalAlignment="Center"
Margin="0 4" />

<Label Text="{Loc nano-chat-group-member-list}"
StyleClasses="LabelSubText"
Margin="0 2 0 0" />
<ScrollContainer VerticalExpand="True"
HorizontalExpand="True"
MinSize="0 180">
<BoxContainer Name="MembersList"
Orientation="Vertical"
HorizontalExpand="True" />
</ScrollContainer>

<!-- Invite row -->
<BoxContainer Orientation="Horizontal"
Margin="0 6 0 0">
<PanelContainer StyleClasses="ButtonSquare"
HorizontalExpand="True">
<LineEdit Name="InviteNumberInput"
PlaceHolder="{Loc nano-chat-group-invite-placeholder}" />
</PanelContainer>
<Button Name="InviteButton"
Text="{Loc nano-chat-group-invite}"
StyleClasses="OpenLeft"
MinSize="96 0"
Disabled="True" />
</BoxContainer>

<!-- Action buttons -->
<BoxContainer Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="0 8 0 0">
<Button Name="LeaveButton"
Text="{Loc nano-chat-group-leave}"
StyleClasses="OpenRight"
MinSize="110 0" />
<Button Name="DeleteGroupButton"
Text="{Loc nano-chat-group-delete}"
StyleClasses="OpenLeft"
MinSize="110 0"
Visible="False" />
</BoxContainer>
</BoxContainer>
</PanelContainer>
</DefaultWindow>
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
using System.Linq;
using System.Numerics;
using Content.Shared.ADT.CartridgeLoader.Cartridges;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;

namespace Content.Client.ADT.CartridgeLoader.Cartridges;

[GenerateTypedNameReferences]
public sealed partial class GroupMembersPopup : DefaultWindow
{
private uint _groupNumber;
private uint _ownNumber;
private bool _isOwner;

public uint GroupNumber => _groupNumber;

public event Action<uint>? OnInvite;
public event Action<uint>? OnKick;
public event Action? OnLeave;
public event Action? OnDelete;

public GroupMembersPopup()
{
RobustXamlLoader.Load(this);

ContentsContainer.Margin = new Thickness(3);

LeaveButton.OnPressed += _ =>
{
OnLeave?.Invoke();
Close();
};
DeleteGroupButton.OnPressed += _ =>
{
OnDelete?.Invoke();
Close();
};
InviteButton.OnPressed += _ => Invite();
InviteNumberInput.OnTextChanged += args =>
{
if (args.Text.Length > 4)
InviteNumberInput.Text = args.Text[..4];

var digits = string.Concat(args.Text.Where(char.IsDigit));
if (digits != args.Text)
InviteNumberInput.Text = digits;

InviteButton.Disabled = !uint.TryParse(InviteNumberInput.Text, out _);
};
InviteNumberInput.OnTextEntered += _ => Invite();
}

public void SetGroup(NanoChatGroup group, uint ownNumber)
{
_groupNumber = group.Number;
_ownNumber = ownNumber;
_isOwner = group.Owner == ownNumber;

GroupNameLabel.Text = group.Name + " (" +
Loc.GetString("nano-chat-group-members-count", ("count", group.Members.Count)) + ")";
DeleteGroupButton.Visible = _isOwner;
LeaveButton.Text = Loc.GetString(_isOwner ? "nano-chat-group-leave-owner" : "nano-chat-group-leave");

MembersList.RemoveAllChildren();
foreach (var member in group.Members.OrderBy(m => m.Name))
{
var nameLabel = new Label()
{
Text = member.Name + (string.IsNullOrEmpty(member.JobTitle) ? "" : $" ({member.JobTitle})") + $" #{member.Number:D4}",
HorizontalExpand = true,
ClipText = true,
};

var panel = new PanelContainer()
{
HorizontalExpand = true,
};
var row = new BoxContainer()
{
Orientation = BoxContainer.LayoutOrientation.Horizontal,
HorizontalExpand = true,
VerticalAlignment = VAlignment.Center,
};
row.AddChild(nameLabel);

if (_isOwner && member.Number != ownNumber)
{
var kickButton = new Button()
{
Text = Loc.GetString("nano-chat-group-kick"),
MinSize = new Vector2(80, 28),
MaxSize = new Vector2(80, 28),
Margin = new Thickness(4, 0, 0, 0),
};
kickButton.AddStyleClass("OpenBoth");
var memberNumber = member.Number;
kickButton.OnPressed += _ =>
{
OnKick?.Invoke(memberNumber);
Close();
};
row.AddChild(kickButton);
}

panel.AddChild(row);
MembersList.AddChild(panel);
}

InviteNumberInput.Text = string.Empty;
InviteButton.Disabled = true;
}

private void Invite()
{
if (!uint.TryParse(InviteNumberInput.Text, out var number))
return;

if (number == _ownNumber)
return;

OnInvite?.Invoke(number);
InviteNumberInput.Text = string.Empty;
InviteButton.Disabled = true;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<BoxContainer
xmlns="https://spacestation14.io"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
Orientation="Vertical"
HorizontalExpand="True">

<!-- Clickable chat row for DMs and joined groups -->
<Button Name="ChatButton"
StyleClasses="ButtonSquare"
HorizontalExpand="True"
Expand Down Expand Up @@ -37,12 +40,56 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0 -2 0 0" />
<Label Name="JobLabel"
<Label Name="SubLabel"
StyleClasses="LabelSubText"
HorizontalExpand="True"
ClipText="False"
HorizontalAlignment="Center" />
</BoxContainer>
</BoxContainer>
</Button>

<!-- Info row for public groups and invites: name + action buttons stacked -->
<PanelContainer Name="InfoPanel"
StyleClasses="ButtonSquare"
HorizontalExpand="True"
Margin="0 1"
Visible="False">
<BoxContainer Orientation="Vertical"
HorizontalExpand="True"
Margin="6 4">
<RichTextLabel Name="InfoNameLabel"
StyleClasses="LabelHeading"
HorizontalExpand="True"
HorizontalAlignment="Center"
Margin="0 -2 0 0" />
<Label Name="InfoSubLabel"
StyleClasses="LabelSubText"
HorizontalExpand="True"
HorizontalAlignment="Left"
ClipText="True" />
<BoxContainer Name="ActionButtons"
Orientation="Vertical"
HorizontalExpand="True"
Margin="0 3 0 0">
<Button Name="JoinButton"
Text="{Loc nano-chat-group-join}"
HorizontalExpand="True"
MinHeight="28"
StyleClasses="OpenBoth" />
<Button Name="AcceptButton"
Text="{Loc nano-chat-group-accept}"
HorizontalExpand="True"
MinHeight="28"
Margin="0 2 0 0"
StyleClasses="OpenBoth" />
<Button Name="DeclineButton"
Text="{Loc nano-chat-group-decline}"
HorizontalExpand="True"
MinHeight="28"
Margin="0 2 0 0"
StyleClasses="OpenBoth" />
</BoxContainer>
</BoxContainer>
</PanelContainer>
</BoxContainer>
Loading
Loading