diff --git a/osu.Game.Tournament/Components/DateTextBox.cs b/osu.Game.Tournament/Components/DateTextBox.cs index f23ad20a67..0993a4c05e 100644 --- a/osu.Game.Tournament/Components/DateTextBox.cs +++ b/osu.Game.Tournament/Components/DateTextBox.cs @@ -1,8 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using System; using osu.Framework.Bindables; using osu.Game.Graphics.UserInterface; @@ -12,24 +10,21 @@ namespace osu.Game.Tournament.Components { public partial class DateTextBox : SettingsTextBox { - public new Bindable Current + private readonly BindableWithCurrent current = new BindableWithCurrent(); + + public new Bindable? Current { get => current; - set - { - current = value.GetBoundCopy(); - current.BindValueChanged(dto => - base.Current.Value = dto.NewValue.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"), true); - } + set => current.Current = value; } - // hold a reference to the provided bindable so we don't have to in every settings section. - private Bindable current = new Bindable(); - public DateTextBox() { base.Current = new Bindable(string.Empty); + current.BindValueChanged(dto => + base.Current.Value = dto.NewValue.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"), true); + ((OsuTextBox)Control).OnCommit += (sender, _) => { try diff --git a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs index f5b6faaa3c..5c9c14cc30 100644 --- a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs +++ b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs @@ -62,22 +62,28 @@ namespace osu.Game.Tournament.Screens.Ladder.Components // ensure any ongoing edits are committed out to the *current* selection before changing to a new one. GetContainingInputManager().TriggerFocusContention(null); - roundDropdown.Current = selection.NewValue?.Round; - losersCheckbox.Current = selection.NewValue?.Losers; - dateTimeBox.Current = selection.NewValue?.Date; + // Required to avoid cyclic failure in BindableWithCurrent (TriggerChange called during the Current_Set process). + // Arguable a framework issue but since we haven't hit it anywhere else a local workaround seems best. + roundDropdown.Current.ValueChanged -= roundDropdownChanged; - team1Dropdown.Current = selection.NewValue?.Team1; - team2Dropdown.Current = selection.NewValue?.Team2; + roundDropdown.Current = selection.NewValue.Round; + losersCheckbox.Current = selection.NewValue.Losers; + dateTimeBox.Current = selection.NewValue.Date; + + team1Dropdown.Current = selection.NewValue.Team1; + team2Dropdown.Current = selection.NewValue.Team2; + + roundDropdown.Current.ValueChanged += roundDropdownChanged; }; + } - roundDropdown.Current.ValueChanged += round => + private void roundDropdownChanged(ValueChangedEvent round) + { + if (editorInfo.Selected.Value?.Date.Value < round.NewValue?.StartDate.Value) { - if (editorInfo.Selected.Value?.Date.Value < round.NewValue?.StartDate.Value) - { - editorInfo.Selected.Value.Date.Value = round.NewValue.StartDate.Value; - editorInfo.Selected.TriggerChange(); - } - }; + editorInfo.Selected.Value.Date.Value = round.NewValue.StartDate.Value; + editorInfo.Selected.TriggerChange(); + } } protected override void LoadComplete()