mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-10-09 10:21:18 +03:00
* Half the way to making the text screen less jank * quarter-assed timer * partial update * fleshing out timing & scrolling in update * common IGameTiming * Back to AppearanceData * partial appearance data system * funny timer states * mostly working timer scroll (damned edge pixels) * screen: scroll offset + hide * SignalTimer: remove time set on text update * extend for timer * TextScreenVisuals: cleanup * restore old names * Return old names, write more comments * fix textscreensystem ref, consistent timer frame * comments, "TextScreenVisualsComponent" * TextScreenTimerVisualsComponent, diff reduction * region * system order * no "client-side" comments * small bugfixes & cleanup with devicenet refactor * consolidate string formatting * Restore ETA/ETD text * No need for DefaultText for regular screen text * Address Pok's suggestions Co-authored-by: Pok27 <113675512+Pok27@users.noreply.github.com> * formatting * pok suggesto round 2, blyatin-1 also clean up the string vs. display value mess * TextScreenSystem.GetString -> TimerDisplay.ToStr * D2 begone! * constants to component values * comment update + SignalTimerWindow whitespace * a touch of numerical safety fixes a few errors from pasting huge text * fields aren't properties :^) * DataDef time * Update TextScreenSystem.cs * Update TextScreenTimerVisualsComponent.cs * return the pause, bunch of comments, missed a comp --------- Co-authored-by: Pok27 <113675512+Pok27@users.noreply.github.com>
198 lines
5.5 KiB
C#
198 lines
5.5 KiB
C#
using Content.Client.TextScreen;
|
|
using Robust.Client.AutoGenerated;
|
|
using Robust.Client.UserInterface.CustomControls;
|
|
using Robust.Client.UserInterface.XAML;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Client.MachineLinking.UI;
|
|
|
|
/// <summary>
|
|
/// A simple window to edit the duration and finish message for a signal timer.
|
|
/// </summary>
|
|
[GenerateTypedNameReferences]
|
|
public sealed partial class SignalTimerWindow : DefaultWindow
|
|
{
|
|
[Dependency] private IGameTiming _timing = default!;
|
|
|
|
private const int MaxTextLength = 16;
|
|
|
|
public event Action<string>? OnCurrentTextChanged;
|
|
public event Action<string>? OnCurrentDelayMinutesChanged;
|
|
public event Action<string>? OnCurrentDelaySecondsChanged;
|
|
|
|
private TimeSpan? _triggerTime;
|
|
|
|
private bool _timerStarted;
|
|
|
|
public event Action? OnStartTimer;
|
|
|
|
public SignalTimerWindow()
|
|
{
|
|
RobustXamlLoader.Load(this);
|
|
IoCManager.InjectDependencies(this);
|
|
|
|
CurrentTextEdit.OnTextChanged += e => OnCurrentTextChange(e.Text);
|
|
CurrentDelayEditMinutes.OnTextChanged += e => OnCurrentDelayMinutesChange(e.Text);
|
|
CurrentDelayEditSeconds.OnTextChanged += e => OnCurrentDelaySecondsChange(e.Text);
|
|
StartTimer.OnPressed += _ => StartTimerWeh();
|
|
}
|
|
|
|
private void StartTimerWeh()
|
|
{
|
|
if (!_timerStarted)
|
|
{
|
|
_timerStarted = true;
|
|
_triggerTime = _timing.CurTime + GetDelay();
|
|
}
|
|
else
|
|
{
|
|
SetTimerStarted(false);
|
|
}
|
|
|
|
OnStartTimer?.Invoke();
|
|
}
|
|
|
|
protected override void FrameUpdate(FrameEventArgs args)
|
|
{
|
|
base.FrameUpdate(args);
|
|
|
|
if (!_timerStarted || _triggerTime == null)
|
|
return;
|
|
|
|
if (_timing.CurTime < _triggerTime.Value)
|
|
{
|
|
var displayValue = TextScreenSystem.ConvertTimeToDisplayValue(_triggerTime.Value - _timing.CurTime, true);
|
|
StartTimer.Text = displayValue.ToString();
|
|
}
|
|
else
|
|
{
|
|
SetTimerStarted(false);
|
|
}
|
|
}
|
|
|
|
public void OnCurrentTextChange(string text)
|
|
{
|
|
if (CurrentTextEdit.Text.Length > MaxTextLength)
|
|
{
|
|
CurrentTextEdit.Text = CurrentTextEdit.Text.Remove(MaxTextLength);
|
|
CurrentTextEdit.CursorPosition = int.Min(CurrentTextEdit.CursorPosition, MaxTextLength);
|
|
}
|
|
OnCurrentTextChanged?.Invoke(text);
|
|
}
|
|
|
|
public void OnCurrentDelayMinutesChange(string text)
|
|
{
|
|
List<char> toRemove = new();
|
|
|
|
foreach (var a in text)
|
|
{
|
|
if (!char.IsDigit(a))
|
|
toRemove.Add(a);
|
|
}
|
|
|
|
foreach (var a in toRemove)
|
|
{
|
|
CurrentDelayEditMinutes.Text = text.Replace(a.ToString(), "");
|
|
}
|
|
|
|
if (CurrentDelayEditMinutes.Text == "")
|
|
return;
|
|
|
|
while (CurrentDelayEditMinutes.Text[0] == '0' && CurrentDelayEditMinutes.Text.Length > 2)
|
|
{
|
|
CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(0, 1);
|
|
}
|
|
|
|
if (CurrentDelayEditMinutes.Text.Length > 2)
|
|
{
|
|
CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(2);
|
|
}
|
|
OnCurrentDelayMinutesChanged?.Invoke(CurrentDelayEditMinutes.Text);
|
|
}
|
|
|
|
public void OnCurrentDelaySecondsChange(string text)
|
|
{
|
|
List<char> toRemove = new();
|
|
|
|
foreach (var a in text)
|
|
{
|
|
if (!char.IsDigit(a))
|
|
toRemove.Add(a);
|
|
}
|
|
|
|
foreach (var a in toRemove)
|
|
{
|
|
CurrentDelayEditSeconds.Text = text.Replace(a.ToString(), "");
|
|
}
|
|
|
|
if (CurrentDelayEditSeconds.Text == "")
|
|
return;
|
|
|
|
while (CurrentDelayEditSeconds.Text[0] == '0' && CurrentDelayEditSeconds.Text.Length > 2)
|
|
{
|
|
CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(0, 1);
|
|
}
|
|
|
|
if (CurrentDelayEditSeconds.Text.Length > 2)
|
|
{
|
|
CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(2);
|
|
}
|
|
OnCurrentDelaySecondsChanged?.Invoke(CurrentDelayEditSeconds.Text);
|
|
}
|
|
|
|
public void SetCurrentText(string text)
|
|
{
|
|
CurrentTextEdit.Text = text;
|
|
}
|
|
|
|
public void SetCurrentDelayMinutes(string delay)
|
|
{
|
|
CurrentDelayEditMinutes.Text = delay;
|
|
}
|
|
|
|
public void SetCurrentDelaySeconds(string delay)
|
|
{
|
|
CurrentDelayEditSeconds.Text = delay;
|
|
}
|
|
|
|
public void SetShowText(bool showTime)
|
|
{
|
|
TextEdit.Visible = showTime;
|
|
}
|
|
|
|
public void SetTriggerTime(TimeSpan timeSpan)
|
|
{
|
|
_triggerTime = timeSpan;
|
|
}
|
|
|
|
public void SetTimerStarted(bool timerStarted)
|
|
{
|
|
_timerStarted = timerStarted;
|
|
|
|
if (!timerStarted)
|
|
StartTimer.Text = Loc.GetString("signal-timer-menu-start");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Disables fields and buttons if you don't have the access.
|
|
/// </summary>
|
|
public void SetHasAccess(bool hasAccess)
|
|
{
|
|
CurrentTextEdit.Editable = hasAccess;
|
|
CurrentDelayEditMinutes.Editable = hasAccess;
|
|
CurrentDelayEditSeconds.Editable = hasAccess;
|
|
StartTimer.Disabled = !hasAccess;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a TimeSpan from the currently entered delay.
|
|
/// </summary>
|
|
public TimeSpan GetDelay()
|
|
{
|
|
if (!double.TryParse(CurrentDelayEditMinutes.Text, out var minutes))
|
|
minutes = 0;
|
|
if (!double.TryParse(CurrentDelayEditSeconds.Text, out var seconds))
|
|
seconds = 0;
|
|
return TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);
|
|
}
|
|
}
|