Files
wwdpublic/Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs
RedFoxIV ed9c0fcd12 [педальные раздатчики] настолько заебался что даже шутить уже не хочется (#159)
* Shitspawner Extraordinare

* Shitcoder Extraordinare

* the code is leaking

* ёбушки-воробушки

* it will all be over soon

* шутки кончились

* virtual selfantag

* шейдеры это на удивление весело

* i'm tired boss

* connection terminated

* консервная банка

* а чё сразу нельзя было?

* minus

* Removed Herobrine.

* мусор

* Apply suggestions from code review

Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com>

* code review

* fix: unshit

* shit: unfix

* потемнее

* переперевод

* ok i clean up

* жопа

Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com>

* scuffed english localization

---------

Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com>
2025-01-02 00:20:07 +07:00

282 lines
12 KiB
C#

using Content.Client.UserInterface.Controls;
using Content.Shared._White.Event;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Content.Client._White.Event;
#pragma warning disable IDE1006 // i am going to fucking lose it
/// <summary>
/// Hopefully i never have to touch UI ever again.
/// Even if xaml thing was working for me, this would only be marginally less of a radioactive dump.
/// </summary>
public sealed class EventItemDispenserConfigBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly ILocalizationManager _loc = default!;
static readonly Color Green = new Color(0, 255, 0);
static readonly Color Red = new Color(255, 0, 0);
static readonly Color Transparent = new Color(255, 255, 255, 69/*haha*/);
//EventItemDispenserConfigWindow? window; // Trying to work with robustengine's ui system makes me want to quote AM.
DefaultWindow window = default!;
EventItemDispenserComponent dispenserComp;
public EventItemDispenserConfigBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) {
IoCManager.InjectDependencies(this);
dispenserComp = _entMan.GetComponent<EventItemDispenserComponent>(Owner);
}
#region man-made horrors beyond your comprehension
#region all the controls
BoxContainer baseBox = default!;
BoxContainer optionBox = default!;
BoxContainer buttonBox = default!;
BoxContainer copypasteBox = default!;
LineEdit DispensingPrototypeLineEdit = default!;
bool DispensingPrototypeValid = false;
CheckBox AutoDisposeCheckBox = default!;
Label AutoDisposeLabel = default!;
CheckBox CanManuallyDisposeCheckBox = default!;
CheckBox InfiniteCheckBox = default!;
LineEdit LimitLineEdit = default!;
CheckBox ReplaceDisposedItemsCheckBox = default!;
LineEdit DisposedReplacementPrototypeLineEdit = default!;
bool DisposedReplacementPrototypeValid = false;
CheckBox AutoCleanUpCheckBox = default!;
Button copyButton = default!;
Button pasteButton = default!;
Button confirmButton = default!;
//Button cancelButton = new(); // just hit the "x" 4head
#endregion
#region copypasta stuff
static string SavedDispensingPrototype = default!;
static bool SavedAutoDispose = default;
static bool SavedCanManuallyDispose = default;
static bool SavedInfinite = default;
static string SavedLimit = default!;
static bool SavedReplaceDisposedItems = default;
static string SavedDisposedReplacementPrototype = default!;
static bool SavedAutoCleanUp = default;
static bool saved = false;
private void CopySettings(EventArgs whatever)
{
saved = true;
SavedDispensingPrototype = DispensingPrototypeLineEdit.Text;
SavedAutoDispose = AutoDisposeCheckBox.Pressed;
SavedCanManuallyDispose = CanManuallyDisposeCheckBox.Pressed;
SavedInfinite = InfiniteCheckBox.Pressed;
SavedLimit = LimitLineEdit.Text;
SavedReplaceDisposedItems = ReplaceDisposedItemsCheckBox.Pressed;
SavedDisposedReplacementPrototype = DisposedReplacementPrototypeLineEdit.Text;
SavedAutoCleanUp = AutoCleanUpCheckBox.Pressed;
pasteButton.Disabled = false;
}
private void PasteSettings(EventArgs whatever)
{
DebugTools.Assert(saved);
DispensingPrototypeLineEdit.Text = SavedDispensingPrototype;
AutoDisposeCheckBox.Pressed = SavedAutoDispose;
CanManuallyDisposeCheckBox.Pressed = SavedCanManuallyDispose;
InfiniteCheckBox.Pressed = SavedInfinite;
LimitLineEdit.Text = SavedLimit;
ReplaceDisposedItemsCheckBox.Pressed = SavedReplaceDisposedItems;
DisposedReplacementPrototypeLineEdit.Text = SavedDisposedReplacementPrototype;
AutoCleanUpCheckBox.Pressed = SavedAutoCleanUp;
}
#endregion
private void InitializeControls(DefaultWindow window) // windows forms ahh method
{
baseBox = this.CreateDisposableControl<BoxContainer>();
baseBox.Orientation = BoxContainer.LayoutOrientation.Vertical;
baseBox.SeparationOverride = 4;
baseBox.Margin = new Thickness(4, 0);
baseBox.MinWidth = 450;
window.Contents.AddChild(baseBox);
optionBox = this.CreateDisposableControl<BoxContainer>();
optionBox.Orientation = BoxContainer.LayoutOrientation.Vertical;
baseBox.AddChild(optionBox);
buttonBox = this.CreateDisposableControl<BoxContainer>();
buttonBox.Orientation = BoxContainer.LayoutOrientation.Horizontal;
//buttonBox.Align = BoxContainer.AlignMode.End;
baseBox.AddChild(buttonBox);
copypasteBox = this.CreateDisposableControl<BoxContainer>();
//copypasteBox.HorizontalAlignment = Control.HAlignment.Left;
copypasteBox.HorizontalExpand = true;
copyButton = this.CreateDisposableControl<Button>();
copyButton.Label.Text = "Copy";
copyButton.OnPressed += CopySettings;
copypasteBox.AddChild(copyButton);
pasteButton = this.CreateDisposableControl<Button>();
pasteButton.Label.Text = "Paste";
pasteButton.OnPressed += PasteSettings;
pasteButton.Disabled = !saved;
copypasteBox.AddChild(pasteButton);
confirmButton = this.CreateDisposableControl<Button>();
confirmButton.Label.Text = "OK";
confirmButton.OnPressed += TrySubmit;
confirmButton.HorizontalAlignment = Control.HAlignment.Right;
buttonBox.AddChild(copypasteBox);
buttonBox.AddChild(confirmButton);
}
private void ColorAutoDispose(EventArgs whatever = default!) // please put me out of my misery
{
AutoDisposeCheckBox.Disabled = !InfiniteCheckBox.Pressed;
//AutoDisposeCheckBox.ModulateSelfOverride = AutoDisposeCheckBox.Disabled ? Transparent : null; // doesn't work :(
AutoDisposeLabel.ModulateSelfOverride = AutoDisposeCheckBox.Disabled ? Transparent : null;
}
/// <summary>
/// I am not sorry.
/// </summary>
protected override void Open() // pure aids
{
base.Open(); // what's the fucking point?
window = this.CreateDisposableControl<DefaultWindow>();
window.Resizable = false;
window.OnClose += Close;
InitializeControls(window);
window.Title = _loc.GetString("eventitemdispenser-configwindow-title");
DispensingPrototypeLineEdit = AddOption<LineEdit>("eventitemdispenser-configwindow-dispensingprototype");
DispensingPrototypeLineEdit.MinWidth = 300;
DispensingPrototypeLineEdit.OnTextChanged += (args) => { DispensingPrototypeValid = ValidateProto(args); confirmButton!.Disabled = !DispensingPrototypeValid || !DisposedReplacementPrototypeValid; };
DispensingPrototypeLineEdit.OnTextEntered += TrySubmit;
(AutoDisposeCheckBox, AutoDisposeLabel) = _AddOption<CheckBox>("eventitemdispenser-configwindow-autodispose");
CanManuallyDisposeCheckBox = AddOption<CheckBox>("eventitemdispenser-configwindow-canmanuallydispose");
InfiniteCheckBox = AddOption<CheckBox>("eventitemdispenser-configwindow-infinite");
InfiniteCheckBox.OnPressed += ColorAutoDispose;
LimitLineEdit = AddOption<LineEdit>("eventitemdispenser-configwindow-limit");
LimitLineEdit.IsValid = s => int.TryParse(s, out int _) && s.IndexOf('-') == -1; // no "_ > 0" because being able to input -0 makes me cringe
LimitLineEdit.MinWidth = 100;
LimitLineEdit.OnTextEntered += TrySubmit;
ReplaceDisposedItemsCheckBox = AddOption<CheckBox>("eventitemdispenser-configwindow-replacedisposeditems");
DisposedReplacementPrototypeLineEdit = AddOption<LineEdit>("eventitemdispenser-configwindow-disposedreplacement");
DisposedReplacementPrototypeLineEdit.MinWidth = 300;
DisposedReplacementPrototypeLineEdit.OnTextChanged += (args) => { DisposedReplacementPrototypeValid = ValidateProto(args); confirmButton!.Disabled = !DispensingPrototypeValid || !DisposedReplacementPrototypeValid; };
DisposedReplacementPrototypeLineEdit.OnTextEntered += TrySubmit;
AutoCleanUpCheckBox = AddOption<CheckBox>("eventitemdispenser-configwindow-autocleanup");
DispensingPrototypeLineEdit.SetText(dispenserComp.DispensingPrototype, true);
AutoDisposeCheckBox.Pressed = dispenserComp.AutoDispose;
CanManuallyDisposeCheckBox.Pressed = dispenserComp.CanManuallyDispose;
InfiniteCheckBox.Pressed = dispenserComp.Infinite;
ColorAutoDispose();
LimitLineEdit.SetText(dispenserComp.Limit.ToString());
ReplaceDisposedItemsCheckBox.Pressed = dispenserComp.ReplaceDisposedItems;
DisposedReplacementPrototypeLineEdit.SetText(dispenserComp.DisposedReplacement, true);
AutoCleanUpCheckBox.Pressed = dispenserComp.AutoCleanUp;
AutoDisposeCheckBox.Disabled = !dispenserComp.Infinite;
window.OpenCentered();
}
private T AddOption<T>(string text) where T : Control, IDisposable, new()
{
return _AddOption<T>(text).Item1;
}
private (T, Label) _AddOption<T>(string text) where T : Control, IDisposable, new()
{
var box = this.CreateDisposableControl<BoxContainer>();
box.HorizontalAlignment = Control.HAlignment.Stretch;
var label = this.CreateDisposableControl<Label>();
label.Text = _loc.GetString(text);
label.HorizontalExpand = true;
label.HorizontalAlignment = Label.HAlignment.Left;
box.AddChild(label);
var control = this.CreateDisposableControl<T>();
control.HorizontalAlignment = Control.HAlignment.Right;
control.ToolTip = _loc.GetString($"{text}-tooltip");
box.AddChild(control);
optionBox!.AddChild(box); // called after control init // i can't even remember what i meant by this, that's how bad it has got.
return (control, label);
}
private bool ValidateProto(LineEdit.LineEditEventArgs args)
{
bool val = _proto.HasIndex(args.Text);
args.Control.ModulateSelfOverride = val ? Green : Red;
return val;
}
private void TrySubmit(EventArgs whatever)
{
if (!confirmButton.Disabled)
{
var msg = new EventItemDispenserNewConfigBoundUserInterfaceMessage()
{
DispensingPrototype = DispensingPrototypeLineEdit.Text,
AutoDispose = AutoDisposeCheckBox.Pressed,
CanManuallyDispose = CanManuallyDisposeCheckBox.Pressed,
Infinite = InfiniteCheckBox.Pressed,
Limit = int.Parse(LimitLineEdit.Text),
ReplaceDisposedItems = ReplaceDisposedItemsCheckBox.Pressed,
DisposedReplacement = DisposedReplacementPrototypeLineEdit.Text,
AutoCleanUp = AutoCleanUpCheckBox.Pressed
};
SendMessage(msg);
Close();
}
}
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
{
base.ReceiveMessage(message);
if(message is EventItemDispenserNewProtoBoundUserInterfaceMessage { } msg)
{
DispensingPrototypeLineEdit.SetText(msg.DispensingPrototype);
}
}
#endregion
}
#pragma warning restore IDE1006