using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.XAML; namespace Content.Client.UserInterface.Controls; /// /// An input control for dates. /// [GenerateTypedNameReferences] public sealed partial class DatePicker : Control { /// /// Raised when is changed. /// public event Action? OnChanged; /// /// The date currently selected by the input, or null if it's not a valid date. /// public DateOnly? SelectedDate; /// /// The oldest possible date that the user can select. /// public DateOnly MinDate = DateOnly.MinValue; /// /// The most recent date that the user can select. /// public DateOnly MaxDate = DateOnly.MaxValue; /// /// True if a valid date is selected. /// 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(); } } }