Change ChemMaster 4000 UI to use XAML UI (#5025)
This commit is contained in:
@@ -41,8 +41,8 @@ namespace Content.Client.Chemistry.UI
|
|||||||
_window.EjectButton.OnPressed += _ => PrepareData(UiAction.Eject, null, null, null);
|
_window.EjectButton.OnPressed += _ => PrepareData(UiAction.Eject, null, null, null);
|
||||||
_window.BufferTransferButton.OnPressed += _ => PrepareData(UiAction.Transfer, null, null, null);
|
_window.BufferTransferButton.OnPressed += _ => PrepareData(UiAction.Transfer, null, null, null);
|
||||||
_window.BufferDiscardButton.OnPressed += _ => PrepareData(UiAction.Discard, null, null, null);
|
_window.BufferDiscardButton.OnPressed += _ => PrepareData(UiAction.Discard, null, null, null);
|
||||||
_window.CreatePills.OnPressed += _ => PrepareData(UiAction.CreatePills, null, _window.PillAmount.Value, null);
|
_window.CreatePillButton.OnPressed += _ => PrepareData(UiAction.CreatePills, null, _window.PillAmount.Value, null);
|
||||||
_window.CreateBottles.OnPressed += _ => PrepareData(UiAction.CreateBottles, null, null, _window.BottleAmount.Value);
|
_window.CreateBottleButton.OnPressed += _ => PrepareData(UiAction.CreateBottles, null, null, _window.BottleAmount.Value);
|
||||||
|
|
||||||
_window.OnChemButtonPressed += (args, button) => PrepareData(UiAction.ChemButton, button, null, null);
|
_window.OnChemButtonPressed += (args, button) => PrepareData(UiAction.ChemButton, button, null, null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,433 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using Content.Client.Stylesheets;
|
|
||||||
using Content.Client.UserInterface;
|
|
||||||
using Content.Shared.Chemistry.Components;
|
|
||||||
using Content.Shared.Chemistry.Reagent;
|
|
||||||
using Robust.Client.Graphics;
|
|
||||||
using Robust.Client.UserInterface;
|
|
||||||
using Robust.Client.UserInterface.Controls;
|
|
||||||
using Robust.Client.UserInterface.CustomControls;
|
|
||||||
using Robust.Shared.GameObjects;
|
|
||||||
using Robust.Shared.IoC;
|
|
||||||
using Robust.Shared.Localization;
|
|
||||||
using Robust.Shared.Maths;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
using static Content.Shared.Chemistry.Components.SharedChemMasterComponent;
|
|
||||||
using static Robust.Client.UserInterface.Controls.BaseButton;
|
|
||||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
|
||||||
|
|
||||||
namespace Content.Client.Chemistry.UI
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Client-side UI used to control a <see cref="SharedChemMasterComponent"/>
|
|
||||||
/// </summary>
|
|
||||||
public class ChemMasterWindow : SS14Window
|
|
||||||
{
|
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
|
||||||
|
|
||||||
/// <summary>Contains info about the reagent container such as it's contents, if one is loaded into the dispenser.</summary>
|
|
||||||
private readonly BoxContainer ContainerInfo;
|
|
||||||
|
|
||||||
private readonly BoxContainer BufferInfo;
|
|
||||||
|
|
||||||
private readonly BoxContainer PackagingInfo;
|
|
||||||
|
|
||||||
/// <summary>Ejects the reagent container from the dispenser.</summary>
|
|
||||||
public Button EjectButton { get; }
|
|
||||||
|
|
||||||
public Button BufferTransferButton { get; }
|
|
||||||
public Button BufferDiscardButton { get; }
|
|
||||||
|
|
||||||
public bool BufferModeTransfer = true;
|
|
||||||
|
|
||||||
public event Action<ButtonEventArgs, ChemButton>? OnChemButtonPressed;
|
|
||||||
|
|
||||||
public BoxContainer PillInfo { get; set; }
|
|
||||||
public BoxContainer BottleInfo { get; set; }
|
|
||||||
public SpinBox PillAmount { get; set; }
|
|
||||||
public SpinBox BottleAmount { get; set; }
|
|
||||||
public Button CreatePills { get; }
|
|
||||||
public Button CreateBottles { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create and initialize the chem master UI client-side. Creates the basic layout,
|
|
||||||
/// actual data isn't filled in until the server sends data about the chem master.
|
|
||||||
/// </summary>
|
|
||||||
public ChemMasterWindow()
|
|
||||||
{
|
|
||||||
MinSize = SetSize = (400, 525);
|
|
||||||
IoCManager.InjectDependencies(this);
|
|
||||||
|
|
||||||
Contents.AddChild(new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
//Container
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("chem-master-window-container-label")},
|
|
||||||
new Control {HorizontalExpand = true},
|
|
||||||
(EjectButton = new Button {Text = Loc.GetString("chem-master-window-eject-button")})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
//Wrap the container info in a PanelContainer so we can color it's background differently.
|
|
||||||
new PanelContainer
|
|
||||||
{
|
|
||||||
VerticalExpand = true,
|
|
||||||
SizeFlagsStretchRatio = 6,
|
|
||||||
MinSize = (0, 200),
|
|
||||||
PanelOverride = new StyleBoxFlat
|
|
||||||
{
|
|
||||||
BackgroundColor = new Color(27, 27, 30)
|
|
||||||
},
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
//Currently empty, when server sends state data this will have container contents and fill volume.
|
|
||||||
(ContainerInfo = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("chem-master-window-no-container-loaded-text")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Padding
|
|
||||||
new Control {MinSize = (0.0f, 10.0f)},
|
|
||||||
|
|
||||||
//Buffer
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("chem-master-window-buffer-text")},
|
|
||||||
new Control {HorizontalExpand = true},
|
|
||||||
(BufferTransferButton = new Button {Text = Loc.GetString("chem-master-window-transfer-button"), Pressed = BufferModeTransfer, StyleClasses = { StyleBase.ButtonOpenRight }}),
|
|
||||||
(BufferDiscardButton = new Button {Text = Loc.GetString("chem-master-window-discard-button"), Pressed = !BufferModeTransfer, StyleClasses = { StyleBase.ButtonOpenLeft }})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Wrap the buffer info in a PanelContainer so we can color it's background differently.
|
|
||||||
new PanelContainer
|
|
||||||
{
|
|
||||||
VerticalExpand = true,
|
|
||||||
SizeFlagsStretchRatio = 6,
|
|
||||||
MinSize = (0, 100),
|
|
||||||
PanelOverride = new StyleBoxFlat
|
|
||||||
{
|
|
||||||
BackgroundColor = new Color(27, 27, 30)
|
|
||||||
},
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
//Buffer reagent list
|
|
||||||
(BufferInfo = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("chem-master-window-buffer-empty-text")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Padding
|
|
||||||
new Control {MinSize = (0.0f, 10.0f)},
|
|
||||||
|
|
||||||
//Packaging
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = $"{Loc.GetString("chem-master-window-packaging-text")} "},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Wrap the packaging info in a PanelContainer so we can color it's background differently.
|
|
||||||
new PanelContainer
|
|
||||||
{
|
|
||||||
VerticalExpand = true,
|
|
||||||
SizeFlagsStretchRatio = 6,
|
|
||||||
MinSize = (0, 100),
|
|
||||||
PanelOverride = new StyleBoxFlat
|
|
||||||
{
|
|
||||||
BackgroundColor = new Color(27, 27, 30)
|
|
||||||
},
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
//Packaging options
|
|
||||||
(PackagingInfo = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
HorizontalExpand = true,
|
|
||||||
}),
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//Pills
|
|
||||||
PillInfo = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = $"{Loc.GetString("chem-master-window-pills-label")} "
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
};
|
|
||||||
PackagingInfo.AddChild(PillInfo);
|
|
||||||
|
|
||||||
var pillPadding = new Control {HorizontalExpand = true};
|
|
||||||
PillInfo.AddChild(pillPadding);
|
|
||||||
|
|
||||||
PillAmount = new SpinBox
|
|
||||||
{
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Value = 1
|
|
||||||
};
|
|
||||||
PillAmount.InitDefaultButtons();
|
|
||||||
PillAmount.IsValid = (n) => (n > 0 && n <= 10);
|
|
||||||
PillInfo.AddChild(PillAmount);
|
|
||||||
|
|
||||||
var pillVolume = new Label
|
|
||||||
{
|
|
||||||
Text = $" {Loc.GetString("chem-master-window-max-pills-volume-text")} ",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
};
|
|
||||||
PillInfo.AddChild((pillVolume));
|
|
||||||
|
|
||||||
CreatePills = new Button {Text = Loc.GetString("chem-master-window-create-pill-button") };
|
|
||||||
PillInfo.AddChild(CreatePills);
|
|
||||||
|
|
||||||
//Bottles
|
|
||||||
BottleInfo = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("cham-master-window-bottles-label")
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
};
|
|
||||||
PackagingInfo.AddChild(BottleInfo);
|
|
||||||
|
|
||||||
var bottlePadding = new Control {HorizontalExpand = true};
|
|
||||||
BottleInfo.AddChild(bottlePadding);
|
|
||||||
|
|
||||||
BottleAmount = new SpinBox
|
|
||||||
{
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Value = 1
|
|
||||||
};
|
|
||||||
BottleAmount.InitDefaultButtons();
|
|
||||||
BottleAmount.IsValid = (n) => (n > 0 && n <= 10);
|
|
||||||
BottleInfo.AddChild(BottleAmount);
|
|
||||||
|
|
||||||
var bottleVolume = new Label
|
|
||||||
{
|
|
||||||
Text = $" {Loc.GetString("chem-master-window-max-bottle-volume-text")} ",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
};
|
|
||||||
BottleInfo.AddChild((bottleVolume));
|
|
||||||
|
|
||||||
CreateBottles = new Button {Text = Loc.GetString("chem-master-window-create-bottle-button") };
|
|
||||||
BottleInfo.AddChild(CreateBottles);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ChemButton MakeChemButton(string text, ReagentUnit amount, string id, bool isBuffer, string styleClass)
|
|
||||||
{
|
|
||||||
var button = new ChemButton(text, amount, id, isBuffer, styleClass);
|
|
||||||
button.OnPressed += args
|
|
||||||
=> OnChemButtonPressed?.Invoke(args, button);
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Update the UI state when new state data is received from the server.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="state">State data sent by the server.</param>
|
|
||||||
public void UpdateState(BoundUserInterfaceState state)
|
|
||||||
{
|
|
||||||
var castState = (ChemMasterBoundUserInterfaceState) state;
|
|
||||||
Title = castState.DispenserName;
|
|
||||||
UpdatePanelInfo(castState);
|
|
||||||
if (Contents.Children != null)
|
|
||||||
{
|
|
||||||
ButtonHelpers.SetButtonDisabledRecursive(Contents, !castState.HasPower);
|
|
||||||
EjectButton.Disabled = !castState.HasBeaker;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Update the container, buffer, and packaging panels.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="state">State data for the dispenser.</param>
|
|
||||||
private void UpdatePanelInfo(ChemMasterBoundUserInterfaceState state)
|
|
||||||
{
|
|
||||||
BufferModeTransfer = state.BufferModeTransfer;
|
|
||||||
BufferTransferButton.Pressed = BufferModeTransfer;
|
|
||||||
BufferDiscardButton.Pressed = !BufferModeTransfer;
|
|
||||||
|
|
||||||
ContainerInfo.Children.Clear();
|
|
||||||
|
|
||||||
if (!state.HasBeaker)
|
|
||||||
{
|
|
||||||
ContainerInfo.Children.Add(new Label {Text = Loc.GetString("chem-master-window-no-container-loaded-text") });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContainerInfo.Children.Add(new BoxContainer // Name of the container and its fill status (Ex: 44/100u)
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = $"{state.ContainerName}: "},
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = $"{state.BeakerCurrentVolume}/{state.BeakerMaxVolume}",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
foreach (var reagent in state.ContainerReagents)
|
|
||||||
{
|
|
||||||
var name = Loc.GetString("chem-master-window-unknown-reagent-text");
|
|
||||||
//Try to the prototype for the given reagent. This gives us it's name.
|
|
||||||
if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? proto))
|
|
||||||
{
|
|
||||||
name = proto.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (proto != null)
|
|
||||||
{
|
|
||||||
ContainerInfo.Children.Add(new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = $"{name}: "},
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = $"{reagent.Quantity}u",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Padding
|
|
||||||
new Control {HorizontalExpand = true},
|
|
||||||
|
|
||||||
MakeChemButton("1", ReagentUnit.New(1), reagent.ReagentId, false, StyleBase.ButtonOpenRight),
|
|
||||||
MakeChemButton("5", ReagentUnit.New(5), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton("10", ReagentUnit.New(10), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton("25", ReagentUnit.New(25), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton(Loc.GetString("chem-master-window-buffer-all-amount"), ReagentUnit.New(-1), reagent.ReagentId, false, StyleBase.ButtonOpenLeft),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BufferInfo.Children.Clear();
|
|
||||||
|
|
||||||
if (!state.BufferReagents.Any())
|
|
||||||
{
|
|
||||||
BufferInfo.Children.Add(new Label {Text = Loc.GetString("chem-master-window-buffer-empty-text") });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bufferHBox = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal
|
|
||||||
};
|
|
||||||
BufferInfo.AddChild(bufferHBox);
|
|
||||||
|
|
||||||
var bufferLabel = new Label { Text = $"{Loc.GetString("chem-master-window-buffer-label")} " };
|
|
||||||
bufferHBox.AddChild(bufferLabel);
|
|
||||||
var bufferVol = new Label
|
|
||||||
{
|
|
||||||
Text = $"{state.BufferCurrentVolume}",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
};
|
|
||||||
bufferHBox.AddChild(bufferVol);
|
|
||||||
|
|
||||||
foreach (var reagent in state.BufferReagents)
|
|
||||||
{
|
|
||||||
var name = Loc.GetString("chem-master-window-unknown-reagent-text");
|
|
||||||
//Try to the prototype for the given reagent. This gives us it's name.
|
|
||||||
if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? proto))
|
|
||||||
{
|
|
||||||
name = proto.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (proto != null)
|
|
||||||
{
|
|
||||||
BufferInfo.Children.Add(new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
//SizeFlagsHorizontal = SizeFlags.ShrinkEnd,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = $"{name}: "},
|
|
||||||
new Label
|
|
||||||
{
|
|
||||||
Text = $"{reagent.Quantity}u",
|
|
||||||
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Padding
|
|
||||||
new Control {HorizontalExpand = true},
|
|
||||||
|
|
||||||
MakeChemButton("1", ReagentUnit.New(1), reagent.ReagentId, true, StyleBase.ButtonOpenRight),
|
|
||||||
MakeChemButton("5", ReagentUnit.New(5), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton("10", ReagentUnit.New(10), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton("25", ReagentUnit.New(25), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
|
||||||
MakeChemButton(Loc.GetString("chem-master-window-buffer-all-amount"), ReagentUnit.New(-1), reagent.ReagentId, true, StyleBase.ButtonOpenLeft),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ChemButton : Button
|
|
||||||
{
|
|
||||||
public ReagentUnit Amount { get; set; }
|
|
||||||
public bool isBuffer = true;
|
|
||||||
public string Id { get; set; }
|
|
||||||
public ChemButton(string _text, ReagentUnit _amount, string _id, bool _isBuffer, string _styleClass)
|
|
||||||
{
|
|
||||||
AddStyleClass(_styleClass);
|
|
||||||
Text = _text;
|
|
||||||
Amount = _amount;
|
|
||||||
Id = _id;
|
|
||||||
isBuffer = _isBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
111
Content.Client/Chemistry/UI/ChemMasterWindow.xaml
Normal file
111
Content.Client/Chemistry/UI/ChemMasterWindow.xaml
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<SS14Window xmlns="https://spacestation14.io"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
||||||
|
MinSize="400 525"
|
||||||
|
Title="{Loc 'chem-master-bound-user-interface-title'}">
|
||||||
|
<BoxContainer Name="Contents"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Vertical"
|
||||||
|
Margin="5 5 5 5"
|
||||||
|
SeparationOverride="10">
|
||||||
|
<!-- Container -->
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'chem-master-window-container-label'}"></Label>
|
||||||
|
<Control HorizontalExpand="True"></Control>
|
||||||
|
<Button Name="EjectButton"
|
||||||
|
Access="Internal"
|
||||||
|
Text="{Loc 'chem-master-window-eject-button'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
<PanelContainer VerticalExpand="True" SizeFlagsStretchRatio="6" MinSize="0 200">
|
||||||
|
<PanelContainer.PanelOverride>
|
||||||
|
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||||
|
</PanelContainer.PanelOverride>
|
||||||
|
<!-- Initially empty, when server sends state data this will have container contents and fill volume.-->
|
||||||
|
<BoxContainer Name="ContainerInfo"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Vertical"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<Label Text="{Loc 'chem-master-window-no-container-loaded-text'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
</PanelContainer>
|
||||||
|
<!-- Padding -->
|
||||||
|
<Control MinSize="0 10" />
|
||||||
|
<!-- Buffer -->
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'chem-master-window-buffer-text'}"></Label>
|
||||||
|
<Control HorizontalExpand="True" />
|
||||||
|
<Button Name="BufferTransferButton"
|
||||||
|
Access="Internal"
|
||||||
|
Text="{Loc 'chem-master-window-transfer-button'}" ToggleMode="True"
|
||||||
|
StyleClasses="OpenRight" />
|
||||||
|
<Button Name="BufferDiscardButton"
|
||||||
|
Access="Internal"
|
||||||
|
Text="{Loc 'chem-master-window-discard-button'}" ToggleMode="True"
|
||||||
|
StyleClasses="OpenLeft" />
|
||||||
|
</BoxContainer>
|
||||||
|
<!-- Buffer info -->
|
||||||
|
<PanelContainer VerticalExpand="True" SizeFlagsStretchRatio="6" MinSize="0 100">
|
||||||
|
<PanelContainer.PanelOverride>
|
||||||
|
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||||
|
</PanelContainer.PanelOverride>
|
||||||
|
<!-- Buffer reagent list -->
|
||||||
|
<BoxContainer Name="BufferInfo"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Vertical"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<Label Text="{Loc 'chem-master-window-buffer-empty-text'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
</PanelContainer>
|
||||||
|
<!-- Padding -->
|
||||||
|
<Control MinSize="0 10" />
|
||||||
|
<PanelContainer VerticalExpand="True" MinSize="100 100">
|
||||||
|
<!-- Packaging -->
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'chem-master-window-packaging-text'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
<!-- Wrap the packaging info-->
|
||||||
|
<PanelContainer VerticalExpand="True" SizeFlagsStretchRatio="6" MinSize="0 100">
|
||||||
|
<PanelContainer.PanelOverride>
|
||||||
|
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||||
|
</PanelContainer.PanelOverride>
|
||||||
|
<!-- Packaging options -->
|
||||||
|
<BoxContainer Orientation="Vertical"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<!-- Packaging Info -->
|
||||||
|
<BoxContainer Name="PackagingInfo"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Vertical"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<BoxContainer Name="PillInfo"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'chem-master-window-pills-label'}"></Label>
|
||||||
|
<Control HorizontalExpand="True"
|
||||||
|
MinSize="50 0">
|
||||||
|
</Control>
|
||||||
|
<SpinBox Name="PillAmount" Access="Internal" Value="1" />
|
||||||
|
<Button Name="CreatePillButton"
|
||||||
|
Access="Internal"
|
||||||
|
Text="{Loc 'chem-master-window-create-pill-button'}" />
|
||||||
|
<Label Text="{Loc 'chem-master-window-max-pills-volume-text'}"
|
||||||
|
StyleClasses="LabelSecondaryColor" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Name="BottleInfo"
|
||||||
|
Access="Internal"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'chem-master-window-bottles-label'}" />
|
||||||
|
<Control HorizontalExpand="True"
|
||||||
|
MinSize="50 0" />
|
||||||
|
<SpinBox Name="BottleAmount" Access="Internal" Value="1" />
|
||||||
|
<Button Name="CreateBottleButton"
|
||||||
|
Access="Internal"
|
||||||
|
Text="{Loc 'chem-master-window-create-bottle-button'}" />
|
||||||
|
<Label Text="{Loc 'chem-master-window-max-bottles-volume-text'}"
|
||||||
|
StyleClasses="LabelSecondaryColor" />
|
||||||
|
</BoxContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</PanelContainer>
|
||||||
|
</PanelContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</SS14Window>
|
||||||
219
Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
Normal file
219
Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using Content.Client.Stylesheets;
|
||||||
|
using Content.Client.UserInterface;
|
||||||
|
using Content.Shared.Chemistry.Components;
|
||||||
|
using Content.Shared.Chemistry.Reagent;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.CustomControls;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using static Content.Shared.Chemistry.Components.SharedChemMasterComponent;
|
||||||
|
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
||||||
|
|
||||||
|
namespace Content.Client.Chemistry.UI
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Client-side UI used to control a <see cref="SharedChemMasterComponent"/>
|
||||||
|
/// </summary>
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public partial class ChemMasterWindow : SS14Window
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
public event Action<BaseButton.ButtonEventArgs, ChemButton>? OnChemButtonPressed;
|
||||||
|
|
||||||
|
private static bool IsSpinValid(int n)
|
||||||
|
{
|
||||||
|
return n is > 0 and <= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create and initialize the chem master UI client-side. Creates the basic layout,
|
||||||
|
/// actual data isn't filled in until the server sends data about the chem master.
|
||||||
|
/// </summary>
|
||||||
|
public ChemMasterWindow()
|
||||||
|
{
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
PillAmount.IsValid = IsSpinValid;
|
||||||
|
BottleAmount.IsValid = IsSpinValid;
|
||||||
|
PillAmount.InitDefaultButtons();
|
||||||
|
BottleAmount.InitDefaultButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChemButton MakeChemButton(string text, ReagentUnit amount, string id, bool isBuffer, string styleClass)
|
||||||
|
{
|
||||||
|
var button = new ChemButton(text, amount, id, isBuffer, styleClass);
|
||||||
|
button.OnPressed += args
|
||||||
|
=> OnChemButtonPressed?.Invoke(args, button);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update the UI state when new state data is received from the server.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="state">State data sent by the server.</param>
|
||||||
|
public void UpdateState(BoundUserInterfaceState state)
|
||||||
|
{
|
||||||
|
var castState = (ChemMasterBoundUserInterfaceState) state;
|
||||||
|
Title = castState.DispenserName;
|
||||||
|
UpdatePanelInfo(castState);
|
||||||
|
if (Contents.Children != null)
|
||||||
|
{
|
||||||
|
ButtonHelpers.SetButtonDisabledRecursive(Contents, !castState.HasPower);
|
||||||
|
EjectButton.Disabled = !castState.HasBeaker;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update the container, buffer, and packaging panels.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="state">State data for the dispenser.</param>
|
||||||
|
private void UpdatePanelInfo(ChemMasterBoundUserInterfaceState state)
|
||||||
|
{
|
||||||
|
var bufferModeTransfer = state.BufferModeTransfer;
|
||||||
|
BufferTransferButton.Pressed = bufferModeTransfer;
|
||||||
|
BufferDiscardButton.Pressed = !bufferModeTransfer;
|
||||||
|
|
||||||
|
ContainerInfo.Children.Clear();
|
||||||
|
|
||||||
|
if (!state.HasBeaker)
|
||||||
|
{
|
||||||
|
ContainerInfo.Children.Add(new Label {Text = Loc.GetString("chem-master-window-no-container-loaded-text") });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContainerInfo.Children.Add(new BoxContainer // Name of the container and its fill status (Ex: 44/100u)
|
||||||
|
{
|
||||||
|
Orientation = LayoutOrientation.Horizontal,
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new Label {Text = $"{state.ContainerName}: "},
|
||||||
|
new Label
|
||||||
|
{
|
||||||
|
Text = $"{state.BeakerCurrentVolume}/{state.BeakerMaxVolume}",
|
||||||
|
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach (var reagent in state.ContainerReagents)
|
||||||
|
{
|
||||||
|
var name = Loc.GetString("chem-master-window-unknown-reagent-text");
|
||||||
|
//Try to the prototype for the given reagent. This gives us it's name.
|
||||||
|
if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? proto))
|
||||||
|
{
|
||||||
|
name = proto.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proto != null)
|
||||||
|
{
|
||||||
|
ContainerInfo.Children.Add(new BoxContainer
|
||||||
|
{
|
||||||
|
Orientation = LayoutOrientation.Horizontal,
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new Label {Text = $"{name}: "},
|
||||||
|
new Label
|
||||||
|
{
|
||||||
|
Text = $"{reagent.Quantity}u",
|
||||||
|
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
||||||
|
},
|
||||||
|
|
||||||
|
//Padding
|
||||||
|
new Control {HorizontalExpand = true},
|
||||||
|
|
||||||
|
MakeChemButton("1", ReagentUnit.New(1), reagent.ReagentId, false, StyleBase.ButtonOpenRight),
|
||||||
|
MakeChemButton("5", ReagentUnit.New(5), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton("10", ReagentUnit.New(10), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton("25", ReagentUnit.New(25), reagent.ReagentId, false, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton(Loc.GetString("chem-master-window-buffer-all-amount"), ReagentUnit.New(-1), reagent.ReagentId, false, StyleBase.ButtonOpenLeft),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferInfo.Children.Clear();
|
||||||
|
|
||||||
|
if (!state.BufferReagents.Any())
|
||||||
|
{
|
||||||
|
BufferInfo.Children.Add(new Label {Text = Loc.GetString("chem-master-window-buffer-empty-text") });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bufferHBox = new BoxContainer
|
||||||
|
{
|
||||||
|
Orientation = LayoutOrientation.Horizontal
|
||||||
|
};
|
||||||
|
BufferInfo.AddChild(bufferHBox);
|
||||||
|
|
||||||
|
var bufferLabel = new Label { Text = $"{Loc.GetString("chem-master-window-buffer-label")} " };
|
||||||
|
bufferHBox.AddChild(bufferLabel);
|
||||||
|
var bufferVol = new Label
|
||||||
|
{
|
||||||
|
Text = $"{state.BufferCurrentVolume}",
|
||||||
|
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
||||||
|
};
|
||||||
|
bufferHBox.AddChild(bufferVol);
|
||||||
|
|
||||||
|
foreach (var reagent in state.BufferReagents)
|
||||||
|
{
|
||||||
|
var name = Loc.GetString("chem-master-window-unknown-reagent-text");
|
||||||
|
//Try to the prototype for the given reagent. This gives us it's name.
|
||||||
|
if (_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? proto))
|
||||||
|
{
|
||||||
|
name = proto.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proto != null)
|
||||||
|
{
|
||||||
|
BufferInfo.Children.Add(new BoxContainer
|
||||||
|
{
|
||||||
|
Orientation = LayoutOrientation.Horizontal,
|
||||||
|
//SizeFlagsHorizontal = SizeFlags.ShrinkEnd,
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new Label {Text = $"{name}: "},
|
||||||
|
new Label
|
||||||
|
{
|
||||||
|
Text = $"{reagent.Quantity}u",
|
||||||
|
StyleClasses = {StyleNano.StyleClassLabelSecondaryColor}
|
||||||
|
},
|
||||||
|
|
||||||
|
//Padding
|
||||||
|
new Control {HorizontalExpand = true},
|
||||||
|
|
||||||
|
MakeChemButton("1", ReagentUnit.New(1), reagent.ReagentId, true, StyleBase.ButtonOpenRight),
|
||||||
|
MakeChemButton("5", ReagentUnit.New(5), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton("10", ReagentUnit.New(10), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton("25", ReagentUnit.New(25), reagent.ReagentId, true, StyleBase.ButtonOpenBoth),
|
||||||
|
MakeChemButton(Loc.GetString("chem-master-window-buffer-all-amount"), ReagentUnit.New(-1), reagent.ReagentId, true, StyleBase.ButtonOpenLeft),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ChemButton : Button
|
||||||
|
{
|
||||||
|
public ReagentUnit Amount { get; set; }
|
||||||
|
public bool isBuffer = true;
|
||||||
|
public string Id { get; set; }
|
||||||
|
public ChemButton(string _text, ReagentUnit _amount, string _id, bool _isBuffer, string _styleClass)
|
||||||
|
{
|
||||||
|
AddStyleClass(_styleClass);
|
||||||
|
Text = _text;
|
||||||
|
Amount = _amount;
|
||||||
|
Id = _id;
|
||||||
|
isBuffer = _isBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,10 +33,7 @@ namespace Content.Client.Chemistry.UI
|
|||||||
base.Open();
|
base.Open();
|
||||||
|
|
||||||
//Setup window layout/elements
|
//Setup window layout/elements
|
||||||
_window = new ReagentDispenserWindow
|
_window = new();
|
||||||
{
|
|
||||||
Title = Loc.GetString("reagent-dispenser-bound-user-interface-title"),
|
|
||||||
};
|
|
||||||
|
|
||||||
_window.OpenCentered();
|
_window.OpenCentered();
|
||||||
_window.OnClose += Close;
|
_window.OnClose += Close;
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ chem-master-window-discard-button = Discard
|
|||||||
chem-master-window-packaging-text = Packaging
|
chem-master-window-packaging-text = Packaging
|
||||||
chem-master-window-pills-label = Pills:
|
chem-master-window-pills-label = Pills:
|
||||||
chem-master-window-max-pills-volume-text = max 50u/each
|
chem-master-window-max-pills-volume-text = max 50u/each
|
||||||
chem-master-window-max-bottle-volume-text = max 30u/each
|
chem-master-window-max-bottles-volume-text = max 30u/each
|
||||||
chem-master-window-create-pill-button = Create
|
chem-master-window-create-pill-button = Create
|
||||||
chem-master-window-create-bottle-button = Create
|
chem-master-window-create-bottle-button = Create
|
||||||
cham-master-window-bottles-label = Bottles:
|
chem-master-window-bottles-label = Bottles:
|
||||||
chem-master-window-unknown-reagent-text = Unknown reagent
|
chem-master-window-unknown-reagent-text = Unknown reagent
|
||||||
|
|||||||
Reference in New Issue
Block a user