diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
index aa567dbdf4..fc37aa577c 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
///
/// A container which provides a "blueprint" display of hitobjects.
- /// Includes selection and manipulation support via a .
+ /// Includes selection and manipulation support via a .
///
public abstract class BlueprintContainer : CompositeDrawable, IKeyBindingHandler
{
@@ -32,7 +32,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
protected Container SelectionBlueprints { get; private set; }
- private SelectionHandler selectionHandler;
+ protected SelectionHandler SelectionHandler;
[Resolved(CanBeNull = true)]
private IEditorChangeHandler changeHandler { get; set; }
@@ -56,15 +56,15 @@ namespace osu.Game.Screens.Edit.Compose.Components
[BackgroundDependencyLoader]
private void load()
{
- selectionHandler = CreateSelectionHandler();
- selectionHandler.DeselectAll = deselectAll;
+ SelectionHandler = CreateSelectionHandler();
+ SelectionHandler.DeselectAll = deselectAll;
AddRangeInternal(new[]
{
DragBox = CreateDragBox(selectBlueprintsFromDragRectangle),
- selectionHandler,
+ SelectionHandler,
SelectionBlueprints = CreateSelectionBlueprintContainer(),
- selectionHandler.CreateProxy(),
+ SelectionHandler.CreateProxy(),
DragBox.CreateProxy().With(p => p.Depth = float.MinValue)
});
@@ -102,7 +102,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
new Container { RelativeSizeAxes = Axes.Both };
///
- /// Creates a which outlines s and handles movement of selections.
+ /// Creates a which outlines s and handles movement of selections.
///
protected virtual SelectionHandler CreateSelectionHandler() => new SelectionHandler();
@@ -130,7 +130,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
return false;
// store for double-click handling
- clickedBlueprint = selectionHandler.SelectedBlueprints.FirstOrDefault(b => b.IsHovered);
+ clickedBlueprint = SelectionHandler.SelectedBlueprints.FirstOrDefault(b => b.IsHovered);
// Deselection should only occur if no selected blueprints are hovered
// A special case for when a blueprint was selected via this click is added since OnClick() may occur outside the hitobject and should not trigger deselection
@@ -147,7 +147,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
return false;
// ensure the blueprint which was hovered for the first click is still the hovered blueprint.
- if (clickedBlueprint == null || selectionHandler.SelectedBlueprints.FirstOrDefault(b => b.IsHovered) != clickedBlueprint)
+ if (clickedBlueprint == null || SelectionHandler.SelectedBlueprints.FirstOrDefault(b => b.IsHovered) != clickedBlueprint)
return false;
editorClock?.SeekTo(clickedBlueprint.HitObject.StartTime);
@@ -208,7 +208,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
if (DragBox.State == Visibility.Visible)
{
DragBox.Hide();
- selectionHandler.UpdateVisibility();
+ SelectionHandler.UpdateVisibility();
}
}
@@ -217,7 +217,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
switch (e.Key)
{
case Key.Escape:
- if (!selectionHandler.SelectedBlueprints.Any())
+ if (!SelectionHandler.SelectedBlueprints.Any())
return false;
deselectAll();
@@ -298,14 +298,14 @@ namespace osu.Game.Screens.Edit.Compose.Components
bool allowDeselection = e.ControlPressed && e.Button == MouseButton.Left;
// Todo: This is probably incorrectly disallowing multiple selections on stacked objects
- if (!allowDeselection && selectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
+ if (!allowDeselection && SelectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
return;
foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren)
{
if (blueprint.IsHovered)
{
- selectionHandler.HandleSelectionRequested(blueprint, e.CurrentState);
+ SelectionHandler.HandleSelectionRequested(blueprint, e.CurrentState);
clickSelectionBegan = true;
break;
}
@@ -358,23 +358,23 @@ namespace osu.Game.Screens.Edit.Compose.Components
private void selectAll()
{
SelectionBlueprints.ToList().ForEach(m => m.Select());
- selectionHandler.UpdateVisibility();
+ SelectionHandler.UpdateVisibility();
}
///
/// Deselects all selected s.
///
- private void deselectAll() => selectionHandler.SelectedBlueprints.ToList().ForEach(m => m.Deselect());
+ private void deselectAll() => SelectionHandler.SelectedBlueprints.ToList().ForEach(m => m.Deselect());
private void onBlueprintSelected(SelectionBlueprint blueprint)
{
- selectionHandler.HandleSelected(blueprint);
+ SelectionHandler.HandleSelected(blueprint);
SelectionBlueprints.ChangeChildDepth(blueprint, 1);
}
private void onBlueprintDeselected(SelectionBlueprint blueprint)
{
- selectionHandler.HandleDeselected(blueprint);
+ SelectionHandler.HandleDeselected(blueprint);
SelectionBlueprints.ChangeChildDepth(blueprint, 0);
}
@@ -391,16 +391,16 @@ namespace osu.Game.Screens.Edit.Compose.Components
///
private void prepareSelectionMovement()
{
- if (!selectionHandler.SelectedBlueprints.Any())
+ if (!SelectionHandler.SelectedBlueprints.Any())
return;
// Any selected blueprint that is hovered can begin the movement of the group, however only the earliest hitobject is used for movement
// A special case is added for when a click selection occurred before the drag
- if (!clickSelectionBegan && !selectionHandler.SelectedBlueprints.Any(b => b.IsHovered))
+ if (!clickSelectionBegan && !SelectionHandler.SelectedBlueprints.Any(b => b.IsHovered))
return;
// Movement is tracked from the blueprint of the earliest hitobject, since it only makes sense to distance snap from that hitobject
- movementBlueprint = selectionHandler.SelectedBlueprints.OrderBy(b => b.HitObject.StartTime).First();
+ movementBlueprint = SelectionHandler.SelectedBlueprints.OrderBy(b => b.HitObject.StartTime).First();
movementBlueprintOriginalPosition = movementBlueprint.ScreenSpaceSelectionPoint; // todo: unsure if correct
}
@@ -425,14 +425,14 @@ namespace osu.Game.Screens.Edit.Compose.Components
var result = snapProvider.SnapScreenSpacePositionToValidTime(movePosition);
// Move the hitobjects.
- if (!selectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprint, result.ScreenSpacePosition)))
+ if (!SelectionHandler.HandleMovement(new MoveSelectionEvent(movementBlueprint, result.ScreenSpacePosition)))
return true;
if (result.Time.HasValue)
{
// Apply the start time at the newly snapped-to position
double offset = result.Time.Value - draggedObject.StartTime;
- foreach (HitObject obj in selectionHandler.SelectedHitObjects)
+ foreach (HitObject obj in SelectionHandler.SelectedHitObjects)
obj.StartTime += offset;
}
diff --git a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
index 2a7c52579f..6f66c1bd6f 100644
--- a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
@@ -66,14 +66,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
if (Beatmap.SelectedHitObjects.Count > 0)
{
- foreach (var h in Beatmap.SelectedHitObjects)
- {
- if (h is IHasComboInformation c)
- {
- c.NewCombo = combo.NewValue;
- Beatmap.UpdateHitObject(h);
- }
- }
+ SelectionHandler.SetNewCombo(combo.NewValue);
}
else if (currentPlacement != null)
{
diff --git a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
index ca22b443fb..1c5c3179ca 100644
--- a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
@@ -285,7 +285,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
var comboInfo = h as IHasComboInformation;
if (comboInfo == null)
- throw new InvalidOperationException($"Tried to change combo state of a {h.GetType()}, which doesn't implement {nameof(IHasComboInformation)}");
+ continue;
comboInfo.NewCombo = state;
EditorBeatmap?.UpdateHitObject(h);