Remove MaskContainer dependency in MaskSelection

This commit is contained in:
Dean Herbert
2018-04-04 20:05:01 +09:00
parent 5c036b966b
commit 2b15555ede
5 changed files with 34 additions and 30 deletions

View File

@ -251,8 +251,7 @@ namespace osu.Game.Rulesets.Edit
/// Creates a <see cref="MaskSelection"/> which outlines <see cref="DrawableHitObject"/>s /// Creates a <see cref="MaskSelection"/> which outlines <see cref="DrawableHitObject"/>s
/// and handles hitobject pattern adjustments. /// and handles hitobject pattern adjustments.
/// </summary> /// </summary>
/// <param name="maskContainer">The <see cref="HitObjectMask"/> container.</param> public virtual MaskSelection CreateMaskSelection() => new MaskSelection();
public virtual MaskSelection CreateSelectionBox(MaskContainer maskContainer) => new MaskSelection(maskContainer);
/// <summary> /// <summary>
/// Creates a <see cref="ScalableContainer"/> which provides a layer above or below the <see cref="Playfield"/>. /// Creates a <see cref="ScalableContainer"/> which provides a layer above or below the <see cref="Playfield"/>.

View File

@ -18,7 +18,6 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
private readonly HitObjectComposer composer; private readonly HitObjectComposer composer;
private MaskContainer maskContainer; private MaskContainer maskContainer;
private MaskSelection maskSelection;
public HitObjectMaskLayer(Playfield playfield, HitObjectComposer composer) public HitObjectMaskLayer(Playfield playfield, HitObjectComposer composer)
{ {
@ -33,7 +32,12 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
{ {
maskContainer = new MaskContainer(); maskContainer = new MaskContainer();
maskSelection = composer.CreateSelectionBox(maskContainer); var maskSelection = composer.CreateMaskSelection();
maskContainer.MaskSelected += maskSelection.HandleSelected;
maskContainer.MaskDeselected += maskSelection.HandleDeselected;
maskContainer.MaskSelectionRequested += maskSelection.HandleSelectionRequested;
maskSelection.DeselectAll = maskContainer.DeselectAll;
var dragLayer = new DragLayer(maskContainer.Select); var dragLayer = new DragLayer(maskContainer.Select);
dragLayer.DragEnd += () => maskSelection.UpdateVisibility(); dragLayer.DragEnd += () => maskSelection.UpdateVisibility();

View File

@ -87,7 +87,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
return Compare(xMask, yMask); return Compare(xMask, yMask);
} }
public int Compare(HitObjectMask x, HitObjectMask y) public static int Compare(HitObjectMask x, HitObjectMask y)
{ {
// Put earlier hitobjects towards the end of the list, so they handle input first // Put earlier hitobjects towards the end of the list, so they handle input first
int i = y.HitObject.HitObject.StartTime.CompareTo(x.HitObject.HitObject.StartTime); int i = y.HitObject.HitObject.StartTime.CompareTo(x.HitObject.HitObject.StartTime);

View File

@ -1,6 +1,7 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -22,26 +23,17 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
{ {
public const float BORDER_RADIUS = 2; public const float BORDER_RADIUS = 2;
private readonly MaskContainer maskContainer;
private readonly SortedList<HitObjectMask> selectedMasks; private readonly SortedList<HitObjectMask> selectedMasks;
private Drawable outline; private Drawable outline;
public MaskSelection(MaskContainer maskContainer) public MaskSelection()
{ {
// todo: remove this selectedMasks = new SortedList<HitObjectMask>(MaskContainer.Compare);
this.maskContainer = maskContainer;
selectedMasks = new SortedList<HitObjectMask>(maskContainer.Compare);
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
AlwaysPresent = true; AlwaysPresent = true;
Alpha = 0; Alpha = 0;
maskContainer.MaskSelected += onSelected;
maskContainer.MaskDeselected += onDeselected;
maskContainer.MaskSelectionRequested += onSelectionRequested;
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
@ -99,9 +91,22 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
#region Selection Handling #region Selection Handling
private void onSelected(HitObjectMask mask) => selectedMasks.Add(mask); /// <summary>
/// Bind an action to deselect all selected masks.
/// </summary>
public Action DeselectAll { private get; set; }
private void onDeselected(HitObjectMask mask) /// <summary>
/// Handle a mask becoming selected.
/// </summary>
/// <param name="mask">The mask.</param>
public void HandleSelected(HitObjectMask mask) => selectedMasks.Add(mask);
/// <summary>
/// Handle a mask becoming deselected.
/// </summary>
/// <param name="mask">The mask.</param>
public void HandleDeselected(HitObjectMask mask)
{ {
selectedMasks.Remove(mask); selectedMasks.Remove(mask);
@ -110,7 +115,11 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
UpdateVisibility(); UpdateVisibility();
} }
private void onSelectionRequested(HitObjectMask mask) /// <summary>
/// Handle a mask requesting selection.
/// </summary>
/// <param name="mask">The mask.</param>
public void HandleSelectionRequested(HitObjectMask mask)
{ {
if (GetContainingInputManager().CurrentState.Keyboard.ControlPressed) if (GetContainingInputManager().CurrentState.Keyboard.ControlPressed)
{ {
@ -125,7 +134,8 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
if (mask.State == Visibility.Visible) if (mask.State == Visibility.Visible)
return; return;
maskContainer.DeselectAll();
DeselectAll?.Invoke();
mask.Select(); mask.Select();
} }
@ -170,14 +180,5 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
outline.Size = bottomRight - topLeft; outline.Size = bottomRight - topLeft;
outline.Position = topLeft; outline.Position = topLeft;
} }
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
maskContainer.MaskSelected -= onSelected;
maskContainer.MaskDeselected -= onDeselected;
maskContainer.MaskSelectionRequested -= onSelectionRequested;
}
} }
} }