applyDeletion method

void applyDeletion({
  1. required int startOffset,
  2. required int endOffset,
})

Implementation

void applyDeletion({required int startOffset, required int endOffset}) {
  final range = _normalizedOffsets(startOffset, endOffset);
  final deleteStart = range.start;
  final deleteEnd = range.end;
  final length = deleteEnd - deleteStart;
  if (length <= 0) {
    return;
  }

  final toDelete = <int>[];
  for (final entry in _extmarks.entries.toList(growable: false)) {
    final extmark = entry.value;
    if (extmark.endOffset <= deleteStart) {
      continue;
    }

    if (extmark.startOffset >= deleteEnd) {
      _extmarks[entry.key] = TextExtmark(
        id: extmark.id,
        type: extmark.type,
        startOffset: extmark.startOffset - length,
        endOffset: extmark.endOffset - length,
        virtual: extmark.virtual,
        styleKey: extmark.styleKey,
        priority: extmark.priority,
        data: extmark.data,
      );
      continue;
    }

    if (extmark.startOffset >= deleteStart &&
        extmark.endOffset <= deleteEnd) {
      toDelete.add(entry.key);
      continue;
    }

    if (extmark.startOffset < deleteStart && extmark.endOffset > deleteEnd) {
      _extmarks[entry.key] = TextExtmark(
        id: extmark.id,
        type: extmark.type,
        startOffset: extmark.startOffset,
        endOffset: extmark.endOffset - length,
        virtual: extmark.virtual,
        styleKey: extmark.styleKey,
        priority: extmark.priority,
        data: extmark.data,
      );
      continue;
    }

    if (extmark.startOffset < deleteStart &&
        extmark.endOffset > deleteStart) {
      _extmarks[entry.key] = TextExtmark(
        id: extmark.id,
        type: extmark.type,
        startOffset: extmark.startOffset,
        endOffset: deleteStart,
        virtual: extmark.virtual,
        styleKey: extmark.styleKey,
        priority: extmark.priority,
        data: extmark.data,
      );
      continue;
    }

    if (extmark.startOffset < deleteEnd && extmark.endOffset > deleteEnd) {
      _extmarks[entry.key] = TextExtmark(
        id: extmark.id,
        type: extmark.type,
        startOffset: deleteStart,
        endOffset: extmark.endOffset - length,
        virtual: extmark.virtual,
        styleKey: extmark.styleKey,
        priority: extmark.priority,
        data: extmark.data,
      );
    }
  }

  for (final id in toDelete) {
    delete(id);
  }
}