Merge pull request #24349 from peppy/tournament-bindable-fixes

Fix tournament client crashing occasionally when editing bracket
This commit is contained in:
Bartłomiej Dach 2023-07-24 21:21:39 +02:00 committed by GitHub
commit 3af5c2b4f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 24 deletions

View File

@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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<DateTimeOffset> Current
private readonly BindableWithCurrent<DateTimeOffset> current = new BindableWithCurrent<DateTimeOffset>();
public new Bindable<DateTimeOffset>? 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<DateTimeOffset> current = new Bindable<DateTimeOffset>();
public DateTextBox()
{
base.Current = new Bindable<string>(string.Empty);
current.BindValueChanged(dto =>
base.Current.Value = dto.NewValue.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"), true);
((OsuTextBox)Control).OnCommit += (sender, _) =>
{
try

View File

@ -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<TournamentRound> 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()