// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // 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; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Bindings; using osu.Game.Graphics.UserInterface; using osu.Game.Rulesets.Edit; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Taiko.Objects; using osu.Game.Screens.Edit.Compose.Components; namespace osu.Game.Rulesets.Taiko.Edit { public partial class TaikoSelectionHandler : EditorSelectionHandler { private readonly Bindable selectionRimState = new Bindable(); private readonly Bindable selectionStrongState = new Bindable(); [BackgroundDependencyLoader] private void load() { selectionStrongState.ValueChanged += state => { switch (state.NewValue) { case TernaryState.False: SetStrongState(false); break; case TernaryState.True: SetStrongState(true); break; } }; selectionRimState.ValueChanged += state => { switch (state.NewValue) { case TernaryState.False: SetRimState(false); break; case TernaryState.True: SetRimState(true); break; } }; } public void SetStrongState(bool state) { if (SelectedItems.OfType().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().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 GetContextMenuItemsForSelection(IEnumerable> selection) { if (selection.All(s => s.Item is Hit)) { yield return new TernaryStateToggleMenuItem("Rim") { State = { BindTarget = selectionRimState }, Hotkey = new Hotkey(new KeyCombination(InputKey.W), new KeyCombination(InputKey.R)), }; } if (selection.All(s => s.Item is TaikoHitObject)) { yield return new TernaryStateToggleMenuItem("Strong") { State = { BindTarget = selectionStrongState }, Hotkey = new Hotkey(new KeyCombination(InputKey.E)), }; } foreach (var item in base.GetContextMenuItemsForSelection(selection)) yield return item; } public override bool HandleMovement(MoveSelectionEvent moveEvent) => true; protected override void UpdateTernaryStates() { base.UpdateTernaryStates(); selectionRimState.Value = GetStateFromSelection(EditorBeatmap.SelectedHitObjects.OfType(), h => h.Type == HitType.Rim); selectionStrongState.Value = GetStateFromSelection(EditorBeatmap.SelectedHitObjects.OfType(), h => h.IsStrong); } } }