mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
* Shared/Utility: Define new FormattedMessage core types * Shared/Utility: Move MarkupParser to a new namespace, update to new FormattedText * Shared/Serialization: Temporary fix for FormattedMessageSerializer * Scripting/ScriptInstanceShared: Move to new FormattedMessage.Builder * Shared/Utility: Add a FormattedMessage loader to the .Builder * Server/Scripting: Port SciptHost to FormattedMessage.Builder * UserInterface/RichTextEntry: NOP out almost everything not gonna bother fixing it until more groundwork is laid * Shared/Utility: Expand Utility.Extensions a bit strictly for pesonal reasons * Client/UserInterface: Add the base TextLayout engine * Client/Graphics: Add a Font Library manager * Graphics/TextLayout: Finish up implementing the TextLayout engine * Utility/FormattedMessage: Add yet another hack to keep the serializer in service * Commands/Debug: Use FormattedMessage.Builder * Console/Completions: Use FormattedMessage.Builder * Utility/FormattedMessage: Add `AddMessage` methods * Console/ScriptConsole: Use FormattedMessage.Builder * Client/Log: Use FormattedMessage.Builder * CustomControls/DebugConsole: Use FormattedMessage.Builder * Controls/OutputPanel: Use FormattedMessage.Builder, NOP `Draw` pending rewrite * Controls/RichTextLabel: Use FormattedMessage.Builder, NOP `Draw` pending rewrite * UnitTesting: Update FormattedMessage/Markup Tests They will NOT pass yet, but I don't care; it compiles. * Utility/FormattedMessage: Fix some off-by-one Builder bugs * Utility/FormattedMessage: Continue cleanup, test compliance * Utility/FormattedMessage: Work around https://github.com/dotnet/roslyn/issues/57870 * Utility/FormattedMessage: Move ISectionable from TextLayout, implement it for FormattedMessage * UserInterface/TextLayout: Add a `postcreate` function to set up new `TIn`s Apparently Roslyn isn't big-brained enough to understand that a closure of type `Func<T>` means that `var n = new(); return n;` requires `new()` to return a `T`. Ironically, it's significantly less cbt to add this than to convert that big tuple in `Layout` in to a class or struct of some sort (to initialize the `List<>`s). * UserInterface/TextLayout: Throw if `Meta` isn't recognized TODO warning go brrr * Graphics/FontLibrary: Add a `DummyVariant` * UserInterface/UITheme: Move to FontLibraries * UserInterface/TextLayout: Move to an un-nested `ImmutableArray` * UserInterface/RichTextEntry: Go ahead. Draw. * Markup/Basic: Add extension & helpers for FormattedMessage.Builder * Markup/Basic: Add `EscapeText` back in A forgotten casualty of the great Markup separation of 2021 * Graphics/FontLibrary: Clean up bit magic, ensure that at least one font is picked * Graphics/FontLibrary: Add diagnostics to the "no fonts" exception * UserInterface/TextLayout: Scrap `Word`, return to `Offset` * UserInterface/TextLayout: A whole bunch of hard-fought bugfixes * Utility/FormattedMessage: Add a static, empty FormattedMessage * Utility/FormattedMessage: Fix. Bugs. * UserInterface/RichTextEntry: Bug fixin' * UserInterface: CSS teim * Markup/Basic: Add an optional "default" style to use * Utility/FormattedMessage: I'm surprised I only made this mistake once. * Log/DebugConsoleLogHandler: work around lack of a default style
117 lines
3.6 KiB
C#
117 lines
3.6 KiB
C#
using Robust.Client.UserInterface.CustomControls;
|
|
using Robust.Shared.Localization;
|
|
using Robust.Shared.Maths;
|
|
using Robust.Shared.Network.Messages;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Robust.Client.Console
|
|
{
|
|
public partial class ScriptClient
|
|
{
|
|
private sealed class ScriptConsoleServer : ScriptConsole
|
|
{
|
|
private readonly ScriptClient _client;
|
|
private readonly int _session;
|
|
|
|
private int _linesEntered;
|
|
private string? _lastEnteredText;
|
|
|
|
public ScriptConsoleServer(ScriptClient client, int session)
|
|
{
|
|
_client = client;
|
|
_session = session;
|
|
Title = Loc.GetString("Robust C# Interactive (SERVER)");
|
|
|
|
OutputPanel.AddText(Loc.GetString(@"Robust C# interactive console (SERVER)."));
|
|
OutputPanel.AddText(">");
|
|
}
|
|
|
|
protected override void Run()
|
|
{
|
|
if (RunButton.Disabled || string.IsNullOrWhiteSpace(InputBar.Text))
|
|
{
|
|
return;
|
|
}
|
|
|
|
RunButton.Disabled = true;
|
|
|
|
var msg = _client._netManager.CreateNetMessage<MsgScriptEval>();
|
|
msg.ScriptSession = _session;
|
|
msg.Code = _lastEnteredText = InputBar.Text;
|
|
|
|
_client._netManager.ClientSendMessage(msg);
|
|
|
|
InputBar.Clear();
|
|
|
|
|
|
}
|
|
|
|
protected override void Complete()
|
|
{
|
|
var msg = _client._netManager.CreateNetMessage<MsgScriptCompletion>();
|
|
msg.ScriptSession = _session;
|
|
msg.Code = InputBar.Text;
|
|
msg.Cursor = InputBar.CursorPosition;
|
|
|
|
_client._netManager.ClientSendMessage(msg);
|
|
}
|
|
|
|
public override void Close()
|
|
{
|
|
base.Close();
|
|
|
|
_client.ConsoleClosed(_session);
|
|
}
|
|
|
|
public void ReceiveResponse(MsgScriptResponse response)
|
|
{
|
|
RunButton.Disabled = false;
|
|
|
|
// Remove > or . at the end of the output panel.
|
|
OutputPanel.RemoveEntry(^1);
|
|
_linesEntered += 1;
|
|
|
|
if (!response.WasComplete)
|
|
{
|
|
if (_linesEntered == 1)
|
|
{
|
|
OutputPanel.AddText($"> {_lastEnteredText}");
|
|
}
|
|
else
|
|
{
|
|
OutputPanel.AddText($". {_lastEnteredText}");
|
|
}
|
|
|
|
OutputPanel.AddText(".");
|
|
return;
|
|
}
|
|
|
|
// Remove echo of partial submission from the output panel.
|
|
for (var i = 1; i < _linesEntered; i++)
|
|
{
|
|
OutputPanel.RemoveEntry(^1);
|
|
}
|
|
|
|
_linesEntered = 0;
|
|
|
|
// Echo entered script.
|
|
var echoMessage = new FormattedMessage.Builder();
|
|
echoMessage.PushColor(Color.FromHex("#D4D4D4"));
|
|
echoMessage.AddText("> ");
|
|
echoMessage.AddMessage(response.Echo);
|
|
OutputPanel.AddMessage(echoMessage.Build());
|
|
|
|
OutputPanel.AddMessage(response.Response);
|
|
|
|
OutputPanel.AddText(">");
|
|
}
|
|
|
|
public void ReceiveCompletionResponse(MsgScriptCompletionResponse response)
|
|
{
|
|
Suggestions.SetSuggestions(response);
|
|
Suggestions.OpenAt((Position.X + Size.X, Position.Y), (Size.X / 2, Size.Y));
|
|
}
|
|
}
|
|
}
|
|
}
|