/// <summary> /// あるロングノーツが配置済みノーツリスト内に存在するかどうかを判断します。 /// </summary> public bool Contains(LongNote lnote) { if (lnote == null) { Logger.Error("引数longNoteがnullです。", true); return(false); } switch (lnote) { case Hold hold: { return(holdNotes.Contains(hold)); } case Slide slide: { return(slideNotes.Contains(slide)); } case AirHold ah: { return(airHoldNotes.Contains(ah)); } default: { Logger.Warn("不明なロングノーツです。"); return(false); } } }
/// <summary> /// Hold, Slideを配置します。 /// 終端ノーツにAirやAirHoldが付随していた場合、それらも配置します。 /// </summary> public bool Put(LongNote longNote) { if (longNote == null) { Logger.Error("ロングノーツを追加できません。引数がnullです。", true); return(false); } switch (longNote) { case Hold hold: { holdNotes.Add(hold); HoldEnd end = hold.EndNote as HoldEnd; if (end == null) { Logger.Warn("EndNoteがnullでした。"); break; } if (end.IsAirAttached) { airNotes.Add(end.Air); } if (end.IsAirHoldAttached) { airHoldNotes.Add(end.AirHold); } } break; case Slide slide: { slideNotes.Add(slide); SlideEnd end = slide.EndNote as SlideEnd; if (end == null) { Logger.Warn("EndNoteがnullでした。"); break; } if (end.IsAirAttached) { airNotes.Add(end.Air); } if (end.IsAirHoldAttached) { airHoldNotes.Add(end.AirHold); } } break; default: { Logger.Warn("不適切なロングノーツを追加できません。", true); return(false); } } return(true); }
/// <summary> /// Hold, Slideを取り除きます。 /// 終端ノーツにAirやAirHoldが付随していた場合、それらも除去しますが、Hold,Slideとの取り外しはしません。 /// </summary> public bool UnPut(LongNote lnote) { if (lnote == null) { Logger.Error("引数lnoteがnullのため処理を行えません。", true); return(false); } switch (lnote) { case Hold hold: { if (!holdNotes.Remove(hold)) { Logger.Warn("Holdノーツの削除に失敗しました。"); return(false); } var end = hold.EndNote as AirableNote; airNotes.Remove(end?.Air); airHoldNotes.Remove(end?.AirHold); return(true); } case Slide slide: { if (!slideNotes.Remove(slide)) { Logger.Warn("Slideノーツの削除に失敗しました。"); return(false); } var end = slide.EndNote as AirableNote; airNotes.Remove(end?.Air); airHoldNotes.Remove(end?.AirHold); return(true); } case AirHold _: { Logger.Error("AirHoldはこの操作では削除できません。", true); return(false); } default: { Logger.Error("不明なロングノーツです。", true); return(false); } } }
/// <summary> /// あるロングノーツのリスト中の並び順を変更します /// リストの範囲を下回るインデックスの場合はリストの先頭への移動とみなされます /// リストの範囲を上回るインデックスの場合はリストの末尾への移動とみなされます /// </summary> public bool MoveIndexTo(int index, LongNote lnote) { if (lnote == null) { Logger.Error("引数lnoteがnullのため、操作を行えません。", true); return(false); } if (index < 0) { index = 0; } switch (lnote) { case Hold hold: { if (holdNotes.Count < index) { index = holdNotes.Count; } if (!holdNotes.Remove(hold)) { Logger.Error("Holdの削除に失敗しました。", true); return(false); } holdNotes.Insert(index, hold); return(true); } case Slide slide: { if (slideNotes.Count < index) { index = slideNotes.Count; } if (!slideNotes.Remove(slide)) { Logger.Error("Slideの削除に失敗しました。", true); return(false); } slideNotes.Insert(index, slide); return(true); } case AirHold ah: { if (airHoldNotes.Count < index) { index = airHoldNotes.Count; } if (!airHoldNotes.Remove(ah)) { Logger.Error("AirHoldの削除に失敗しました。", true); return(false); } airHoldNotes.Insert(index, ah); return(true); } default: { Logger.Error("不明なロングノーツに対して操作を行えません。", true); return(false); } } }