1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-13 17:27:48 +08:00

Fix selection not being retained in control point list when undoing / redoing

This commit is contained in:
Dean Herbert 2023-12-26 20:42:04 +09:00
parent f2c0e7cf2e
commit 1f2f749db6
No known key found for this signature in database
2 changed files with 38 additions and 6 deletions

View File

@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Diagnostics;
using osu.Framework.Allocation;
using osu.Framework.Extensions.LocalisationExtensions;
using osu.Framework.Graphics;
@ -46,15 +47,42 @@ namespace osu.Game.Screens.Edit
});
}
protected void SetSelectedRow(object? item)
protected int GetIndexForObject(object? item)
{
for (int i = 0; i < BackgroundFlow.Count; i++)
{
if (BackgroundFlow[i].Item == item)
return i;
}
return -1;
}
protected bool SetSelectedRow(object? item)
{
bool foundSelection = false;
foreach (var b in BackgroundFlow)
{
b.Selected = ReferenceEquals(b.Item, item);
if (b.Selected)
{
Debug.Assert(!foundSelection);
OnRowSelected?.Invoke(b);
foundSelection = true;
}
}
return foundSelection;
}
protected object? GetObjectAtIndex(int index)
{
if (index < 0 || index > BackgroundFlow.Count - 1)
return null;
return BackgroundFlow[index].Item;
}
protected override Drawable CreateHeader(int index, TableColumn? column) => new HeaderText(column?.Header ?? default);

View File

@ -21,7 +21,7 @@ namespace osu.Game.Screens.Edit.Timing
public partial class ControlPointTable : EditorTable
{
[Resolved]
private Bindable<ControlPointGroup> selectedGroup { get; set; } = null!;
private Bindable<ControlPointGroup?> selectedGroup { get; set; } = null!;
[Resolved]
private EditorClock clock { get; set; } = null!;
@ -32,6 +32,8 @@ namespace osu.Game.Screens.Edit.Timing
{
set
{
int selectedIndex = GetIndexForObject(selectedGroup.Value);
Content = null;
BackgroundFlow.Clear();
@ -53,7 +55,11 @@ namespace osu.Game.Screens.Edit.Timing
Columns = createHeaders();
Content = value.Select(createContent).ToArray().ToRectangular();
updateSelectedGroup();
if (!SetSelectedRow(selectedGroup.Value))
{
// Some operations completely obliterate references, so best-effort reselect based on index.
selectedGroup.Value = GetObjectAtIndex(selectedIndex) as ControlPointGroup;
}
}
}
@ -61,11 +67,9 @@ namespace osu.Game.Screens.Edit.Timing
{
base.LoadComplete();
selectedGroup.BindValueChanged(_ => updateSelectedGroup(), true);
selectedGroup.BindValueChanged(_ => SetSelectedRow(selectedGroup.Value), true);
}
private void updateSelectedGroup() => SetSelectedRow(selectedGroup.Value);
private TableColumn[] createHeaders()
{
var columns = new List<TableColumn>