Skip to content

Commit fa7b89b

Browse files
committed
surely it just works first try
1 parent 644969c commit fa7b89b

File tree

46 files changed

+2563
-14
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2563
-14
lines changed

Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ protected override void Open()
2626
_window.OnNameChanged += OnNameChanged;
2727
_window.OnJobChanged += OnJobChanged;
2828
_window.OnJobIconChanged += OnJobIconChanged;
29+
_window.OnNumberChanged += OnNumberChanged; // Emberfall
30+
}
31+
32+
// Emberfall - Add number change handler
33+
private void OnNumberChanged(uint newNumber)
34+
{
35+
SendMessage(new AgentIDCardNumberChangedMessage(newNumber));
2936
}
3037

3138
private void OnNameChanged(string newName)
@@ -56,6 +63,7 @@ protected override void UpdateState(BoundUserInterfaceState state)
5663
_window.SetCurrentName(cast.CurrentName);
5764
_window.SetCurrentJob(cast.CurrentJob);
5865
_window.SetAllowedIcons(cast.CurrentJobIconId);
66+
_window.SetCurrentNumber(cast.CurrentNumber); // Emberfall
5967
}
6068
}
6169
}

Content.Client/Access/UI/AgentIDCardWindow.xaml

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
<LineEdit Name="NameLineEdit" />
77
<Label Name="CurrentJob" Text="{Loc 'agent-id-card-current-job'}" />
88
<LineEdit Name="JobLineEdit" />
9+
<!-- Emberfall - Add NanoChat number field -->
10+
<Label Name="CurrentNumber" Text="{Loc 'agent-id-card-current-number'}" />
11+
<LineEdit Name="NumberLineEdit" PlaceHolder="#0000" />
12+
<!-- Emberfall end -->
913
<Label Text="{Loc 'agent-id-card-job-icon-label'}"/>
1014
<GridContainer Name="IconGrid" Columns="10">
1115
<!-- Job icon buttons are generated in the code -->

Content.Client/Access/UI/AgentIDCardWindow.xaml.cs

+32
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ public sealed partial class AgentIDCardWindow : DefaultWindow
2121

2222
private const int JobIconColumnCount = 10;
2323

24+
private const int MaxNumberLength = 4; // Emberfall - Same as NewChatPopup
2425
public event Action<string>? OnNameChanged;
2526
public event Action<string>? OnJobChanged;
27+
public event Action<uint>? OnNumberChanged; // Emberfall - Add event for number changes
2628

2729
public event Action<ProtoId<JobIconPrototype>>? OnJobIconChanged;
2830

@@ -37,6 +39,36 @@ public AgentIDCardWindow()
3739

3840
JobLineEdit.OnTextEntered += e => OnJobChanged?.Invoke(e.Text);
3941
JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text);
42+
43+
// Emberfall - Add handlers for number changes
44+
NumberLineEdit.OnTextEntered += OnNumberEntered;
45+
NumberLineEdit.OnFocusExit += OnNumberEntered;
46+
47+
// Emberfall
48+
NumberLineEdit.OnTextChanged += args =>
49+
{
50+
if (args.Text.Length > MaxNumberLength)
51+
{
52+
NumberLineEdit.Text = args.Text[..MaxNumberLength];
53+
}
54+
55+
// Filter to digits only
56+
var newText = string.Concat(args.Text.Where(char.IsDigit));
57+
if (newText != args.Text)
58+
NumberLineEdit.Text = newText;
59+
};
60+
}
61+
// Emberfall - Add number validation and event
62+
private void OnNumberEntered(LineEdit.LineEditEventArgs args)
63+
{
64+
if (uint.TryParse(args.Text, out var number) && number > 0)
65+
OnNumberChanged?.Invoke(number);
66+
}
67+
68+
// Emberfall - Add setter for current number
69+
public void SetCurrentNumber(uint? number)
70+
{
71+
NumberLineEdit.Text = number?.ToString("D4") ?? "";
4072
}
4173

4274
public void SetAllowedIcons(string currentJobIconId)

Content.Client/CartridgeLoader/Cartridges/LogProbeUi.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ public override void UpdateState(BoundUserInterfaceState state)
2323
if (state is not LogProbeUiState logProbeUiState)
2424
return;
2525

26-
_fragment?.UpdateState(logProbeUiState.PulledLogs);
26+
_fragment?.UpdateState(logProbeUiState); // Emberfall - just take the state
2727
}
2828
}

Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml

+24-4
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,30 @@
99
BorderColor="#5a5a5a"
1010
BorderThickness="0 0 0 1"/>
1111
</PanelContainer.PanelOverride>
12-
<BoxContainer Orientation="Horizontal" Margin="4 8">
13-
<Label Align="Right" SetWidth="26" ClipText="True" Text="{Loc 'log-probe-label-number'}"/>
14-
<Label Align="Center" SetWidth="100" ClipText="True" Text="{Loc 'log-probe-label-time'}"/>
15-
<Label Align="Left" SetWidth="390" ClipText="True" Text="{Loc 'log-probe-label-accessor'}"/>
12+
<BoxContainer Orientation="Vertical" Margin="4 8">
13+
<!-- Emberfall begin - Add title label -->
14+
<Label Name="TitleLabel"
15+
Text="{Loc 'log-probe-header-access'}"
16+
StyleClasses="LabelHeading"
17+
HorizontalAlignment="Center"
18+
Margin="0 0 0 8"/>
19+
<!-- Emberfall end -->
20+
21+
<!-- Emberfall begin - Add card number display -->
22+
<Label Name="CardNumberLabel"
23+
StyleClasses="LabelSubText"
24+
HorizontalAlignment="Center"
25+
Margin="0 0 0 8"
26+
Visible="False"/>
27+
<!-- Emberfall end -->
28+
29+
<!-- Emberfall begin - Adjust column headers -->
30+
<BoxContainer Orientation="Horizontal">
31+
<Label Align="Right" SetWidth="26" ClipText="True" Text="{Loc 'log-probe-label-number'}"/>
32+
<Label Align="Center" SetWidth="100" ClipText="True" Text="{Loc 'log-probe-label-time'}"/>
33+
<Label Name="ContentLabel" Align="Left" SetWidth="390" ClipText="True" Text="{Loc 'log-probe-label-accessor'}"/>
34+
</BoxContainer>
35+
<!-- Emberfall end -->
1636
</BoxContainer>
1737
</PanelContainer>
1838
<ScrollContainer VerticalExpand="True" HScrollEnabled="True">

Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml.cs

+107-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Content.Shared.CartridgeLoader.Cartridges;
1+
using System.Linq; // Emberfall
2+
using Content.Client._Emberfall.CartridgeLoader.Cartridges; // Emberfall
3+
using Content.Shared._Emberfall.CartridgeLoader.Cartridges; // Emberfall
4+
using Content.Shared.CartridgeLoader.Cartridges;
25
using Robust.Client.AutoGenerated;
36
using Robust.Client.UserInterface.Controls;
47
using Robust.Client.UserInterface.XAML;
@@ -13,11 +16,112 @@ public LogProbeUiFragment()
1316
RobustXamlLoader.Load(this);
1417
}
1518

16-
public void UpdateState(List<PulledAccessLog> logs)
19+
// Emberfall begin - Update to handle both types of data
20+
public void UpdateState(LogProbeUiState state)
1721
{
1822
ProbedDeviceContainer.RemoveAllChildren();
1923

20-
//Reverse the list so the oldest entries appear at the bottom
24+
if (state.NanoChatData != null)
25+
{
26+
SetupNanoChatView(state.NanoChatData.Value);
27+
DisplayNanoChatData(state.NanoChatData.Value);
28+
}
29+
else
30+
{
31+
SetupAccessLogView();
32+
if (state.PulledLogs.Count > 0)
33+
DisplayAccessLogs(state.PulledLogs);
34+
}
35+
}
36+
37+
private void SetupNanoChatView(NanoChatData data)
38+
{
39+
TitleLabel.Text = Loc.GetString("log-probe-header-nanochat");
40+
ContentLabel.Text = Loc.GetString("log-probe-label-message");
41+
42+
// Show card info if available
43+
var cardInfo = new List<string>();
44+
if (data.CardNumber != null)
45+
cardInfo.Add(Loc.GetString("log-probe-card-number", ("number", $"#{data.CardNumber:D4}")));
46+
47+
// Add recipient count
48+
cardInfo.Add(Loc.GetString("log-probe-recipients", ("count", data.Recipients.Count)));
49+
50+
CardNumberLabel.Text = string.Join(" | ", cardInfo);
51+
CardNumberLabel.Visible = true;
52+
}
53+
54+
private void SetupAccessLogView()
55+
{
56+
TitleLabel.Text = Loc.GetString("log-probe-header-access");
57+
ContentLabel.Text = Loc.GetString("log-probe-label-accessor");
58+
CardNumberLabel.Visible = false;
59+
}
60+
61+
private void DisplayNanoChatData(NanoChatData data)
62+
{
63+
// First add a recipient list entry
64+
var recipientsList = Loc.GetString("log-probe-recipient-list") + "\n" + string.Join("\n",
65+
data.Recipients.Values
66+
.OrderBy(r => r.Name)
67+
.Select(r => $" {r.Name}" +
68+
(string.IsNullOrEmpty(r.JobTitle) ? "" : $" ({r.JobTitle})") +
69+
$" | #{r.Number:D4}"));
70+
71+
var recipientsEntry = new LogProbeUiEntry(0, "---", recipientsList);
72+
ProbedDeviceContainer.AddChild(recipientsEntry);
73+
74+
var count = 1;
75+
foreach (var (partnerId, messages) in data.Messages)
76+
{
77+
// Show only successfully delivered incoming messages
78+
var incomingMessages = messages
79+
.Where(msg => msg.SenderId == partnerId && !msg.DeliveryFailed)
80+
.OrderByDescending(msg => msg.Timestamp);
81+
82+
foreach (var msg in incomingMessages)
83+
{
84+
var messageText = Loc.GetString("log-probe-message-format",
85+
("sender", $"#{msg.SenderId:D4}"),
86+
("recipient", $"#{data.CardNumber:D4}"),
87+
("content", msg.Content));
88+
89+
var entry = new NanoChatLogEntry(
90+
count,
91+
TimeSpan.FromSeconds(Math.Truncate(msg.Timestamp.TotalSeconds)).ToString(),
92+
messageText);
93+
94+
ProbedDeviceContainer.AddChild(entry);
95+
count++;
96+
}
97+
98+
// Show only successfully delivered outgoing messages
99+
var outgoingMessages = messages
100+
.Where(msg => msg.SenderId == data.CardNumber && !msg.DeliveryFailed)
101+
.OrderByDescending(msg => msg.Timestamp);
102+
103+
foreach (var msg in outgoingMessages)
104+
{
105+
var messageText = Loc.GetString("log-probe-message-format",
106+
("sender", $"#{msg.SenderId:D4}"),
107+
("recipient", $"#{partnerId:D4}"),
108+
("content", msg.Content));
109+
110+
var entry = new NanoChatLogEntry(
111+
count,
112+
TimeSpan.FromSeconds(Math.Truncate(msg.Timestamp.TotalSeconds)).ToString(),
113+
messageText);
114+
115+
ProbedDeviceContainer.AddChild(entry);
116+
count++;
117+
}
118+
}
119+
}
120+
// Emberfall end
121+
122+
// Emberfall - Handle this in a separate method
123+
private void DisplayAccessLogs(List<PulledAccessLog> logs)
124+
{
21125
logs.Reverse();
22126

23127
var count = 1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<BoxContainer
2+
xmlns="https://spacestation14.io"
3+
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
4+
HorizontalExpand="True">
5+
<Button Name="ChatButton"
6+
StyleClasses="ButtonSquare"
7+
HorizontalExpand="True"
8+
MaxSize="137 64"
9+
Margin="0 1">
10+
<BoxContainer Orientation="Horizontal"
11+
HorizontalExpand="True"
12+
VerticalExpand="True"
13+
MinWidth="132"
14+
Margin="6 4"
15+
VerticalAlignment="Center">
16+
<!-- Unread indicator dot -->
17+
<PanelContainer Name="UnreadIndicator"
18+
MinSize="8 8"
19+
MaxSize="8 8"
20+
VerticalAlignment="Center"
21+
Margin="0 0 6 0">
22+
<PanelContainer.PanelOverride>
23+
<graphics:StyleBoxFlat
24+
BackgroundColor="#17c622"
25+
BorderColor="#0f7a15" />
26+
</PanelContainer.PanelOverride>
27+
</PanelContainer>
28+
29+
<!-- Text container -->
30+
<BoxContainer Orientation="Vertical"
31+
HorizontalExpand="True"
32+
VerticalExpand="True"
33+
VerticalAlignment="Center">
34+
<RichTextLabel Name="NameLabel"
35+
StyleClasses="LabelHeading"
36+
HorizontalExpand="True"
37+
HorizontalAlignment="Center"
38+
VerticalAlignment="Center"
39+
Margin="0 -2 0 0" />
40+
<Label Name="JobLabel"
41+
StyleClasses="LabelSubText"
42+
HorizontalExpand="True"
43+
ClipText="False"
44+
HorizontalAlignment="Center" />
45+
</BoxContainer>
46+
</BoxContainer>
47+
</Button>
48+
</BoxContainer>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Content.Shared._Emberfall.CartridgeLoader.Cartridges;
2+
using Robust.Client.AutoGenerated;
3+
using Robust.Client.UserInterface.Controls;
4+
using Robust.Client.UserInterface.XAML;
5+
6+
namespace Content.Client._Emberfall.CartridgeLoader.Cartridges;
7+
8+
[GenerateTypedNameReferences]
9+
public sealed partial class NanoChatEntry : BoxContainer
10+
{
11+
public event Action<uint>? OnPressed;
12+
private uint _number;
13+
private Action<EventArgs>? _pressHandler;
14+
15+
public NanoChatEntry()
16+
{
17+
RobustXamlLoader.Load(this);
18+
}
19+
20+
public void SetRecipient(NanoChatRecipient recipient, uint number, bool isSelected)
21+
{
22+
// Remove old handler if it exists
23+
if (_pressHandler != null)
24+
ChatButton.OnPressed -= _pressHandler;
25+
26+
_number = number;
27+
28+
// Create and store new handler
29+
_pressHandler = _ => OnPressed?.Invoke(_number);
30+
ChatButton.OnPressed += _pressHandler;
31+
32+
NameLabel.Text = recipient.Name;
33+
JobLabel.Text = recipient.JobTitle ?? "";
34+
JobLabel.Visible = !string.IsNullOrEmpty(recipient.JobTitle);
35+
UnreadIndicator.Visible = recipient.HasUnread;
36+
37+
ChatButton.ModulateSelfOverride = isSelected ? NanoChatMessageBubble.OwnMessageColor : null;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<BoxContainer xmlns="https://spacestation14.io"
2+
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
3+
Margin="4"
4+
Orientation="Vertical">
5+
<BoxContainer Orientation="Horizontal">
6+
<Label Name="NumberLabel"
7+
Align="Right"
8+
SetWidth="26"
9+
ClipText="True" />
10+
<Label Name="TimeLabel"
11+
Align="Center"
12+
SetWidth="100"
13+
ClipText="True" />
14+
<Label Name="MessageLabel"
15+
Align="Left"
16+
MinWidth="390"
17+
HorizontalExpand="True"
18+
ClipText="False" />
19+
</BoxContainer>
20+
<customControls:HSeparator Margin="0 5 0 5" />
21+
</BoxContainer>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Robust.Client.AutoGenerated;
2+
using Robust.Client.UserInterface.Controls;
3+
using Robust.Client.UserInterface.XAML;
4+
5+
namespace Content.Client._Emberfall.CartridgeLoader.Cartridges;
6+
7+
[GenerateTypedNameReferences]
8+
public sealed partial class NanoChatLogEntry : BoxContainer
9+
{
10+
public NanoChatLogEntry(int number, string time, string message)
11+
{
12+
RobustXamlLoader.Load(this);
13+
NumberLabel.Text = number.ToString();
14+
TimeLabel.Text = time;
15+
MessageLabel.Text = message;
16+
}
17+
}

0 commit comments

Comments
 (0)