#include "docclipbase.h"
#include "clipitem.h"
#include "definitions.h"
-#include "moveclipcommand.h"
-#include "movetransitioncommand.h"
-#include "resizeclipcommand.h"
-#include "editguidecommand.h"
-#include "addtimelineclipcommand.h"
-#include "addeffectcommand.h"
-#include "editeffectcommand.h"
-#include "moveeffectcommand.h"
-#include "addtransitioncommand.h"
-#include "edittransitioncommand.h"
-#include "editkeyframecommand.h"
-#include "changespeedcommand.h"
-#include "addmarkercommand.h"
-#include "razorclipcommand.h"
+#include "commands/moveclipcommand.h"
+#include "commands/movetransitioncommand.h"
+#include "commands/resizeclipcommand.h"
+#include "commands/editguidecommand.h"
+#include "commands/addtimelineclipcommand.h"
+#include "commands/addeffectcommand.h"
+#include "commands/editeffectcommand.h"
+#include "commands/moveeffectcommand.h"
+#include "commands/addtransitioncommand.h"
+#include "commands/edittransitioncommand.h"
+#include "commands/editkeyframecommand.h"
+#include "commands/changespeedcommand.h"
+#include "commands/addmarkercommand.h"
+#include "commands/razorclipcommand.h"
#include "kdenlivesettings.h"
#include "transition.h"
#include "clipmanager.h"
#include "ui_keyframedialog_ui.h"
#include "clipdurationdialog.h"
#include "abstractgroupitem.h"
-#include "insertspacecommand.h"
+#include "commands/insertspacecommand.h"
#include "spacerdialog.h"
-#include "addtrackcommand.h"
-#include "movegroupcommand.h"
+#include "commands/addtrackcommand.h"
+#include "commands/movegroupcommand.h"
#include "ui_addtrack_ui.h"
#include "initeffects.h"
-#include "locktrackcommand.h"
-#include "groupclipscommand.h"
-#include "splitaudiocommand.h"
-#include "changecliptypecommand.h"
+#include "commands/locktrackcommand.h"
+#include "commands/groupclipscommand.h"
+#include "commands/splitaudiocommand.h"
+#include "commands/changecliptypecommand.h"
#include "trackdialog.h"
#include "tracksconfigdialog.h"
-#include "configtrackscommand.h"
-#include "rebuildgroupcommand.h"
-#include "razorgroupcommand.h"
+#include "commands/configtrackscommand.h"
+#include "commands/rebuildgroupcommand.h"
+#include "commands/razorgroupcommand.h"
#include "profilesdialog.h"
#include <KDebug>
// razor tool over a clip, display current frame in monitor
if (false && !m_blockRefresh && item->type() == AVWIDGET) {
//TODO: solve crash when showing frame when moving razor over clip
- emit showClipFrame(((ClipItem *) item)->baseClip(), QPoint(), mappedXPos - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
+ emit showClipFrame(((ClipItem *) item)->baseClip(), QPoint(), false, mappedXPos - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
}
event->accept();
return;
//item->updateKeyframeEffect();
//QString next = item->keyframes(item->selectedEffectIndex());
QDomElement newEffect = item->selectedEffect().cloneNode().toElement();
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false);
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false, false);
//EditKeyFrameCommand *command = new EditKeyFrameCommand(this, m_dragItem->track(), m_dragItem->startPos(), item->selectedEffectIndex(), previous, next, false);
m_commandStack->push(command);
updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
void CustomTrackView::dragEnterEvent(QDragEnterEvent * event)
{
if (insertDropClips(event->mimeData(), event->pos())) {
- event->acceptProposedAction();
+ if (event->source() == this) {
+ event->setDropAction(Qt::MoveAction);
+ event->accept();
+ } else {
+ event->setDropAction(Qt::MoveAction);
+ event->acceptProposedAction();
+ }
} else QGraphicsView::dragEnterEvent(event);
}
if (pos < GenTime()) {
// Add track effect
if (effect.attribute("id") == "speed") {
- // TODO: uncomment after 0.8.2 release
- // emit displayMessage(i18n("Cannot add speed effect to track"));
+ emit displayMessage(i18n("Cannot add speed effect to track"), ErrorMessage);
return;
}
clearSelection();
if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
else effectName = i18n("effect");
effectCommand->setText(i18n("Add %1", effectName));
- int count = 0;
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
- if (effect.attribute("type") == "audio") {
- // Don't add audio effects on video clips
- if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) continue;
- } else if (effect.hasAttribute("type") == false) {
- // Don't add video effect on audio clips
- if (item->isAudioOnly() || item->clipType() == AUDIO) continue;
- }
-
- if (effect.attribute("unique", "0") != "0" && item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1) {
- emit displayMessage(i18n("Effect already present in clip"), ErrorMessage);
- continue;
- }
- if (item->isItemLocked()) {
- continue;
- }
- item->initEffect(effect);
-
- new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand);
- count++;
+ if (effect.tagName() == "effectgroup") {
+ QDomNodeList effectlist = effect.elementsByTagName("effect");
+ for (int j = 0; j < effectlist.count(); j++) {
+ processEffect(item, effectlist.at(j).toElement(), effectCommand);
+ }
+ }
+ else {
+ processEffect(item, effect, effectCommand);
+ }
}
}
- if (count > 0) {
+ if (effectCommand->childCount() > 0) {
m_commandStack->push(effectCommand);
setDocumentModified();
} else delete effectCommand;
}
+void CustomTrackView::slotAddEffect(ClipItem *clip, QDomElement effect)
+{
+ if (clip) slotAddEffect(effect, clip->startPos(), clip->track());
+}
+
void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
{
QList<QGraphicsItem *> itemList;
QUndoCommand *effectCommand = new QUndoCommand();
QString effectName;
- QDomElement namenode = effect.firstChildElement("name");
- if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
- else effectName = i18n("effect");
+ if (effect.tagName() == "effectgroup") {
+ effectName = effect.attribute("name");
+ } else {
+ QDomElement namenode = effect.firstChildElement("name");
+ if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
+ else effectName = i18n("effect");
+ }
effectCommand->setText(i18n("Add %1", effectName));
if (track == -1) itemList = scene()->selectedItems();
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
- if (effect.attribute("type") == "audio") {
- // Don't add audio effects on video clips
- if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) {
- /* do not show error message when item is part of a group as the user probably knows what he does then
- * and the message is annoying when working with the split audio feature */
- if (!item->parentItem() || item->parentItem() == m_selectionGroup)
- emit displayMessage(i18n("Cannot add an audio effect to this clip"), ErrorMessage);
- continue;
- }
- } else if (effect.attribute("type") == "video" || !effect.hasAttribute("type")) {
- // Don't add video effect on audio clips
- if (item->isAudioOnly() || item->clipType() == AUDIO) {
- /* do not show error message when item is part of a group as the user probably knows what he does then
- * and the message is annoying when working with the split audio feature */
- if (!item->parentItem() || item->parentItem() == m_selectionGroup)
- emit displayMessage(i18n("Cannot add a video effect to this clip"), ErrorMessage);
- continue;
- }
- }
- if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") {
- emit displayMessage(i18n("Effect already present in clip"), ErrorMessage);
- continue;
- }
- if (item->isItemLocked()) {
- continue;
- }
-
- if (effect.attribute("id") == "freeze" && m_cursorPos > item->startPos().frames(m_document->fps()) && m_cursorPos < item->endPos().frames(m_document->fps())) {
- item->initEffect(effect, m_cursorPos - item->startPos().frames(m_document->fps()));
- } else {
- item->initEffect(effect);
- }
- new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand);
+ if (effect.tagName() == "effectgroup") {
+ QDomNodeList effectlist = effect.elementsByTagName("effect");
+ for (int j = 0; j < effectlist.count(); j++) {
+ processEffect(item, effectlist.at(j).toElement(), effectCommand);
+ }
+ }
+ else processEffect(item, effect, effectCommand);
}
}
if (effectCommand->childCount() > 0) {
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *clip = static_cast<ClipItem *>(itemList.at(i));
+ clip->setSelectedEffect(clip->effectsCount() - 1);
if (!clip->isSelected()) {
- clearSelection();
+ clearSelection(false);
clip->setSelected(true);
+ emit clipItemSelected(clip, clip->selectedEffectIndex());
}
- clip->setSelectedEffect(clip->effectsCount() - 1);
- emit clipItemSelected(clip, clip->effectsCount() - 1);
break;
}
}
} else delete effectCommand;
}
+void CustomTrackView::processEffect(ClipItem *item, QDomElement effect, QUndoCommand *effectCommand)
+{
+ if (effect.attribute("type") == "audio") {
+ // Don't add audio effects on video clips
+ if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) {
+ /* do not show error message when item is part of a group as the user probably knows what he does then
+ * and the message is annoying when working with the split audio feature */
+ if (!item->parentItem() || item->parentItem() == m_selectionGroup)
+ emit displayMessage(i18n("Cannot add an audio effect to this clip"), ErrorMessage);
+ return;
+ }
+ } else if (effect.attribute("type") == "video" || !effect.hasAttribute("type")) {
+ // Don't add video effect on audio clips
+ if (item->isAudioOnly() || item->clipType() == AUDIO) {
+ /* do not show error message when item is part of a group as the user probably knows what he does then
+ * and the message is annoying when working with the split audio feature */
+ if (!item->parentItem() || item->parentItem() == m_selectionGroup)
+ emit displayMessage(i18n("Cannot add a video effect to this clip"), ErrorMessage);
+ return;
+ }
+ }
+ if (effect.attribute("unique", "0") != "0" && item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1) {
+ emit displayMessage(i18n("Effect already present in clip"), ErrorMessage);
+ return;
+ }
+ if (item->isItemLocked()) {
+ return;
+ }
+
+ if (effect.attribute("id") == "freeze" && m_cursorPos > item->startPos().frames(m_document->fps()) && m_cursorPos < item->endPos().frames(m_document->fps())) {
+ item->initEffect(effect, m_cursorPos - item->startPos().frames(m_document->fps()));
+ } else {
+ item->initEffect(effect);
+ }
+ new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true, effectCommand);
+}
+
void CustomTrackView::slotDeleteEffect(ClipItem *clip, int track, QDomElement effect, bool affectGroup)
{
if (clip == NULL) {
setDocumentModified();
}
-void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedEffect, int ix, bool triggeredByUser)
+void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedEffect, int ix, bool updateEffectStack)
{
if (insertedEffect.isNull()) {
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
return;
}
QDomElement effect = insertedEffect.cloneNode().toElement();
- //kDebug() << "// update effect ix: " << effect.attribute("kdenlive_ix")<<", TRACK: "<<track;
+ //kDebug() << "// update effect ix: " << effect.attribute("kdenlive_ix")<<", GAIN: "<<EffectsList::parameter(effect, "gain");
if (pos < GenTime()) {
// editing a track effect
EffectsParameterList effectParams = getEffectArgs(effect);
if (strobe == 0) strobe = 1;
doChangeClipSpeed(clip->info(), clip->speedIndependantInfo(), speed, clip->speed(), strobe, clip->baseClip()->getId());
}
- clip->setEffectAt(ix, effect);
- if (ix == clip->selectedEffectIndex()) {
- clip->setSelectedEffect(ix);
- if (!triggeredByUser)
- emit clipItemSelected(clip, ix);
- }
+ clip->updateEffect(effect);
+ if (updateEffectStack && clip->isSelected())
+ emit clipItemSelected(clip, ix);
+ if (ix == clip->selectedEffectIndex()) {
+ // make sure to update display of clip keyframes
+ clip->setSelectedEffect(ix);
+ } else emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
return;
}
clip->setFadeOut(pos);
}
}
+ bool success = m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams);
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams))
- emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
-
- clip->setEffectAt(ix, effect);
- if (ix == clip->selectedEffectIndex()) {
- clip->setSelectedEffect(ix);
- if (!triggeredByUser)
- emit clipItemSelected(clip, ix);
- }
+ if (success) {
+ clip->updateEffect(effect);
+ if (updateEffectStack && clip->isSelected()) {
+ emit clipItemSelected(clip, ix);
+ }
+ if (ix == clip->selectedEffectIndex()) {
+ // make sure to update display of clip keyframes
+ clip->setSelectedEffect(ix);
+ }
+ }
+ else emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
}
+ else emit displayMessage(i18n("Cannot find clip to update effect"), ErrorMessage);
setDocumentModified();
}
{
if (pos < GenTime()) {
// Moving track effect
- QDomElement act = m_document->getTrackEffect(m_document->tracksCount() - track - 1, newPos - 1);
- QDomElement before = m_document->getTrackEffect(m_document->tracksCount() - track - 1, oldPos - 1);
-
+ if (newPos > m_document->getTrackEffects(m_document->tracksCount() - track - 1).count()) {
+ newPos = m_document->getTrackEffects(m_document->tracksCount() - track - 1).count();
+ }
+ QDomElement act = m_document->getTrackEffect(m_document->tracksCount() - track - 1, newPos);
+ QDomElement before = m_document->getTrackEffect(m_document->tracksCount() - track - 1, oldPos);
if (!act.isNull() && !before.isNull()) {
- m_document->setTrackEffect(m_document->tracksCount() - track - 1, oldPos - 1, act);
- m_document->setTrackEffect(m_document->tracksCount() - track - 1, newPos - 1, before);
+ //m_document->setTrackEffect(m_document->tracksCount() - track - 1, oldPos, act);
+ m_document->setTrackEffect(m_document->tracksCount() - track - 1, newPos, before);
m_document->renderer()->mltMoveEffect(m_document->tracksCount() - track, pos, oldPos, newPos);
emit showTrackEffects(m_document->tracksCount() - track, m_document->trackInfoAt(m_document->tracksCount() - track - 1));
} else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
return;
}
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
- if (clip && !clip->effectAt(newPos - 1).isNull() && !clip->effectAt(oldPos - 1).isNull()) {
- QDomElement act = clip->effectAt(newPos - 1);
- QDomElement before = clip->effectAt(oldPos - 1);
- clip->setEffectAt(oldPos - 1, act);
- clip->setEffectAt(newPos - 1, before);
+ if (newPos > clip->effectsCount()) {
+ newPos = clip->effectsCount();
+ }
+ if (clip) {
+ QDomElement act = clip->effectAt(newPos);
+ QDomElement before = clip->effectAt(oldPos);
+ if (act.isNull() || before.isNull()) {
+ emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
+ return;
+ }
+ //clip->moveEffect(act, oldPos);
+ clip->moveEffect(before, newPos);
// special case: speed effect, which is a pseudo-effect, not appearing in MLT's effects
if (act.attribute("id") == "speed") {
m_document->renderer()->mltUpdateEffectPosition(track, pos, oldPos, newPos);
} else if (before.attribute("id") == "speed") {
m_document->renderer()->mltUpdateEffectPosition(track, pos, newPos, oldPos);
} else m_document->renderer()->mltMoveEffect(track, pos, oldPos, newPos);
- emit clipItemSelected(clip, newPos - 1);
+ emit clipItemSelected(clip, newPos);
setDocumentModified();
} else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
}
if (clip == NULL) {
// editing track effect
- command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldEffect, effect, effectPos, true);
+ command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldEffect, effect, effectPos, false, true);
} else {
- command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
+ command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, false, true);
}
m_commandStack->push(command);
setDocumentModified();;
setDocumentModified();
}
-void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, int track, QDomElement oldeffect, QDomElement effect, int ix)
+void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, int track, QDomElement oldeffect, QDomElement effect, int ix, bool refreshEffectStack)
{
EditEffectCommand *command;
- if (clip) command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
- else command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldeffect, effect, ix, true);
+ if (clip) command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, refreshEffectStack, true);
+ else command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldeffect, effect, ix, refreshEffectStack, true);
m_commandStack->push(command);
}
QDomElement effect = clip->getEffectAt(ix);
QDomElement oldeffect = effect.cloneNode().toElement();
effect.setAttribute("region", region);
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true, true);
m_commandStack->push(command);
}
//item->updateKeyframeEffect();
//QString next = item->keyframes(item->selectedEffectIndex());
//EditKeyFrameCommand *command = new EditKeyFrameCommand(this, item->track(), item->startPos(), item->selectedEffectIndex(), previous, next, false);
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false);
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false, false);
m_commandStack->push(command);
updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage);
kDebug()<<"CANNOT REMOVE: "<<info.startPos.frames(m_document->fps())<<", TK: "<<info.track;
//m_document->renderer()->saveSceneList(QString("/tmp/error%1.mlt").arg(m_ct), QDomElement());
- exit(1);
return;
}
m_waitingThumbs.removeAll(item);
+ item->stopThumbs();
if (item->isSelected()) emit clipItemSelected(NULL);
item->baseClip()->removeReference();
m_document->updateClip(item->baseClip()->getId());
m_commandStack->push(deleteSelected);
}
-void CustomTrackView::changeClipSpeed()
-{
- // TODO: remove after string freeze
- QList<QGraphicsItem *> itemList = scene()->selectedItems();
- if (itemList.count() == 0) {
- emit displayMessage(i18n("Select clip to change speed"), ErrorMessage);
- return;
- }
- QUndoCommand *changeSelected = new QUndoCommand();
- changeSelected->setText("Edit clip speed");
- int count = 0;
- int percent = -1;
- bool ok;
- for (int i = 0; i < itemList.count(); i++) {
- if (itemList.at(i)->type() == AVWIDGET) {
- ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
- if (percent == -1) percent = QInputDialog::getInteger(this, i18n("Edit Clip Speed"), i18n("New speed (percents)"), item->speed() * 100, 1, 10000, 1, &ok);
- if (!ok) break;
- double speed = (double) percent / 100.0;
- if (item->speed() != speed && (item->clipType() == VIDEO || item->clipType() == AV)) {
- count++;
- //new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), changeSelected);
- }
- }
- }
- if (count > 0) m_commandStack->push(changeSelected);
- else delete changeSelected;
-}
void CustomTrackView::doChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, const double speed, const double oldspeed, int strobe, const QString &id)
{
emit displayMessage(i18n("Waiting for clip..."), InformationMessage);
emit forceClipProcessing(clipId);
qApp->processEvents();
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 10; i++) {
if (baseclip->getProducer() == NULL) {
- m_producerNotReady.wait(&m_mutex, 500 + 500 * i);
+ qApp->processEvents();
+ m_producerNotReady.wait(&m_mutex, 200);
} else break;
}
if (baseclip->getProducer() == NULL) {
Transition *CustomTrackView::getTransitionItemAt(int pos, int track)
{
- const QPointF p(pos, (track + 1) * m_tracksHeight);
+ const QPointF p(pos, track * m_tracksHeight + Transition::itemOffset() + 1);
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); i++) {
Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track)
{
int framepos = (int)(pos.frames(m_document->fps()));
- const QPointF p(framepos - 1, (track + 1) * m_tracksHeight);
+ const QPointF p(framepos - 1, track * m_tracksHeight + Transition::itemOffset() + 1);
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); i++) {
Transition *CustomTrackView::getTransitionItemAtStart(GenTime pos, int track)
{
- const QPointF p(pos.frames(m_document->fps()), (track + 1) * m_tracksHeight);
+ const QPointF p(pos.frames(m_document->fps()), track * m_tracksHeight + Transition::itemOffset() + 1);
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); ++i) {
for (int i = 0; i < clips.count(); ++i) {
if (clips.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast < ClipItem *>(clips.at(i));
- for (int j = 0; j < clip->effectsCount(); j++) {
+ for (int j = 1; j <= clip->effectsCount(); j++) {
QDomElement eff = clip->effectAt(j);
if (eff.attribute("unique", "0") == "0" || item->hasEffect(eff.attribute("tag"), eff.attribute("id")) == -1) {
adjustKeyfames(clip->cropStart(), item->cropStart(), item->cropDuration(), eff);
info.duration = 0;
info.isMute = false;
info.isLocked = false;
+ info.effectsList = EffectsList(true);
if (d.video_track->isChecked()) {
info.type = VIDEOTRACK;
info.isBlind = false;
viewport()->update();
}
+void CustomTrackView::slotSelectClipsInTrack()
+{
+ QRectF rect(0, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 1);
+ QList<QGraphicsItem *> selection = m_scene->items(rect);
+ m_scene->clearSelection();
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET) {
+ selection.at(i)->setSelected(true);
+ }
+ }
+ resetSelectionGroup();
+ groupSelectedItems();
+}
+
+void CustomTrackView::slotSelectAllClips()
+{
+ QList<QGraphicsItem *> selection = m_scene->items();
+ m_scene->clearSelection();
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET) {
+ selection.at(i)->setSelected(true);
+ }
+ }
+ resetSelectionGroup();
+ groupSelectedItems();
+}
+
void CustomTrackView::selectClip(bool add, bool group, int track, int pos)
{
QRectF rect;
if (!luma.isEmpty()) urls << KUrl(luma).path();
}
}
-#if QT_VERSION >= 0x040500
urls.removeDuplicates();
-#endif
return urls;
}
splitAudio();
}
-void CustomTrackView::clearSelection()
+void CustomTrackView::clearSelection(bool emitInfo)
{
resetSelectionGroup();
scene()->clearSelection();
m_dragItem = NULL;
- emit clipItemSelected(NULL);
+ if (emitInfo) emit clipItemSelected(NULL);
}
void CustomTrackView::updatePalette()
pen1.setColor(palette().text().color());
m_cursorLine->setPen(pen1);
}
- emit tracksChanged();
}
void CustomTrackView::removeTipAnimation()
void CustomTrackView::slotAddTrackEffect(const QDomElement &effect, int ix)
{
- AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true);
- m_commandStack->push(command);
- setDocumentModified();
+
+ QUndoCommand *effectCommand = new QUndoCommand();
+ QString effectName;
+ if (effect.tagName() == "effectgroup") {
+ effectName = effect.attribute("name");
+ } else {
+ QDomElement namenode = effect.firstChildElement("name");
+ if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
+ else effectName = i18n("effect");
+ }
+ effectCommand->setText(i18n("Add %1", effectName));
+ if (effect.tagName() == "effectgroup") {
+ QDomNodeList effectlist = effect.elementsByTagName("effect");
+ for (int j = 0; j < effectlist.count(); j++) {
+ QDomElement trackeffect = effectlist.at(j).toElement();
+ if (trackeffect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, trackeffect.attribute("tag"), trackeffect.attribute("id")) != -1) {
+ emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+ continue;
+ }
+ new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), trackeffect, true, effectCommand);
+ }
+ }
+ else {
+ if (effect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, effect.attribute("tag"), effect.attribute("id")) != -1) {
+ emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+ delete effectCommand;
+ return;
+ }
+ new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true, effectCommand);
+ }
+
+ if (effectCommand->childCount() > 0) {
+ m_commandStack->push(effectCommand);
+ setDocumentModified();
+ }
+ else delete effectCommand;
}
parameters.addParam("tag", effect.attribute("tag"));
if (effect.hasAttribute("region")) parameters.addParam("region", effect.attribute("region"));
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+ parameters.addParam("kdenlive_info", effect.attribute("kdenlive_info"));
parameters.addParam("id", effect.attribute("id"));
if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
if (effects.count()) {
QMap<int, QDomElement>::const_iterator i = effects.constBegin();
while (i != effects.constEnd()) {
- new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), i.value(), item->effectAt(i.key()), i.key(), false, command);
+ new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), i.value(), item->effectAt(i.key()), i.key(), false, false, command);
+ ++i;
+ }
+ }
+}
+
+
+void CustomTrackView::slotGotFilterJobResults(const QString &/*id*/, int startPos, int track, const QString &filter, stringMap filterParams)
+{
+ ClipItem *clip = getClipItemAt(GenTime(startPos, m_document->fps()), track);
+ if (clip == NULL) {
+ emit displayMessage(i18n("Cannot find clip for effect update %1.", filter), ErrorMessage);
+ return;
+ }
+ QDomElement newEffect;
+ QDomElement effect = clip->getEffectAt(clip->selectedEffectIndex());
+ if (effect.attribute("id") == filter) {
+ newEffect = effect.cloneNode().toElement();
+ QMap<QString, QString>::const_iterator i = filterParams.constBegin();
+ while (i != filterParams.constEnd()) {
+ EffectsList::setParameter(newEffect, i.key(), i.value());
+ kDebug()<<"// RESULT FILTER: "<<i.key()<<"="<< i.value();
++i;
}
+ EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, newEffect, clip->selectedEffectIndex(), true, true);
+ m_commandStack->push(command);
+ emit clipItemSelected(clip, clip->selectedEffectIndex());
}
+
}