splitClip method
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.');
}
}