m_activeTrackBrush = KStatefulBrush(KColorScheme::View, KColorScheme::ActiveBackground, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
- m_pixmapCache = new KPixmapCache("kdenlive-thumbs");
-
m_animationTimer = new QTimeLine(800);
m_animationTimer->setFrameRange(0, 5);
m_animationTimer->setUpdateInterval(100);
qDeleteAll(m_guides);
m_guides.clear();
m_waitingThumbs.clear();
- delete m_pixmapCache;
delete m_animationTimer;
}
m_commandStack->push(command);
} else {
// move and resize clip
+ ClipItem *clip = static_cast<ClipItem *>(item);
QUndoCommand *moveCommand = new QUndoCommand();
moveCommand->setText(i18n("Edit clip"));
if (d.duration() < item->cropDuration() || d.cropStart() != clipInfo.cropStart) {
// duration was reduced, so process it first
clipInfo.endPos = clipInfo.startPos + d.duration();
clipInfo.cropStart = d.cropStart();
- new ResizeClipCommand(this, startInfo, clipInfo, true, false, moveCommand);
+
+ resizeClip(startInfo, clipInfo);
+ new ResizeClipCommand(this, startInfo, clipInfo, false, true, moveCommand);
+ adjustEffects(clip, startInfo, moveCommand);
+ new ResizeClipCommand(this, startInfo, clipInfo, false, true, moveCommand);
}
+
if (d.startPos() != clipInfo.startPos) {
startInfo = clipInfo;
clipInfo.startPos = d.startPos();
clipInfo.endPos = item->endPos() + (clipInfo.startPos - startInfo.startPos);
new MoveClipCommand(this, startInfo, clipInfo, true, moveCommand);
}
+
if (d.duration() > item->cropDuration()) {
// duration was increased, so process it after move
startInfo = clipInfo;
clipInfo.endPos = clipInfo.startPos + d.duration();
clipInfo.cropStart = d.cropStart();
- new ResizeClipCommand(this, startInfo, clipInfo, true, false, moveCommand);
+
+ resizeClip(startInfo, clipInfo);
+ new ResizeClipCommand(this, startInfo, clipInfo, false, true, moveCommand);
+ adjustEffects(clip, startInfo, moveCommand);
+ new ResizeClipCommand(this, startInfo, clipInfo, false, true, moveCommand);
}
updateTrackDuration(clipInfo.track, moveCommand);
m_commandStack->push(moveCommand);
continue;
}
item->initEffect(effect);
+
+ // Old LADSPA filter, deprecated
+ /*
if (effect.attribute("tag") == "ladspa") {
QString ladpsaFile = m_document->getLadspaFile();
initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
effect.setAttribute("src", ladpsaFile);
- }
+ }*/
new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand);
count++;
}
} else {
item->initEffect(effect);
}
-
- if (effect.attribute("tag") == "ladspa") {
+ // Old LADSPA filter, deprecated
+ /* if (effect.attribute("tag") == "ladspa") {
QString ladpsaFile = m_document->getLadspaFile();
initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
effect.setAttribute("src", ladpsaFile);
}
+ */
new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand);
}
}
if (pos < GenTime()) {
// editing a track effect
EffectsParameterList effectParams = getEffectArgs(effect);
- if (effect.attribute("tag") == "ladspa") {
+ // Old LADSPA filter, deprecated
+ /*if (effect.attribute("tag") == "ladspa") {
// Update the ladspa affect file
initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
- }
+ }*/
// check if we are trying to reset a keyframe effect
/*if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
clip->initEffect(effect);
}
EffectsParameterList effectParams = getEffectArgs(effect);
- if (effect.attribute("tag") == "ladspa") {
+ // Old LADSPA filter, deprecated
+ /*if (effect.attribute("tag") == "ladspa") {
// Update the ladspa affect file
initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
- }
+ }*/
// check if we are trying to reset a keyframe effect
if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
clip->initEffect(effect);
if (dup->checkKeyFrames())
slotRefreshEffects(dup);
- updatePanZoom(item);
- updatePanZoom(dup, cutTime - item->startPos());
-
item->baseClip()->addReference();
m_document->updateClip(item->baseClip()->getId());
setDocumentModified();
bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos);
if (success) {
item->resizeEnd((int) info.endPos.frames(m_document->fps()));
-
- updatePanZoom(item);
-
setDocumentModified();
} else {
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
clip->updateItem();
ItemInfo clipinfo = clip->info();
// We add a move clip command so that we get the correct producer for new track number
- if (clip->clipType() == AV || clip->clipType() == AUDIO) {
+ if (clip->clipType() == AV || clip->clipType() == AUDIO || clip->clipType() == PLAYLIST) {
Mlt::Producer *prod = clip->getProducer(clipinfo.track);
- if (!m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod)) {
+ if (prod == NULL || !m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod)) {
emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage);
}
}
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
+ int trackProducer = info.track;
info.track = m_document->tracksCount() - info.track;
adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup);
- m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(info.track), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
+ m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(trackProducer), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
for (int i = 0; i < clip->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
}
else if (xml.hasAttribute("video_only")) item->setVideoOnly(true);
scene()->addItem(item);
+ int producerTrack = info.track;
int tracknumber = m_document->tracksCount() - info.track - 1;
bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
if (isLocked) item->setItemLocked(true);
baseclip->addReference();
m_document->updateClip(baseclip->getId());
info.track = m_document->tracksCount() - info.track;
- m_document->renderer()->mltInsertClip(info, xml, item->getProducer(info.track), overwrite, push);
+ m_document->renderer()->mltInsertClip(info, xml, item->getProducer(producerTrack), overwrite, push);
for (int i = 0; i < item->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(item->effectAt(i)), false);
}
void CustomTrackView::slotUpdateClip(const QString &clipId, bool reload)
{
QList<QGraphicsItem *> list = scene()->items();
+ QList <ClipItem *>clipList;
ClipItem *clip = NULL;
for (int i = 0; i < list.size(); ++i) {
if (list.at(i)->type() == AVWIDGET) {
clip = static_cast <ClipItem *>(list.at(i));
if (clip->clipProducer() == clipId) {
ItemInfo info = clip->info();
- info.track = m_document->tracksCount() - clip->track();
- if (reload && !m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer(info.track))) {
+ Mlt::Producer *prod = NULL;
+ if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track);
+ else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
+ else prod = clip->baseClip()->producer(info.track);
+ if (reload && !m_document->renderer()->mltUpdateClip(info, clip->xml(), prod)) {
emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage);
}
- clip->refreshClip(true, true);
+ else clipList.append(clip);
}
}
}
+ for (int i = 0; i < clipList.count(); i++)
+ clipList.at(i)->refreshClip(true, true);
}
ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track)
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
+ int trackProducer = info.track;
info.track = m_document->tracksCount() - info.track;
- m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(info.track));
+ m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(trackProducer));
for (int i = 0; i < clip->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
}
ItemInfo clipinfo = item->info();
clipinfo.track = m_document->tracksCount() - clipinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(clipinfo, end.startPos - clipinfo.startPos);
- if (success) {
- kDebug() << "RESIZE CLP STRAT TO:" << end.startPos.frames(m_document->fps()) << ", OLD ST: " << start.startPos.frames(25);
+ if (success)
item->resizeStart((int) end.startPos.frames(m_document->fps()));
-// updatePositionEffects(item, clipinfo);
- } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+ else
+ emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
} else {
ItemInfo clipinfo = item->info();
clipinfo.track = m_document->tracksCount() - clipinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, end.endPos - clipinfo.startPos);
- if (success) {
+ if (success)
item->resizeEnd((int) end.endPos.frames(m_document->fps()));
-// updatePositionEffects(item, clipinfo);
- } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+ else
+ emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
}
if (!resizeClipStart && end.cropStart != start.cropStart) {
kDebug() << "// RESIZE CROP, DIFF: " << (end.cropStart - start.cropStart).frames(25);
// If we are in overwrite mode, always allow the move
return true;
}
- QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double)(m_tracksHeight - 1));
+ int height = m_tracksHeight - 2;
+ int offset = 0;
+ if (type == TRANSITIONWIDGET) {
+ height = Transition::itemHeight();
+ offset = Transition::itemOffset();
+ }
+ else if (type == AVWIDGET) {
+ height = ClipItem::itemHeight();
+ offset = ClipItem::itemOffset();
+ }
+ QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1 + offset), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double) height);
QList<QGraphicsItem *> collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect);
for (int i = 0; i < collisions.count(); i++) {
- if (collisions.at(i)->type() == type) return false;
+ if (collisions.at(i)->type() == type) {
+ return false;
+ }
}
return true;
}
if (itemList.at(i)->type() == TRANSITIONWIDGET) {
transitionitem = static_cast <Transition*>(itemList.at(i));
transitionXml = transitionitem->toXML();
+ // luma files in transitions can be in "resource" or "luma" property
QString luma = EffectsList::parameter(transitionXml, "luma");
- if (!luma.isEmpty()) urls << luma;
+ if (luma.isEmpty()) luma = EffectsList::parameter(transitionXml, "resource");
+ if (!luma.isEmpty()) urls << KUrl(luma).path();
}
}
+#if QT_VERSION >= 0x040500
+ urls.removeDuplicates();
+#endif
return urls;
}
} else {
if (e.attribute("factor", "1") != "1") {
double fact;
- if (e.attribute("factor").startsWith('%')) {
+ if (e.attribute("factor").contains('%')) {
fact = ProfilesDialog::getStringEval(m_document->mltProfile(), e.attribute("factor"));
} else fact = e.attribute("factor", "1").toDouble();
parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
return parameters;
}
-void CustomTrackView::updatePanZoom(ClipItem* item, GenTime cutPos)
-{
- QList <int> effects = item->updatePanZoom(m_document->width(), m_document->height(), cutPos.frames(m_document->fps()));
-
- for (int i = 0; i < effects.count(); ++i) {
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(item->effectAt(effects.at(i)))))
- emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
-
- // if effect is displayed, update the effect edit widget with new clip duration
- /*if (item->isSelected() && effects.at(i) == item->selectedEffectIndex())
- emit clipItemSelected(item, effects.at(i));*/
- }
- // update always, otherwise there might problems when resizing groups
- if (effects.count())
- emit clipItemSelected(item, item->selectedEffectIndex());
-}
-
void CustomTrackView::updateTrackNames(int track, bool added)
{
QList <TrackInfo> tracks = m_document->tracksList();
}
}
}
+
+