-
Notifications
You must be signed in to change notification settings - Fork 155
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[PORT] Nanochat #1009
base: master
Are you sure you want to change the base?
[PORT] Nanochat #1009
Changes from all commits
af70665
9e8ddc7
736a59d
66eb865
99c5754
f6afff8
d0f6efb
16d3f4d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
<BoxContainer | ||
xmlns="https://spacestation14.io" | ||
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" | ||
HorizontalExpand="True"> | ||
<Button Name="ChatButton" | ||
StyleClasses="ButtonSquare" | ||
HorizontalExpand="True" | ||
MaxSize="137 64" | ||
Margin="0 1"> | ||
<BoxContainer Orientation="Horizontal" | ||
HorizontalExpand="True" | ||
VerticalExpand="True" | ||
MinWidth="132" | ||
Margin="6 4" | ||
VerticalAlignment="Center"> | ||
<!-- Unread indicator dot --> | ||
<PanelContainer Name="UnreadIndicator" | ||
MinSize="8 8" | ||
MaxSize="8 8" | ||
VerticalAlignment="Center" | ||
Margin="0 0 6 0"> | ||
<PanelContainer.PanelOverride> | ||
<graphics:StyleBoxFlat | ||
BackgroundColor="#17c622" | ||
BorderColor="#0f7a15" /> | ||
</PanelContainer.PanelOverride> | ||
</PanelContainer> | ||
|
||
<!-- Text container --> | ||
<BoxContainer Orientation="Vertical" | ||
HorizontalExpand="True" | ||
VerticalExpand="True" | ||
VerticalAlignment="Center"> | ||
<RichTextLabel Name="NameLabel" | ||
StyleClasses="LabelHeading" | ||
HorizontalExpand="True" | ||
HorizontalAlignment="Center" | ||
VerticalAlignment="Center" | ||
Margin="0 -2 0 0" /> | ||
<Label Name="JobLabel" | ||
StyleClasses="LabelSubText" | ||
HorizontalExpand="True" | ||
ClipText="False" | ||
HorizontalAlignment="Center" /> | ||
</BoxContainer> | ||
</BoxContainer> | ||
</Button> | ||
</BoxContainer> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using Content.Shared._CorvaxNext.CartridgeLoader.Cartridges; | ||
using Robust.Client.AutoGenerated; | ||
using Robust.Client.UserInterface.Controls; | ||
using Robust.Client.UserInterface.XAML; | ||
|
||
namespace Content.Client._CorvaxNext.CartridgeLoader.Cartridges; | ||
|
||
[GenerateTypedNameReferences] | ||
public sealed partial class NanoChatEntry : BoxContainer | ||
{ | ||
public event Action<uint>? OnPressed; | ||
private uint _number; | ||
private Action<EventArgs>? _pressHandler; | ||
|
||
public NanoChatEntry() | ||
{ | ||
RobustXamlLoader.Load(this); | ||
} | ||
|
||
public void SetRecipient(NanoChatRecipient recipient, uint number, bool isSelected) | ||
{ | ||
// Remove old handler if it exists | ||
if (_pressHandler != null) | ||
ChatButton.OnPressed -= _pressHandler; | ||
|
||
_number = number; | ||
|
||
// Create and store new handler | ||
_pressHandler = _ => OnPressed?.Invoke(_number); | ||
ChatButton.OnPressed += _pressHandler; | ||
|
||
NameLabel.Text = recipient.Name; | ||
JobLabel.Text = recipient.JobTitle ?? ""; | ||
JobLabel.Visible = !string.IsNullOrEmpty(recipient.JobTitle); | ||
UnreadIndicator.Visible = recipient.HasUnread; | ||
|
||
ChatButton.ModulateSelfOverride = isSelected ? NanoChatMessageBubble.OwnMessageColor : null; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<BoxContainer xmlns="https://spacestation14.io" | ||
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls" | ||
Margin="4" | ||
Orientation="Vertical"> | ||
<BoxContainer Orientation="Horizontal"> | ||
<Label Name="NumberLabel" | ||
Align="Right" | ||
SetWidth="26" | ||
ClipText="True" /> | ||
<Label Name="TimeLabel" | ||
Align="Center" | ||
SetWidth="100" | ||
ClipText="True" /> | ||
<Label Name="MessageLabel" | ||
Align="Left" | ||
MinWidth="390" | ||
HorizontalExpand="True" | ||
ClipText="False" /> | ||
</BoxContainer> | ||
<customControls:HSeparator Margin="0 5 0 5" /> | ||
</BoxContainer> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
using Robust.Client.AutoGenerated; | ||
using Robust.Client.UserInterface.Controls; | ||
using Robust.Client.UserInterface.XAML; | ||
|
||
namespace Content.Client._CorvaxNext.CartridgeLoader.Cartridges; | ||
|
||
[GenerateTypedNameReferences] | ||
public sealed partial class NanoChatLogEntry : BoxContainer | ||
{ | ||
public NanoChatLogEntry(int number, string time, string message) | ||
{ | ||
RobustXamlLoader.Load(this); | ||
NumberLabel.Text = number.ToString(); | ||
TimeLabel.Text = time; | ||
MessageLabel.Text = message; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<cartridges:NanoChatMessageBubble | ||
xmlns="https://spacestation14.io" | ||
xmlns:cartridges="clr-namespace:Content.Client._CorvaxNext.CartridgeLoader.Cartridges" | ||
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" | ||
HorizontalExpand="True"> | ||
|
||
<BoxContainer Name="MessageContainer" | ||
Orientation="Horizontal" | ||
HorizontalExpand="True"> | ||
<!-- Left spacer for other's messages --> | ||
<Control Name="LeftSpacer" | ||
MinSize="12 0" /> | ||
|
||
<!-- Message panel --> | ||
<BoxContainer Name="MessageBox" | ||
Orientation="Vertical" | ||
MaxWidth="320" | ||
HorizontalExpand="True"> | ||
<PanelContainer Name="MessagePanel" | ||
MaxWidth="320" | ||
HorizontalExpand="True"> | ||
<PanelContainer.PanelOverride> | ||
<graphics:StyleBoxFlat | ||
ContentMarginLeftOverride="10" | ||
ContentMarginRightOverride="10" | ||
ContentMarginTopOverride="6" | ||
ContentMarginBottomOverride="6" | ||
BorderThickness="1"> | ||
<!-- Colors set in code based on message sender --> | ||
</graphics:StyleBoxFlat> | ||
</PanelContainer.PanelOverride> | ||
|
||
<RichTextLabel Name="MessageText" | ||
HorizontalExpand="True" /> | ||
</PanelContainer> | ||
|
||
<!-- Delivery failed text --> | ||
<Label Name="DeliveryFailedLabel" | ||
Text="{Loc nano-chat-delivery-failed}" | ||
StyleClasses="LabelSmall" | ||
HorizontalExpand="True" | ||
HorizontalAlignment="Right" | ||
Margin="10 2 10 0" | ||
Visible="False" /> | ||
</BoxContainer> | ||
|
||
<!-- Right spacer for own messages --> | ||
<Control Name="RightSpacer" | ||
MinSize="12 0" /> | ||
|
||
<!-- Flexible space for alignment --> | ||
<Control Name="FlexSpace" | ||
HorizontalExpand="True" /> | ||
</BoxContainer> | ||
</cartridges:NanoChatMessageBubble> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
using Content.Shared._CorvaxNext.CartridgeLoader.Cartridges; | ||
using Robust.Client.AutoGenerated; | ||
using Robust.Client.Graphics; | ||
using Robust.Client.UserInterface.Controls; | ||
using Robust.Client.UserInterface.XAML; | ||
|
||
namespace Content.Client._CorvaxNext.CartridgeLoader.Cartridges; | ||
|
||
[GenerateTypedNameReferences] | ||
public sealed partial class NanoChatMessageBubble : BoxContainer | ||
{ | ||
public static readonly Color OwnMessageColor = Color.FromHex("#173717d9"); // Dark green | ||
public static readonly Color OtherMessageColor = Color.FromHex("#252525d9"); // Dark gray | ||
public static readonly Color BorderColor = Color.FromHex("#40404066"); // Subtle border | ||
public static readonly Color TextColor = Color.FromHex("#dcdcdc"); // Slightly softened white | ||
public static readonly Color ErrorColor = Color.FromHex("#cc3333"); // Red | ||
Comment on lines
+12
to
+16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Переместите цвета в систему тем Жестко закодированные значения цветов следует перенести в систему тем для обеспечения единообразия и поддержки различных тем оформления. -public static readonly Color OwnMessageColor = Color.FromHex("#173717d9");
-public static readonly Color OtherMessageColor = Color.FromHex("#252525d9");
-public static readonly Color BorderColor = Color.FromHex("#40404066");
-public static readonly Color TextColor = Color.FromHex("#dcdcdc");
-public static readonly Color ErrorColor = Color.FromHex("#cc3333");
+public static readonly string ThemeVarOwnMessage = "nanochat-own-message";
+public static readonly string ThemeVarOtherMessage = "nanochat-other-message";
// ... и так далее для остальных цветов
|
||
|
||
public NanoChatMessageBubble() | ||
{ | ||
RobustXamlLoader.Load(this); | ||
} | ||
|
||
public void SetMessage(NanoChatMessage message, bool isOwnMessage) | ||
{ | ||
if (MessagePanel.PanelOverride is not StyleBoxFlat) | ||
return; | ||
|
||
// Configure message appearance | ||
var style = (StyleBoxFlat)MessagePanel.PanelOverride; | ||
style.BackgroundColor = isOwnMessage ? OwnMessageColor : OtherMessageColor; | ||
style.BorderColor = BorderColor; | ||
|
||
// Set message content | ||
MessageText.Text = message.Content; | ||
MessageText.Modulate = TextColor; | ||
|
||
// Show delivery failed text if needed (only for own messages) | ||
DeliveryFailedLabel.Visible = isOwnMessage && message.DeliveryFailed; | ||
if (DeliveryFailedLabel.Visible) | ||
DeliveryFailedLabel.Modulate = ErrorColor; | ||
|
||
// For own messages: FlexSpace -> MessagePanel -> RightSpacer | ||
// For other messages: LeftSpacer -> MessagePanel -> FlexSpace | ||
MessageContainer.RemoveAllChildren(); | ||
|
||
// fuuuuuck | ||
MessageBox.Parent?.RemoveChild(MessageBox); | ||
|
||
if (isOwnMessage) | ||
{ | ||
MessageContainer.AddChild(FlexSpace); | ||
MessageContainer.AddChild(MessageBox); | ||
MessageContainer.AddChild(RightSpacer); | ||
} | ||
else | ||
{ | ||
MessageContainer.AddChild(LeftSpacer); | ||
MessageContainer.AddChild(MessageBox); | ||
MessageContainer.AddChild(FlexSpace); | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,43 @@ | ||||||||||
using Content.Client.UserInterface.Fragments; | ||||||||||
using Content.Shared.CartridgeLoader; | ||||||||||
using Content.Shared._CorvaxNext.CartridgeLoader.Cartridges; | ||||||||||
using Robust.Client.UserInterface; | ||||||||||
|
||||||||||
namespace Content.Client._CorvaxNext.CartridgeLoader.Cartridges; | ||||||||||
|
||||||||||
public sealed partial class NanoChatUi : UIFragment | ||||||||||
{ | ||||||||||
private NanoChatUiFragment? _fragment; | ||||||||||
|
||||||||||
public override Control GetUIFragmentRoot() | ||||||||||
{ | ||||||||||
return _fragment!; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Добавьте проверку на null Использование оператора - return _fragment!;
+ if (_fragment == null)
+ throw new InvalidOperationException("NanoChatUi fragment not initialized");
+ return _fragment; 📝 Committable suggestion
Suggested change
|
||||||||||
} | ||||||||||
|
||||||||||
public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner) | ||||||||||
{ | ||||||||||
_fragment = new NanoChatUiFragment(); | ||||||||||
|
||||||||||
_fragment.OnMessageSent += (type, number, content, job) => | ||||||||||
{ | ||||||||||
SendNanoChatUiMessage(type, number, content, job, userInterface); | ||||||||||
}; | ||||||||||
} | ||||||||||
|
||||||||||
public override void UpdateState(BoundUserInterfaceState state) | ||||||||||
{ | ||||||||||
if (state is NanoChatUiState cast) | ||||||||||
_fragment?.UpdateState(cast); | ||||||||||
} | ||||||||||
|
||||||||||
private static void SendNanoChatUiMessage(NanoChatUiMessageType type, | ||||||||||
uint? number, | ||||||||||
string? content, | ||||||||||
string? job, | ||||||||||
BoundUserInterface userInterface) | ||||||||||
{ | ||||||||||
var nanoChatMessage = new NanoChatUiMessageEvent(type, number, content, job); | ||||||||||
var message = new CartridgeUiMessage(nanoChatMessage); | ||||||||||
userInterface.SendMessage(message); | ||||||||||
} | ||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Вынести дублирующуюся константу!
Константа
MaxNumberLength
дублируется сNewChatPopup
. Рекомендуется вынести её в общий файл констант.