void TimelineDock::emitSelectedFromSelection() { if (!m_model.trackList().count()) { if (m_model.tractor()) selectMultitrack(); else emit selected(0); return; } int trackIndex = currentTrack(); int clipIndex = selection().isEmpty()? 0 : selection().first(); QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); if (info && info->producer && info->producer->is_valid()) { m_updateCommand.reset(new Timeline::UpdateCommand(*this, trackIndex, clipIndex, info->start)); // We need to set these special properties so time-based filters // can get information about the cut while still applying filters // to the cut parent. info->producer->set(kFilterInProperty, info->frame_in); info->producer->set(kFilterOutProperty, info->frame_out); info->producer->set(kPlaylistStartProperty, info->start); info->producer->set(kMultitrackItemProperty, QString("%1:%2").arg(clipIndex).arg(trackIndex).toLatin1().constData()); m_ignoreNextPositionChange = true; emit selected(info->producer); } m_model.tractor()->set(kFilterInProperty, 0); m_model.tractor()->set(kFilterOutProperty, m_model.tractor()->get_length() - 1); }
void TimelineDock::trimClipAtPlayhead(TrimLocation location, bool ripple) { int trackIndex = currentTrack(), clipIndex = -1; chooseClipAtPosition(m_position, trackIndex, clipIndex); if (trackIndex < 0 || clipIndex < 0) return; setCurrentTrack(trackIndex); int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (!track) return; QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); if (!info) return; if (location == TrimInPoint) { MAIN.undoStack()->push( new Timeline::TrimClipInCommand(m_model, trackIndex, clipIndex, m_position - info->start, ripple)); if (ripple) setPosition(info->start); if (m_updateCommand && m_updateCommand->trackIndex() == trackIndex && m_updateCommand->clipIndex() == clipIndex) m_updateCommand->setPosition(trackIndex, clipIndex, m_updateCommand->position() + m_position - info->start); } else { MAIN.undoStack()->push( new Timeline::TrimClipOutCommand(m_model, trackIndex, clipIndex, info->start + info->frame_count - m_position, ripple)); if (m_updateCommand && m_updateCommand->trackIndex() == trackIndex && m_updateCommand->clipIndex() == clipIndex) m_updateCommand->setPosition(trackIndex, clipIndex,-1); } }
void TimelineDock::remakeAudioLevels(int trackIndex, int clipIndex, bool force) { if (Settings.timelineShowWaveforms()) { QModelIndex modelIndex = m_model.index(clipIndex, 0, m_model.index(trackIndex)); QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); AudioLevelsTask::start(*info->producer, &m_model, modelIndex, force); } }
int TimelineDock::centerOfClip(int trackIndex, int clipIndex) { Mlt::ClipInfo * clip = getClipInfo(trackIndex, clipIndex); Q_ASSERT(clip); int centerOfClip = clip->start + clip->frame_count / 2; delete clip; clip = 0; return centerOfClip; }
Mlt::Producer *TimelineDock::producerForClip(int trackIndex, int clipIndex) { Mlt::Producer* result = 0; Mlt::ClipInfo* info = getClipInfo(trackIndex, clipIndex); if (info) { result = new Mlt::Producer(info->producer); delete info; } return result; }
void TimelineDock::openClip(int trackIndex, int clipIndex) { Q_ASSERT(trackIndex >= 0 && clipIndex >= 0); QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); if (info) { QString xml = MLT.XML(info->producer); Mlt::Producer* p = new Mlt::Producer(MLT.profile(), "xml-string", xml.toUtf8().constData()); p->set_in_and_out(info->frame_in, info->frame_out); emit clipOpened(p); } }
void TimelineDock::copyClip(int trackIndex, int clipIndex) { Q_ASSERT(trackIndex >= 0 && clipIndex >= 0); QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); if (info) { QString xml = MLT.XML(info->producer); Mlt::Producer p(MLT.profile(), "xml-string", xml.toUtf8().constData()); p.set_speed(0); p.seek(info->frame_in); p.set_in_and_out(info->frame_in, info->frame_out); MLT.setSavedProducer(&p); emit clipCopied(); } }
void TimelineDock::emitClipSelectedFromSelection() { if (selection().isEmpty() || currentTrack() == -1) { emit clipSelected(0); return; } Mlt::ClipInfo* info = getClipInfo(currentTrack(), selection().first()); if (info && info->producer && info->producer->is_valid()) { // We need to set these special properties so time-based filters // can get information about the cut while still applying filters // to the cut parent. info->producer->set(kFilterInProperty, info->frame_in); info->producer->set(kFilterOutProperty, info->frame_out); emit clipSelected(info->producer); MAIN.loadProducerWidget(info->producer); delete info; } }
void TimelineDock::splitClip(int trackIndex, int clipIndex) { if (trackIndex < 0 || clipIndex < 0) chooseClipAtPosition(m_position, &trackIndex, &clipIndex); if (trackIndex < 0 || clipIndex < 0) return; setCurrentTrack(trackIndex); if (clipIndex >= 0 && trackIndex >= 0) { int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); if (!m_model.isTransition(playlist, clipIndex)) { QScopedPointer<Mlt::ClipInfo> info(getClipInfo(trackIndex, clipIndex)); if (info && m_position >= info->start && m_position < info->start + info->frame_count - 1) { MAIN.undoStack()->push( new Timeline::SplitCommand(m_model, trackIndex, clipIndex, m_position)); } } else { MAIN.showStatusMessage(tr("You cannot split a transition.")); } } } }