1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 01:27:29 +08:00
osu-lazer/osu.Game.Rulesets.Taiko/Edit/TaikoSelectionHandler.cs

109 lines
3.7 KiB
C#
Raw Normal View History

2023-06-23 00:37:25 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2020-05-29 15:40:10 +08:00
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
2020-05-29 15:40:10 +08:00
using osu.Framework.Graphics.UserInterface;
using osu.Game.Graphics.UserInterface;
using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Objects;
2020-05-29 15:40:10 +08:00
using osu.Game.Rulesets.Taiko.Objects;
using osu.Game.Screens.Edit.Compose.Components;
namespace osu.Game.Rulesets.Taiko.Edit
{
2022-11-24 13:32:20 +08:00
public partial class TaikoSelectionHandler : EditorSelectionHandler
2020-05-29 15:40:10 +08:00
{
private readonly Bindable<TernaryState> selectionRimState = new Bindable<TernaryState>();
private readonly Bindable<TernaryState> selectionStrongState = new Bindable<TernaryState>();
[BackgroundDependencyLoader]
private void load()
2020-05-29 15:40:10 +08:00
{
selectionStrongState.ValueChanged += state =>
2020-05-29 15:40:10 +08:00
{
switch (state.NewValue)
2020-05-29 15:40:10 +08:00
{
case TernaryState.False:
SetStrongState(false);
break;
2020-05-29 15:40:10 +08:00
case TernaryState.True:
SetStrongState(true);
break;
}
};
2020-05-29 15:40:10 +08:00
selectionRimState.ValueChanged += state =>
{
switch (state.NewValue)
2020-05-29 15:40:10 +08:00
{
case TernaryState.False:
SetRimState(false);
break;
case TernaryState.True:
SetRimState(true);
break;
}
};
}
public void SetStrongState(bool state)
{
if (SelectedItems.OfType<Hit>().All(h => h.IsStrong == state))
return;
EditorBeatmap.PerformOnSelection(h =>
{
if (!(h is Hit taikoHit)) return;
if (taikoHit.IsStrong != state)
{
taikoHit.IsStrong = state;
EditorBeatmap.Update(taikoHit);
}
});
}
public void SetRimState(bool state)
{
if (SelectedItems.OfType<Hit>().All(h => h.Type == (state ? HitType.Rim : HitType.Centre)))
return;
EditorBeatmap.PerformOnSelection(h =>
{
if (h is Hit taikoHit)
{
taikoHit.Type = state ? HitType.Rim : HitType.Centre;
EditorBeatmap.Update(h);
}
});
}
protected override IEnumerable<MenuItem> GetContextMenuItemsForSelection(IEnumerable<SelectionBlueprint<HitObject>> selection)
{
if (selection.All(s => s.Item is Hit))
yield return new TernaryStateToggleMenuItem("Rim") { State = { BindTarget = selectionRimState } };
if (selection.All(s => s.Item is TaikoHitObject))
yield return new TernaryStateToggleMenuItem("Strong") { State = { BindTarget = selectionStrongState } };
2021-04-28 12:43:16 +08:00
foreach (var item in base.GetContextMenuItemsForSelection(selection))
yield return item;
2020-05-29 15:40:10 +08:00
}
public override bool HandleMovement(MoveSelectionEvent<HitObject> moveEvent) => true;
protected override void UpdateTernaryStates()
2020-05-29 15:40:10 +08:00
{
base.UpdateTernaryStates();
2020-05-29 15:40:10 +08:00
2020-10-09 17:50:05 +08:00
selectionRimState.Value = GetStateFromSelection(EditorBeatmap.SelectedHitObjects.OfType<Hit>(), h => h.Type == HitType.Rim);
2020-12-15 04:46:02 +08:00
selectionStrongState.Value = GetStateFromSelection(EditorBeatmap.SelectedHitObjects.OfType<TaikoStrongableHitObject>(), h => h.IsStrong);
2020-05-29 15:40:10 +08:00
}
}
}