cutOutClipRange method

bool cutOutClipRange(
  1. int index,
  2. Duration fileStart,
  3. Duration fileEnd
)

Removes fileStart..fileEnd (file time) from clip index, keeping what lies before and after as two clips. One undo step. Returns false when nothing changed.

Implementation

bool cutOutClipRange(int index, Duration fileStart, Duration fileEnd) {
  if (index < 0 || index >= clips.length) return false;
  final clip = clips[index];
  if (clip.isImage || fileEnd <= fileStart) return false;
  final start = clip.startTime ?? Duration.zero;
  final end = clip.endTime ?? clip.duration;
  final a = fileStart < start ? start : fileStart;
  final b = fileEnd > end ? end : fileEnd;
  if (b <= a) return false;

  const minPiece = Duration(milliseconds: 100);
  final keepBefore = a - start >= minPiece;
  final keepAfter = end - b >= minPiece;
  if (!keepBefore && !keepAfter) {
    removeClip(index);
    return true;
  }
  if (keepBefore) {
    clipController.updateClipTrim(index, start, a);
    if (keepAfter) {
      clipController.insertClip(
        index + 1,
        clip.copyWith(
          id: '${clip.id}_cut_${DateTime.now().microsecondsSinceEpoch}',
          startTime: b,
          endTime: end,
        )..markEdited(),
      );
    }
  } else {
    clipController.updateClipTrim(index, b, end);
  }
  _activeTrack = VideoTrackType.clip;
  if (_currentGlobalTime.value > totalDuration) {
    _currentGlobalTime.value = totalDuration;
  }
  _saveState();
  notifyListeners();
  _updateVideoPlayerForCurrentClip();
  return true;
}