Add date picker (#40660)

* Add DatePicker

* DatePicker fixes

- Now uses `DateOnly` (currently fails sandbox, but PJB has promised to add
it in engine)
- Add MinDate and MaxDate fields
- Use constructor instead of parsing date string
This commit is contained in:
0x6273
2025-10-14 19:26:07 +02:00
committed by GitHub
parent 246a72f2f8
commit fdbcd3fdc5
3 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
<Control xmlns="https://spacestation14.io">
<BoxContainer Orientation="Horizontal" >
<LineEdit Name="DayLineEdit" PlaceHolder="{Loc 'datepicker-day'}" Margin="4 4" MinWidth="38" />
<OptionButton Name="MonthOptionButton" Margin="4 4" MinWidth="120" />
<LineEdit Name="YearLineEdit" PlaceHolder="{Loc 'datepicker-year'}" Margin="4 4" MinWidth="55" />
</BoxContainer>
</Control>

View File

@@ -0,0 +1,84 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.UserInterface.Controls;
/// <summary>
/// An input control for dates.
/// </summary>
[GenerateTypedNameReferences]
public sealed partial class DatePicker : Control
{
/// <summary>
/// Raised when <see cref="SelectedDate"> is changed.
/// </summary>
public event Action? OnChanged;
/// <summary>
/// The date currently selected by the input, or null if it's not a valid date.
/// </summary>
public DateOnly? SelectedDate;
/// <summary>
/// The oldest possible date that the user can select.
/// </summary>
public DateOnly MinDate = DateOnly.MinValue;
/// <summary>
/// The most recent date that the user can select.
/// </summary>
public DateOnly MaxDate = DateOnly.MaxValue;
/// <summary>
/// True if a valid date is selected.
/// </summary>
public bool IsValid => SelectedDate is not null;
public DatePicker()
{
RobustXamlLoader.Load(this);
MonthOptionButton.AddItem(Loc.GetString("datepicker-month"), 0);
for (var i = 1; i <= 12; i++)
{
MonthOptionButton.AddItem(Loc.GetString($"month-{i}"), i);
}
DayLineEdit.OnTextChanged += _ => Update();
YearLineEdit.OnTextChanged += _ => Update();
MonthOptionButton.OnItemSelected += args => {
if (args.Id != 0)
{
MonthOptionButton.SelectId(args.Id);
}
Update();
};
}
private void Update()
{
var monthNum = MonthOptionButton.SelectedId;
DateOnly? newDate = null;
if (int.TryParse(YearLineEdit.Text, out var year)
&& int.TryParse(DayLineEdit.Text, out var day)
&& monthNum != 0
)
{
newDate = new DateOnly(year, monthNum, day);
}
if (newDate < MinDate || newDate > MaxDate)
{
newDate = null;
}
if (SelectedDate != newDate)
{
SelectedDate = newDate;
OnChanged?.Invoke();
}
}
}