diff --git a/osu.Game.Rulesets.Karaoke/Beatmaps/Metadatas/SingerInfo.cs b/osu.Game.Rulesets.Karaoke/Beatmaps/Metadatas/SingerInfo.cs index dd8ea2098..92d772e80 100644 --- a/osu.Game.Rulesets.Karaoke/Beatmaps/Metadatas/SingerInfo.cs +++ b/osu.Game.Rulesets.Karaoke/Beatmaps/Metadatas/SingerInfo.cs @@ -14,13 +14,16 @@ public class SingerInfo public bool SupportSingerState { get; set; } // todo: should make the property as readonly. - public BindableList Singers { get; set; } = new(); + public BindableList Singers { get; set; } = new(); + + // todo: should make the property as readonly. + public BindableList SingerState { get; set; } = new(); public IEnumerable GetAllSingers() => - Singers.OfType().OrderBy(x => x.Order); + Singers.OrderBy(x => x.Order); public IEnumerable GetAllAvailableSingerStates(Singer singer) => - Singers.OfType().Where(x => x.MainSingerId == singer.ID).OrderBy(x => x.Order); + SingerState.Where(x => x.MainSingerId == singer.ID).OrderBy(x => x.Order); public IDictionary GetSingerByIds(ElementId[] singerIds) { @@ -58,7 +61,7 @@ public SingerState AddSingerState(Singer singer, Action? action = n var singerState = new SingerState(mainSingerId); action?.Invoke(singerState); - Singers.Add(singerState); + SingerState.Add(singerState); return singerState; } @@ -76,14 +79,24 @@ public bool RemoveSinger(ISinger singer) RemoveSinger(singerState); } - return Singers.Remove(singer); + return Singers.Remove(mainSinger); } - case SingerState: - return Singers.Remove(singer); + case SingerState singerState: + return SingerState.Remove(singerState); default: throw new InvalidCastException(); } } + + public bool HasSinger(ISinger singer) + { + return singer switch + { + Singer mainSinger => Singers.Contains(mainSinger), + SingerState singerState => SingerState.Contains(singerState), + _ => throw new InvalidCastException(), + }; + } } diff --git a/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/BeatmapSingersChangeHandler.cs b/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/BeatmapSingersChangeHandler.cs index 691279460..67a5e239c 100644 --- a/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/BeatmapSingersChangeHandler.cs +++ b/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/BeatmapSingersChangeHandler.cs @@ -24,7 +24,7 @@ public partial class BeatmapSingersChangeHandler : BeatmapPropertyChangeHandler, private SingerInfo singerInfo => KaraokeBeatmap.SingerInfo; - public BindableList Singers => singerInfo.Singers; + public BindableList Singers => singerInfo.Singers; public void ChangeOrder(ISinger singer, int newIndex) { @@ -111,7 +111,7 @@ private void performSingerChanged(TSinger singer, Action actio { performSingerInfoChanged(singerInfo => { - if (!singerInfo.Singers.Contains(singer)) + if (!singerInfo.HasSinger(singer)) throw new InvalidOperationException("Singer should be in the beatmap"); action(singer); diff --git a/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/IBeatmapSingersChangeHandler.cs b/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/IBeatmapSingersChangeHandler.cs index 9f313238f..299bf5fd0 100644 --- a/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/IBeatmapSingersChangeHandler.cs +++ b/osu.Game.Rulesets.Karaoke/Edit/ChangeHandlers/Beatmaps/IBeatmapSingersChangeHandler.cs @@ -11,7 +11,7 @@ namespace osu.Game.Rulesets.Karaoke.Edit.ChangeHandlers.Beatmaps; public interface IBeatmapSingersChangeHandler { // todo: should use IBindableList eventually, but cannot do that because it's bind to selection item. - BindableList Singers { get; } + BindableList Singers { get; } void ChangeOrder(ISinger singer, int newIndex); diff --git a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Lyrics/Settings/Singers/SingerEditSection.cs b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Lyrics/Settings/Singers/SingerEditSection.cs index 75755c993..cf103cb0d 100644 --- a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Lyrics/Settings/Singers/SingerEditSection.cs +++ b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Lyrics/Settings/Singers/SingerEditSection.cs @@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Karaoke.Screens.Edit.Beatmaps.Lyrics.Settings.Singer public partial class SingerEditSection : LyricPropertySection { - private readonly IBindableList bindableSingers = new BindableList(); + private readonly IBindableList bindableSingers = new BindableList(); private readonly IBindableList singerIndexes = new BindableList(); protected override LocalisableString Title => "Singer"; diff --git a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableList.cs b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableList.cs index f009c7d86..b311b1a32 100644 --- a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableList.cs +++ b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableList.cs @@ -4,6 +4,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Graphics.Containers; +using osu.Game.Rulesets.Karaoke.Beatmaps.Metadatas; using osu.Game.Rulesets.Karaoke.Beatmaps.Metadatas.Types; using osu.Game.Rulesets.Karaoke.Graphics.Containers; using osu.Game.Rulesets.Karaoke.Screens.Edit.Beatmaps.Singers.Rows; @@ -11,7 +12,7 @@ namespace osu.Game.Rulesets.Karaoke.Screens.Edit.Beatmaps.Singers; -public partial class SingerRearrangeableList : OrderRearrangeableListContainer +public partial class SingerRearrangeableList : OrderRearrangeableListContainer { protected override Vector2 Spacing => new(0, 5); @@ -24,7 +25,7 @@ public SingerRearrangeableList() }; } - protected override OsuRearrangeableListItem CreateOsuDrawable(ISinger item) + protected override OsuRearrangeableListItem CreateOsuDrawable(Singer item) => new SingerRearrangeableListItem(item); protected override Drawable CreateBottomDrawable() diff --git a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableListItem.cs b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableListItem.cs index 37ea496df..80e4ae762 100644 --- a/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableListItem.cs +++ b/osu.Game.Rulesets.Karaoke/Screens/Edit/Beatmaps/Singers/SingerRearrangeableListItem.cs @@ -15,20 +15,17 @@ namespace osu.Game.Rulesets.Karaoke.Screens.Edit.Beatmaps.Singers; -public partial class SingerRearrangeableListItem : OsuRearrangeableListItem +public partial class SingerRearrangeableListItem : OsuRearrangeableListItem { private Box dragAlert = null!; - public SingerRearrangeableListItem(ISinger item) + public SingerRearrangeableListItem(Singer item) : base(item) { } protected override Drawable CreateContent() { - if (Model is not Singer singer) - throw new InvalidCastException($"Currently we are only able to edit the {nameof(Singer)}."); - return new Container { Masking = true, @@ -42,7 +39,7 @@ protected override Drawable CreateContent() RelativeSizeAxes = Axes.Both, Alpha = 0, }, - new SingerLyricPlacementColumn(singer) + new SingerLyricPlacementColumn(Model) { RelativeSizeAxes = Axes.Both, },