splitClip method

void splitClip(
  1. int index,
  2. Duration localTime, {
  3. bool record = true,
})

Splits clip index at localTime, measured in project time from the clip's start. The second half is inserted right after the first.

Implementation

void splitClip(int index, Duration localTime, {bool record = true}) {
  if (index < 0 || index >= clips.length) return;

  try {
    final clip = clips[index];
    final id = '${clip.id}_split_${DateTime.now().microsecondsSinceEpoch}';
    if (clip.isImage) {
      if (localTime <= Duration.zero || localTime >= clip.duration) return;

      final originalDuration = clip.duration;
      clipController.updateClipTrim(index, Duration.zero, localTime);

      final newClip = clip.copyWith(
        id: id,
        duration: originalDuration - localTime,
        startTime: Duration.zero,
        endTime: originalDuration - localTime,
        clearConvertedVideoFile: true,
      );

      clipController.insertClip(index + 1, newClip);
    } else {
      final clipStart = clip.startTime ?? Duration.zero;
      final actualSplitPointInFile = clipStart + Duration(milliseconds: (localTime.inMilliseconds * clip.playbackSpeed).round());

      if (actualSplitPointInFile <= clipStart || actualSplitPointInFile >= (clip.endTime ?? clip.duration)) {
        return;
      }

      final originalEnd = clip.endTime ?? clip.duration;
      clipController.updateClipTrim(index, clipStart, actualSplitPointInFile);

      final newClip = clip.copyWith(
        id: id,
        startTime: actualSplitPointInFile,
        endTime: originalEnd,
      );
      newClip.markEdited();

      clipController.insertClip(index + 1, newClip);
    }

    _activeTrack = VideoTrackType.clip;
    if (record) {
      _saveState();
      notifyListeners();
    }
  } catch (e) {
    debugPrint('Error splitting clip: $e');
    _setError('Failed to split clip.');
  }
}