diff --git a/osu.Game.Tournament/Screens/Groupings/GroupingsEditorScreen.cs b/osu.Game.Tournament/Screens/Groupings/GroupingsEditorScreen.cs index c90a166581..87a975aadc 100644 --- a/osu.Game.Tournament/Screens/Groupings/GroupingsEditorScreen.cs +++ b/osu.Game.Tournament/Screens/Groupings/GroupingsEditorScreen.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -62,39 +61,31 @@ public GroupingsEditorScreen() private void load() { foreach (var g in LadderInfo.Groupings) - items.Add(new GroupingRow(g, updateGroupings)); - } - - protected override void LoadComplete() - { - base.LoadComplete(); - Scheduler.AddDelayed(updateGroupings, 500, true); + items.Add(new GroupingRow(g)); } private void addNew() { - items.Add(new GroupingRow(new TournamentGrouping + var grouping = new TournamentGrouping { StartDate = { Value = DateTimeOffset.UtcNow } - }, updateGroupings)); + }; - updateGroupings(); - } - - private void updateGroupings() - { - LadderInfo.Groupings.Clear(); - LadderInfo.Groupings.AddRange(items.Children.Select(c => c.Grouping)); + items.Add(new GroupingRow(grouping)); + LadderInfo.Groupings.Add(grouping); } public class GroupingRow : CompositeDrawable { public readonly TournamentGrouping Grouping; - public GroupingRow(TournamentGrouping grouping, Action onDelete) + [Resolved] + private LadderInfo ladderInfo { get; set; } + + public GroupingRow(TournamentGrouping grouping) { Margin = new MarginPadding(10); @@ -152,7 +143,7 @@ public GroupingRow(TournamentGrouping grouping, Action onDelete) Action = () => { Expire(); - onDelete(); + ladderInfo.Groupings.Remove(Grouping); }, } }; diff --git a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentGrouping.cs b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentGrouping.cs index 40adc24dc4..a3a7bf4f64 100644 --- a/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentGrouping.cs +++ b/osu.Game.Tournament/Screens/Ladder/Components/DrawableTournamentGrouping.cs @@ -1,6 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using JetBrains.Annotations; +using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Graphics; @@ -11,8 +13,17 @@ namespace osu.Game.Tournament.Screens.Ladder.Components { public class DrawableTournamentGrouping : CompositeDrawable { + [UsedImplicitly] + private readonly Bindable name; + + [UsedImplicitly] + private readonly Bindable description; + public DrawableTournamentGrouping(TournamentGrouping grouping, bool losers = false) { + OsuSpriteText textName; + OsuSpriteText textDescription; + AutoSizeAxes = Axes.Both; InternalChild = new FillFlowContainer { @@ -20,16 +31,14 @@ public DrawableTournamentGrouping(TournamentGrouping grouping, bool losers = fal AutoSizeAxes = Axes.Both, Children = new Drawable[] { - new OsuSpriteText + textDescription = new OsuSpriteText { - Text = grouping.Description.Value.ToUpper(), Colour = Color4.Black, Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre }, - new OsuSpriteText + textName = new OsuSpriteText { - Text = ((losers ? "Losers " : "") + grouping.Name).ToUpper(), Font = OsuFont.GetFont(weight: FontWeight.Bold), Colour = Color4.Black, Origin = Anchor.TopCentre, @@ -37,6 +46,12 @@ public DrawableTournamentGrouping(TournamentGrouping grouping, bool losers = fal }, } }; + + name = grouping.Name.GetBoundCopy(); + name.BindValueChanged(n => textName.Text = ((losers ? "Losers " : "") + grouping.Name).ToUpper(), true); + + description = grouping.Name.GetBoundCopy(); + description.BindValueChanged(n => textDescription.Text = grouping.Description.Value.ToUpper(), true); } } } diff --git a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs index 21d20e1175..7d6b7ae57f 100644 --- a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs +++ b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs @@ -6,6 +6,7 @@ using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; @@ -74,10 +75,7 @@ private void load() }, }, textboxTeam2 = new OsuTextBox { RelativeSizeAxes = Axes.X, Height = 20 }, - groupingDropdown = new SettingsDropdown - { - Bindable = new Bindable(), - }, + groupingDropdown = new SettingsGroupingDropdown(ladderInfo.Groupings), losersCheckbox = new PlayerCheckbox { LabelText = "Losers Bracket", @@ -89,24 +87,11 @@ private void load() } }; - IEnumerable groupingOptions = null; - - void updateDropdownItems() - { - groupingOptions = ladderInfo.Groupings.Prepend(new TournamentGrouping()); - groupingDropdown.Items = groupingOptions; - } - - ladderInfo.Groupings.ItemsRemoved += _ => updateDropdownItems(); - ladderInfo.Groupings.ItemsAdded += _ => updateDropdownItems(); - - updateDropdownItems(); - editorInfo.Selected.ValueChanged += selection => { textboxTeam1.Text = selection.NewValue?.Team1.Value?.Acronym; textboxTeam2.Text = selection.NewValue?.Team2.Value?.Acronym; - groupingDropdown.Bindable.Value = selection.NewValue?.Grouping.Value ?? groupingOptions.First(); + groupingDropdown.Bindable.Value = selection.NewValue?.Grouping.Value; losersCheckbox.Current.Value = selection.NewValue?.Losers.Value ?? false; dateTimeBox.Bindable.Value = selection.NewValue?.Date.Value ?? DateTimeOffset.UtcNow; }; @@ -164,5 +149,39 @@ protected override bool OnHover(HoverEvent e) protected override void OnHoverLost(HoverLostEvent e) { } + + private class SettingsGroupingDropdown : SettingsDropdown + { + public SettingsGroupingDropdown(BindableList groupings) + { + Bindable = new Bindable(); + + foreach (var g in groupings.Prepend(new TournamentGrouping())) + add(g); + + groupings.ItemsRemoved += items => items.ForEach(i => Control.RemoveDropdownItem(i)); + groupings.ItemsAdded += items => items.ForEach(add); + } + + private readonly List refBindables = new List(); + + private T boundReference(T obj) + where T : IBindable + { + obj = (T)obj.GetBoundCopy(); + refBindables.Add(obj); + return obj; + } + + private void add(TournamentGrouping grouping) + { + Control.AddDropdownItem(grouping); + boundReference(grouping.Name).BindValueChanged(_ => + { + Control.RemoveDropdownItem(grouping); + Control.AddDropdownItem(grouping); + }); + } + } } }