mirror of
https://github.com/osukey/osukey.git
synced 2025-05-12 00:57:21 +09:00
Encapsulate logic for selecting/deselecting further
This commit is contained in:
parent
995ecb7d94
commit
285df52f43
@ -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.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
@ -16,6 +17,9 @@ namespace osu.Game.Rulesets.Edit.Layers.Selection
|
|||||||
{
|
{
|
||||||
public class SelectionLayer : CompositeDrawable
|
public class SelectionLayer : CompositeDrawable
|
||||||
{
|
{
|
||||||
|
public event Action<DrawableHitObject> ObjectSelected;
|
||||||
|
public event Action<DrawableHitObject> ObjectDeselected;
|
||||||
|
|
||||||
private readonly Playfield playfield;
|
private readonly Playfield playfield;
|
||||||
|
|
||||||
public SelectionLayer(Playfield playfield)
|
public SelectionLayer(Playfield playfield)
|
||||||
@ -75,15 +79,69 @@ namespace osu.Game.Rulesets.Edit.Layers.Selection
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Selects a <see cref="DrawableHitObject"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hitObject">The <see cref="DrawableHitObject"/> to select.</param>
|
||||||
|
public void Select(DrawableHitObject hitObject)
|
||||||
|
{
|
||||||
|
if (!select(hitObject))
|
||||||
|
return;
|
||||||
|
|
||||||
|
clearCapture();
|
||||||
|
finishSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Selects a <see cref="DrawableHitObject"/> without performing capture updates.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hitObject">The <see cref="DrawableHitObject"/> to select.</param>
|
||||||
|
/// <returns>Whether <paramref name="hitObject"/> was selected.</returns>
|
||||||
|
private bool select(DrawableHitObject hitObject)
|
||||||
|
{
|
||||||
|
if (!selectedHitObjects.Add(hitObject))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ObjectSelected?.Invoke(hitObject);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deselects a <see cref="DrawableHitObject"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hitObject">The <see cref="DrawableHitObject"/> to deselect.</param>
|
||||||
|
public void Deselect(DrawableHitObject hitObject)
|
||||||
|
{
|
||||||
|
if (!deselect(hitObject))
|
||||||
|
return;
|
||||||
|
|
||||||
|
clearCapture();
|
||||||
|
finishSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deselects a <see cref="DrawableHitObject"/> without performing capture updates.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hitObject">The <see cref="DrawableHitObject"/> to deselect.</param>
|
||||||
|
/// <returns>Whether the <see cref="DrawableHitObject"/> was deselected.</returns>
|
||||||
|
private bool deselect(DrawableHitObject hitObject)
|
||||||
|
{
|
||||||
|
if (!selectedHitObjects.Remove(hitObject))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ObjectDeselected?.Invoke(hitObject);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Deselects all selected <see cref="DrawableHitObject"/>s.
|
/// Deselects all selected <see cref="DrawableHitObject"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void DeselectAll()
|
public void DeselectAll()
|
||||||
{
|
{
|
||||||
|
selectedHitObjects.ForEach(h => ObjectDeselected?.Invoke(h));
|
||||||
selectedHitObjects.Clear();
|
selectedHitObjects.Clear();
|
||||||
|
|
||||||
captureBox?.Hide();
|
clearCapture();
|
||||||
captureBox?.Expire();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -92,8 +150,7 @@ namespace osu.Game.Rulesets.Edit.Layers.Selection
|
|||||||
/// <param name="screenSpaceQuad">The selection <see cref="Quad"/>.</param>
|
/// <param name="screenSpaceQuad">The selection <see cref="Quad"/>.</param>
|
||||||
private void selectQuad(Quad screenSpaceQuad)
|
private void selectQuad(Quad screenSpaceQuad)
|
||||||
{
|
{
|
||||||
foreach (var obj in playfield.HitObjects.Objects.Where(h => h.IsAlive && h.IsPresent && screenSpaceQuad.Contains(h.SelectionPoint)))
|
playfield.HitObjects.Objects.Where(h => h.IsAlive && h.IsPresent && screenSpaceQuad.Contains(h.SelectionPoint)).ForEach(h => select(h));
|
||||||
selectedHitObjects.Add(obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -102,11 +159,17 @@ namespace osu.Game.Rulesets.Edit.Layers.Selection
|
|||||||
/// <param name="screenSpacePoint">The <see cref="Vector2"/> to select at.</param>
|
/// <param name="screenSpacePoint">The <see cref="Vector2"/> to select at.</param>
|
||||||
private void selectPoint(Vector2 screenSpacePoint)
|
private void selectPoint(Vector2 screenSpacePoint)
|
||||||
{
|
{
|
||||||
var selected = playfield.HitObjects.Objects.Reverse().Where(h => h.IsAlive && h.IsPresent).FirstOrDefault(h => h.ReceiveMouseInputAt(screenSpacePoint));
|
var target = playfield.HitObjects.Objects.Reverse().Where(h => h.IsAlive && h.IsPresent).FirstOrDefault(h => h.ReceiveMouseInputAt(screenSpacePoint));
|
||||||
if (selected == null)
|
if (target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
selectedHitObjects.Add(selected);
|
select(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearCapture()
|
||||||
|
{
|
||||||
|
captureBox?.Hide();
|
||||||
|
captureBox?.Expire();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void finishSelection()
|
private void finishSelection()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user