mirror of
https://github.com/ppy/osu
synced 2024-12-17 12:25:19 +00:00
Merge pull request #10883 from smoogipoo/defined-blueprint-order
This commit is contained in:
commit
8ccb399eff
@ -118,8 +118,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual Container<SelectionBlueprint> CreateSelectionBlueprintContainer() =>
|
protected virtual Container<SelectionBlueprint> CreateSelectionBlueprintContainer() => new HitObjectOrderedSelectionContainer { RelativeSizeAxes = Axes.Both };
|
||||||
new Container<SelectionBlueprint> { RelativeSizeAxes = Axes.Both };
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a <see cref="Components.SelectionHandler"/> which outlines <see cref="DrawableHitObject"/>s and handles movement of selections.
|
/// Creates a <see cref="Components.SelectionHandler"/> which outlines <see cref="DrawableHitObject"/>s and handles movement of selections.
|
||||||
@ -338,7 +337,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
/// <returns>Whether a selection was performed.</returns>
|
/// <returns>Whether a selection was performed.</returns>
|
||||||
private bool beginClickSelection(MouseButtonEvent e)
|
private bool beginClickSelection(MouseButtonEvent e)
|
||||||
{
|
{
|
||||||
foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren)
|
// Iterate from the top of the input stack (blueprints closest to the front of the screen first).
|
||||||
|
foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren.Reverse())
|
||||||
{
|
{
|
||||||
if (!blueprint.IsHovered) continue;
|
if (!blueprint.IsHovered) continue;
|
||||||
|
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Compose.Components
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A container for <see cref="SelectionBlueprint"/> ordered by their <see cref="HitObject"/> start times.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class HitObjectOrderedSelectionContainer : Container<SelectionBlueprint>
|
||||||
|
{
|
||||||
|
public override void Add(SelectionBlueprint drawable)
|
||||||
|
{
|
||||||
|
base.Add(drawable);
|
||||||
|
bindStartTime(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Remove(SelectionBlueprint drawable)
|
||||||
|
{
|
||||||
|
if (!base.Remove(drawable))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unbindStartTime(drawable);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Clear(bool disposeChildren)
|
||||||
|
{
|
||||||
|
base.Clear(disposeChildren);
|
||||||
|
unbindAllStartTimes();
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly Dictionary<SelectionBlueprint, IBindable> startTimeMap = new Dictionary<SelectionBlueprint, IBindable>();
|
||||||
|
|
||||||
|
private void bindStartTime(SelectionBlueprint blueprint)
|
||||||
|
{
|
||||||
|
var bindable = blueprint.HitObject.StartTimeBindable.GetBoundCopy();
|
||||||
|
|
||||||
|
bindable.BindValueChanged(_ =>
|
||||||
|
{
|
||||||
|
if (LoadState >= LoadState.Ready)
|
||||||
|
SortInternal();
|
||||||
|
});
|
||||||
|
|
||||||
|
startTimeMap[blueprint] = bindable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unbindStartTime(SelectionBlueprint blueprint)
|
||||||
|
{
|
||||||
|
startTimeMap[blueprint].UnbindAll();
|
||||||
|
startTimeMap.Remove(blueprint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unbindAllStartTimes()
|
||||||
|
{
|
||||||
|
foreach (var kvp in startTimeMap)
|
||||||
|
kvp.Value.UnbindAll();
|
||||||
|
startTimeMap.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override int Compare(Drawable x, Drawable y)
|
||||||
|
{
|
||||||
|
var xObj = (SelectionBlueprint)x;
|
||||||
|
var yObj = (SelectionBlueprint)y;
|
||||||
|
|
||||||
|
// Put earlier blueprints towards the end of the list, so they handle input first
|
||||||
|
int i = yObj.HitObject.StartTime.CompareTo(xObj.HitObject.StartTime);
|
||||||
|
return i == 0 ? CompareReverseChildID(x, y) : i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -201,7 +201,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
|||||||
|
|
||||||
public TimelineSelectionBlueprintContainer()
|
public TimelineSelectionBlueprintContainer()
|
||||||
{
|
{
|
||||||
AddInternal(new TimelinePart<SelectionBlueprint>(Content = new Container<SelectionBlueprint> { RelativeSizeAxes = Axes.Both }) { RelativeSizeAxes = Axes.Both });
|
AddInternal(new TimelinePart<SelectionBlueprint>(Content = new HitObjectOrderedSelectionContainer { RelativeSizeAxes = Axes.Both }) { RelativeSizeAxes = Axes.Both });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user