requiresLedgerLine method

List<LedgerLine> requiresLedgerLine(
  1. ChantContext ctxt
)

Implementation

List<LedgerLine> requiresLedgerLine(ChantContext ctxt) {
  dynamic firstAbove = false;
  bool needsAbove = false;
  dynamic firstBelow = false;
  bool needsBelow = false;
  List<LedgerLine> result = [];
  int ledgerLinePositionAbove = ctxt.staffLineCount * 2 + 1;

  if (notes.isEmpty) return result;

  for (var i = 0; i < notes.length; ++i) {
    var note = notes[i];
    var staffPosition = note.staffPosition;
    if (staffPosition >= ledgerLinePositionAbove - 1) {
      needsAbove =
          needsAbove || staffPosition >= ledgerLinePositionAbove - 0.9;
      if (firstAbove == false) {
        firstAbove = (i - 1).clamp(0, double.infinity).toInt();
      }
      if (staffPosition >= ledgerLinePositionAbove) continue;
    } else if (staffPosition <= 0) {
      needsBelow = needsBelow || staffPosition < -0.1;
      if (firstBelow == false) {
        firstBelow = (i - 1).clamp(0, double.infinity).toInt();
      }
      if (staffPosition <= -1) continue;
    }
    if (needsAbove || needsBelow) {
      var endI = i; // Math.abs(staffPosition) >= 4? i : i - 1;
      result.add(
        LedgerLine(
          element:
              notes[(firstAbove != false && firstAbove != 0)
                  ? firstAbove
                  : (firstBelow != false && firstBelow != 0)
                  ? firstBelow
                  : 0],
          endElem: notes[endI],
          staffPosition: needsAbove ? ledgerLinePositionAbove : -1,
        ),
      );
      firstAbove = firstBelow = needsAbove = needsBelow = false;
    }
  }
  if (needsAbove || needsBelow) {
    result.add(
      LedgerLine(
        element:
            notes[(firstAbove != false && firstAbove != 0)
                ? firstAbove
                : (firstBelow != false && firstBelow != 0)
                ? firstBelow
                : 0],
        endElem: notes[notes.length - 1],
        staffPosition: needsAbove ? ledgerLinePositionAbove : -1,
      ),
    );
  }
  return result;
}