Skip to content
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

Fax machines can print from text file #23262

Merged
merged 11 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
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
28 changes: 28 additions & 0 deletions Content.Client/Fax/UI/FaxBoundUi.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
using System.IO;
using System.Threading.Tasks;
using Content.Shared.Fax;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;

namespace Content.Client.Fax.UI;

[UsedImplicitly]
public sealed class FaxBoundUi : BoundUserInterface
{
[Dependency] private readonly IFileDialogManager _fileDialogManager = default!;

[ViewVariables]
private FaxWindow? _window;

private bool _dialogIsOpen = false;

public FaxBoundUi(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
Expand All @@ -22,12 +29,33 @@ protected override void Open()
_window.OpenCentered();

_window.OnClose += Close;
_window.FileButtonPressed += OnFileButtonPressed;
_window.CopyButtonPressed += OnCopyButtonPressed;
_window.SendButtonPressed += OnSendButtonPressed;
_window.RefreshButtonPressed += OnRefreshButtonPressed;
_window.PeerSelected += OnPeerSelected;
}

private async void OnFileButtonPressed()
{
if (_dialogIsOpen)
return;

_dialogIsOpen = true;
var filters = new FileDialogFilters(new FileDialogFilters.Group("txt"));
await using var file = await _fileDialogManager.OpenFile(filters);
_dialogIsOpen = false;

if (_window == null || _window.Disposed || file == null)
{
return;
}

using var reader = new StreamReader(file);
var content = await reader.ReadToEndAsync();
SendMessage(new FaxFileMessage(content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)], _window.OfficePaper));
}

private void OnSendButtonPressed()
{
SendMessage(new FaxSendMessage());
Expand Down
8 changes: 8 additions & 0 deletions Content.Client/Fax/UI/FaxWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@
<OptionButton Name="PeerSelector" HorizontalExpand="True" />
</BoxContainer>
<Control HorizontalExpand="True" MinHeight="20" />
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Button Name="FileButton"
Text="{Loc 'fax-machine-ui-file-button'}"
HorizontalExpand="False"/>
<Button Name="PaperButton"
Text="{Loc 'fax-machine-ui-paper-button-normal'}"
HorizontalExpand="False"/>
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Button Name="CopyButton"
Text="{Loc 'fax-machine-ui-copy-button'}"
Expand Down
19 changes: 19 additions & 0 deletions Content.Client/Fax/UI/FaxWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,30 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.UserInterface;

namespace Content.Client.Fax.UI;

[GenerateTypedNameReferences]
public sealed partial class FaxWindow : DefaultWindow
{
public event Action? FileButtonPressed;
public event Action? PaperButtonPressed;
public event Action? CopyButtonPressed;
public event Action? SendButtonPressed;
public event Action? RefreshButtonPressed;
public event Action<string>? PeerSelected;

public bool OfficePaper = false;

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

PaperButtonPressed += OnPaperButtonPressed;

FileButton.OnPressed += _ => FileButtonPressed?.Invoke();
PaperButton.OnPressed += _ => PaperButtonPressed?.Invoke();
CopyButton.OnPressed += _ => CopyButtonPressed?.Invoke();
SendButton.OnPressed += _ => SendButtonPressed?.Invoke();
RefreshButton.OnPressed += _ => RefreshButtonPressed?.Invoke();
Expand Down Expand Up @@ -80,4 +89,14 @@ private int AddPeerSelect(string name, string address)
PeerSelector.SetItemMetadata(PeerSelector.ItemCount - 1, address);
return PeerSelector.ItemCount - 1;
}

private void OnPaperButtonPressed()
{
OfficePaper = !OfficePaper;

if(OfficePaper)
PaperButton.Text = Loc.GetString("fax-machine-ui-paper-button-office");
else
PaperButton.Text = Loc.GetString("fax-machine-ui-paper-button-normal");
}
}
31 changes: 31 additions & 0 deletions Content.Server/Fax/FaxSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ public sealed class FaxSystem : EntitySystem
/// </summary>
[ValidatePrototypeId<EntityPrototype>]
private const string DefaultPaperPrototypeId = "Paper";

[ValidatePrototypeId<EntityPrototype>]
private const string OfficePaperPrototypeId = "PaperOffice";

public override void Initialize()
{
Expand All @@ -71,6 +74,7 @@ public override void Initialize()

// UI
SubscribeLocalEvent<FaxMachineComponent, AfterActivatableUIOpenEvent>(OnToggleInterface);
SubscribeLocalEvent<FaxMachineComponent, FaxFileMessage>(OnFileButtonPressed);
SubscribeLocalEvent<FaxMachineComponent, FaxCopyMessage>(OnCopyButtonPressed);
SubscribeLocalEvent<FaxMachineComponent, FaxSendMessage>(OnSendButtonPressed);
SubscribeLocalEvent<FaxMachineComponent, FaxRefreshMessage>(OnRefreshButtonPressed);
Expand Down Expand Up @@ -300,6 +304,12 @@ private void OnToggleInterface(EntityUid uid, FaxMachineComponent component, Aft
UpdateUserInterface(uid, component);
}

private void OnFileButtonPressed(EntityUid uid, FaxMachineComponent component, FaxFileMessage args)
{
args.Content = args.Content[..Math.Min(args.Content.Length, FaxFileMessageValidation.MaxContentSize)];
PrintFile(uid, component, args);
}

private void OnCopyButtonPressed(EntityUid uid, FaxMachineComponent component, FaxCopyMessage args)
{
Copy(uid, component);
Expand Down Expand Up @@ -386,6 +396,27 @@ public void Refresh(EntityUid uid, FaxMachineComponent? component = null)
_deviceNetworkSystem.QueuePacket(uid, null, payload);
}

/// <summary>
/// Makes fax print from a file from the computer. A timeout is set after copying,
/// which is shared by the send button.
/// </summary>
public void PrintFile(EntityUid uid, FaxMachineComponent component, FaxFileMessage args)
{
string prototype;
if (args.OfficePaper)
prototype = OfficePaperPrototypeId;
else
prototype = DefaultPaperPrototypeId;

var name = Loc.GetString("fax-machine-printed-paper-name");

var printout = new FaxPrintout(args.Content, name, prototype);
component.PrintingQueue.Enqueue(printout);
component.SendTimeoutRemaining += component.SendTimeout;

UpdateUserInterface(uid, component);
}

/// <summary>
/// Copies the paper in the fax. A timeout is set after copying,
/// which is shared by the send button.
Expand Down
18 changes: 18 additions & 0 deletions Content.Shared/Fax/SharedFax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,24 @@ public FaxUiState(string deviceName,
}
}

[Serializable, NetSerializable]
public sealed class FaxFileMessage : BoundUserInterfaceMessage
{
public string Content;
public bool OfficePaper;

public FaxFileMessage(string content, bool officePaper)
{
Content = content;
OfficePaper = officePaper;
}
}

public static class FaxFileMessageValidation
{
public const int MaxContentSize = 10000;
}

[Serializable, NetSerializable]
public sealed class FaxCopyMessage : BoundUserInterfaceMessage
{
Expand Down
5 changes: 5 additions & 0 deletions Resources/Locale/en-US/fax/fax.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ fax-machine-dialog-rename = Rename
fax-machine-dialog-field-name = Name

fax-machine-ui-window = Fax Machine
fax-machine-ui-file-button = Print File
fax-machine-ui-paper-button-normal = Normal Paper
fax-machine-ui-paper-button-office = Office Paper
fax-machine-ui-copy-button = Copy
fax-machine-ui-send-button = Send
fax-machine-ui-refresh-button = Refresh
Expand All @@ -19,3 +22,5 @@ fax-machine-ui-paper-inserted = Paper in tray
fax-machine-ui-paper-not-inserted = No paper

fax-machine-chat-notify = Received new fax message from "{$fax}" fax

fax-machine-printed-paper-name = printed paper
Loading