public AdjustResult AdjustChordTicks(GuitarChord chord, TickPair newTicks, AdjustOption option) { AdjustResult result; var updatedTicks = GetAdjustChordTicks(newTicks, option, out result, chord); if (!result.HasFlag(AdjustResult.Error) && updatedTicks.IsNull == false) { chord.SetTicks(updatedTicks); chord.UpdateEvents(); } return(result); }
public TickPair GetAdjustChordTicks(TickPair newTicks, AdjustOption option, out AdjustResult result, GuitarChord chord = null) { result = AdjustResult.NoResult; var existingTicks = new TickPair(newTicks.Down, newTicks.Up); var queryTicks = new TickPair(newTicks.Down, newTicks.Up); if (option.HasFlag(AdjustOption.AllowGrow) || option.HasFlag(AdjustOption.AllowShift)) { queryTicks = new TickPair(newTicks.Down, newTicks.Up); } var between = Chords.GetBetweenTick(queryTicks); if (chord != null) { between = between.Where(x => x != chord); } if (!between.Any()) { result = AdjustResult.Success; return(newTicks); } else { var closeToBegin = between.Where(x => x.TickPair.IsCloseUpDown(newTicks)); var closeToEnd = between.Where(x => x.TickPair.IsCloseDownUp(newTicks)); var closeChords = closeToBegin.Concat(closeToEnd).Distinct(); if (!closeChords.Any()) { result = AdjustResult.Success; return(newTicks); } else { TickPair updatedTicks = new TickPair(newTicks.Down, newTicks.Up); var min = closeToBegin.GetMaxTick(updatedTicks.Down); var max = closeToEnd.GetMinTick(updatedTicks.Up); var updatedLen = updatedTicks.Up - updatedTicks.Down; var space = max - min; if (space <= 0) { result = AdjustResult.Error; return(TickPair.NullValue); } if (updatedLen <= 0) { result = AdjustResult.Error; return(TickPair.NullValue); } if (updatedLen == space) { result = AdjustResult.Success; return(updatedTicks); } if ((updatedLen < space && option.HasFlag(AdjustOption.AllowGrow)) || (updatedLen > space && option.HasFlag(AdjustOption.AllowShrink))) { if (updatedTicks.Down < min) { result |= AdjustResult.AdjustedDownTickRight; } else if (updatedTicks.Down > min) { result |= AdjustResult.AdjustedDownTickLeft; } updatedTicks.Down = min; if (updatedTicks.Up < max) { result |= AdjustResult.AdjustedUpTickRight; } else if (updatedTicks.Up > max) { result |= AdjustResult.AdjustedUpTickLeft; } updatedTicks.Up = max; updatedLen = updatedTicks.Up - updatedTicks.Down; if (updatedLen <= 0) { result = AdjustResult.Error; return(TickPair.NullValue); } else { if (updatedLen < Utility.NoteCloseWidth) { result |= AdjustResult.ShortResult; } result |= AdjustResult.Success; return(updatedTicks); } } else if (updatedLen < space && option.HasFlag(AdjustOption.AllowShift)) { if (updatedTicks.Down < min) { updatedTicks.Down = min; updatedTicks.Up = min + updatedLen; result |= AdjustResult.AdjustedDownTickRight | AdjustResult.AdjustedUpTickRight; } else { updatedTicks.Up = max; updatedTicks.Down = max - updatedLen; result |= AdjustResult.AdjustedDownTickLeft | AdjustResult.AdjustedUpTickLeft; } updatedLen = updatedTicks.Up - updatedTicks.Down; if (updatedLen <= 0) { result = AdjustResult.Error; return(TickPair.NullValue); } else { if (updatedLen < Utility.NoteCloseWidth) { result |= AdjustResult.ShortResult; } result |= AdjustResult.Success; return(updatedTicks); } } else { result = AdjustResult.Error; return(TickPair.NullValue); } } } }