#include <KUrl>
#include <KIcon>
#include <KCursor>
-#include <KColorScheme>
#include <KMessageBox>
#include <KIO/NetAccess>
m_menuPosition(),
m_blockRefresh(false),
m_selectionGroup(NULL),
- m_selectedTrack(0)
+ m_selectedTrack(0),
+ m_controlModifier(false)
{
if (doc) m_commandStack = doc->commandStack();
else m_commandStack = NULL;
setLineWidth(0);
//setCacheMode(QGraphicsView::CacheBackground);
//setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+ setAutoFillBackground(false);
setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
-
+ m_activeTrackBrush = KStatefulBrush(KColorScheme::View, KColorScheme::ActiveBackground, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
pixmapCache = new KPixmapCache("kdenlive-thumbs");
KdenliveSettings::setTrackheight(m_tracksHeight);
m_animationTimer = new QTimeLine(800);
}
}
double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight);
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight - 1);
for (int i = 0; i < m_guides.count(); i++) {
QLineF l = m_guides.at(i)->line();
}
} else if (m_operationMode == RESIZESTART && move) {
m_document->renderer()->pause();
- if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent)
parent->resizeStart((int)(snappedPos) - m_dragItemInfo.startPos.frames(m_document->fps()));
}
} else if (m_operationMode == RESIZEEND && move) {
m_document->renderer()->pause();
- if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent)
parent->resizeEnd((int)(snappedPos) - m_dragItemInfo.endPos.frames(m_document->fps()));
m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
+ m_controlModifier = (event->modifiers() == Qt::ControlModifier);
// Update snap points
if (m_selectionGroup == NULL) {
void CustomTrackView::rebuildGroup(AbstractGroupItem *group)
{
if (group) {
+ resetSelectionGroup(false);
+ m_scene->clearSelection();
+
QList <QGraphicsItem *> children = group->childItems();
m_document->clipManager()->removeGroup(group);
scene()->destroyItemGroup(group);
void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
{
+ if (pos < GenTime()) {
+ // Add track effect
+ m_document->addTrackEffect(track - 1, effect);
+ m_document->renderer()->mltAddTrackEffect(track, getEffectArgs(effect));
+ emit updateTrackEffectState(track - 1);
+ emit showTrackEffects(track, m_document->trackInfoAt(track - 1));
+ return;
+ }
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip) {
// Special case: speed effect
void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect)
{
QString index = effect.attribute("kdenlive_ix");
+ if (pos < GenTime()) {
+ // Delete track effect
+ m_document->removeTrackEffect(track - 1, effect);
+ m_document->renderer()->mltRemoveTrackEffect(track, index, true);
+ emit updateTrackEffectState(track - 1);
+ emit showTrackEffects(track, m_document->trackInfoAt(track - 1));
+ return;
+ }
// Special case: speed effect
if (effect.attribute("id") == "speed") {
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
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)) {
- emit displayMessage(i18n("Cannot add an audio effect to this clip"), ErrorMessage);
+ /* 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.hasAttribute("type") == false) {
+ } else if (effect.attribute("type") == "video" || !effect.hasAttribute("type")) {
// Don't add video effect on audio clips
if (item->isAudioOnly() || item->clipType() == AUDIO) {
- emit displayMessage(i18n("Cannot add a video effect to this clip"), ErrorMessage);
+ /* 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->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);
+ } else {
+ item->initEffect(effect);
+ }
+
if (effect.attribute("tag") == "ladspa") {
QString ladpsaFile = m_document->getLadspaFile();
initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
} else delete effectCommand;
}
-void CustomTrackView::slotDeleteEffect(ClipItem *clip, QDomElement effect, bool affectGroup)
+void CustomTrackView::slotDeleteEffect(ClipItem *clip, int track, QDomElement effect, bool affectGroup)
{
+ if (clip == NULL) {
+ // delete track effect
+ AddEffectCommand *command = new AddEffectCommand(this, track, GenTime(-1), effect, false);
+ m_commandStack->push(command);
+ setDocumentModified();
+ return;
+ }
if (affectGroup && clip->parentItem() && clip->parentItem() == m_selectionGroup) {
//clip is in a group, also remove the effect in other clips of the group
QList<QGraphicsItem *> items = m_selectionGroup->childItems();
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
return;
}
- ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
QDomElement effect = insertedEffect.cloneNode().toElement();
+ //kDebug() << "// update effect ix: " << effect.attribute("kdenlive_ix")<<", TRACK: "<<track;
+ if (pos < GenTime()) {
+ // editing a track effect
+ EffectsParameterList effectParams = getEffectArgs(effect);
+ 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);
+ effectParams = getEffectArgs(effect);
+ }
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - track, pos, effectParams))
+ emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ m_document->setTrackEffect(m_document->tracksCount() - track - 1, ix, effect);
+ emit updateTrackEffectState(track);
+ setDocumentModified();
+ return;
+
+ }
+ ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip) {
// Special case: speed effect
if (effect.attribute("id") == "speed") {
void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos)
{
+ 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 (!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->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);
} else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
}
-void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable)
+void CustomTrackView::slotChangeEffectState(ClipItem *clip, int track, int effectPos, bool disable)
{
- QDomElement effect = clip->effectAt(effectPos);
+ EditEffectCommand *command;
+ QDomElement effect;
+ if (clip == NULL) effect = m_document->getTrackEffect(track - 1, effectPos);
+ else effect = clip->effectAt(effectPos);
QDomElement oldEffect = effect.cloneNode().toElement();
-
effect.setAttribute("disable", (int) disable);
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
+
+
+ if (clip == NULL) {
+ // editing track effect
+ command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldEffect, effect, effectPos, true);
+ } else {
+ command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
+ }
m_commandStack->push(command);
setDocumentModified();;
}
-void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos)
+void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int track, int currentPos, int newPos)
{
- MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
+ MoveEffectCommand *command;
+ if (clip == NULL) {
+ // editing track effect
+ command = new MoveEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), currentPos, newPos);
+ } else command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
m_commandStack->push(command);
setDocumentModified();
}
-void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect, int ix)
+void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, int track, QDomElement oldeffect, QDomElement effect, int ix)
{
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
+ 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);
m_commandStack->push(command);
}
slotRefreshEffects(item);
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);
return;
}
bool force = false;
- if (oldTransition.attribute("transition_atrack") != transition.attribute("transition_atrack") || oldTransition.attribute("transition_btrack") != transition.attribute("transition_btrack")) force = true;
+ if (oldTransition.attribute("transition_atrack") != transition.attribute("transition_atrack") || oldTransition.attribute("transition_btrack") != transition.attribute("transition_btrack"))
+ force = true;
m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition, force);
//kDebug() << "ORIGINAL TRACK: "<< oldTransition.attribute("transition_btrack") << ", NEW TRACK: "<<transition.attribute("transition_btrack");
item->setTransitionParameters(transition);
m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
if (items.count() > 1) groupSelectedItems(true);
+ else if (items.count() == 1) m_dragItem = static_cast <ClipItem *>(items.at(0));
event->setDropAction(Qt::MoveAction);
event->accept();
} else QGraphicsView::dropEvent(event);
l.setP2(QPointF(l.x2(), maxHeight));
m_guides.at(i)->setLine(l);
}
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight);
+
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight - 1);
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
viewport()->update();
emit tracksChanged();
l.setP2(QPointF(l.x2(), maxHeight));
m_guides.at(i)->setLine(l);
}
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight);
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight - 1);
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
m_selectedTrack = qMin(m_selectedTrack, m_document->tracksCount() - 1);
for (int i = 0; i < trackInfos.count(); ++i) {
m_document->setTrackType(i, trackInfos.at(i));
m_document->renderer()->mltChangeTrackState(i + 1, m_document->trackInfoAt(i).isMute, m_document->trackInfoAt(i).isBlind);
+ lockTrack(m_document->tracksCount() - i - 1, m_document->trackInfoAt(i).isLocked, false);
}
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
}
-void CustomTrackView::lockTrack(int ix, bool lock)
+void CustomTrackView::lockTrack(int ix, bool lock, bool requestUpdate)
{
int tracknumber = m_document->tracksCount() - ix - 1;
m_document->switchTrackLock(tracknumber, lock);
- emit doTrackLock(ix, lock);
+ if (requestUpdate)
+ emit doTrackLock(ix, lock);
AbstractClipItem *clip = NULL;
QList<QGraphicsItem *> selection = m_scene->items(0, ix * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 2);
emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage);
}
setDocumentModified();
- }
- if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
+ } else if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
Transition *transition = static_cast <Transition *>(m_dragItem);
transition->updateTransitionEndTrack(getPreviousVideoTrack(m_dragItem->track()));
if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) {
} else {
// Moving several clips. We need to delete them and readd them to new position,
// or they might overlap each other during the move
- QGraphicsItemGroup *group = static_cast <QGraphicsItemGroup *>(m_dragItem->parentItem());
+ QGraphicsItemGroup *group;
+ if (m_selectionGroup)
+ group = static_cast <QGraphicsItemGroup *>(m_selectionGroup);
+ else
+ group = static_cast <QGraphicsItemGroup *>(m_dragItem->parentItem());
QList<QGraphicsItem *> items = group->childItems();
QList<ItemInfo> clipsToMove;
if (m_selectionGroup) {
m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
m_selectionGroupInfo.track = m_selectionGroup->track();
+
+ for (int i = 0; i < items.count(); ++i) {
+ if (items.at(i)->type() == GROUPWIDGET) {
+ rebuildGroup((AbstractGroupItem*)items.at(i));
+ items.removeAt(i);
+ --i;
+ }
+ }
+ for (int i = 0; i < items.count(); ++i) {
+ if (items.at(i)) {
+ items.at(i)->setSelected(true);
+ if (items.at(i)->parentItem())
+ items.at(i)->parentItem()->setSelected(true);
+ }
+ }
+ groupSelectedItems();
} else {
rebuildGroup((AbstractGroupItem *)group);
}
m_document->renderer()->doRefresh();
} else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) {
// resize start
- if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent) {
QUndoCommand *resizeCommand = new QUndoCommand();
}
} else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
// resize end
- if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent) {
QUndoCommand *resizeCommand = new QUndoCommand();
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
end += start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- slotUpdateClipEffect(item, effect, oldeffect, ix);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix);
emit clipItemSelected(item, ix);
}
} else if (item->fadeIn() != 0 && ix2 == -1) {
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
end += start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- slotUpdateClipEffect(item, effect, oldeffect, ix2);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix2);
emit clipItemSelected(item, ix2);
}
}
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
start = end - start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
// kDebug()<<"EDIT FADE OUT : "<<start<<"x"<<end;
- slotUpdateClipEffect(item, effect, oldeffect, ix);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix);
emit clipItemSelected(item, ix);
}
} else if (item->fadeOut() != 0 && ix2 == -1) {
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
start = end - start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
// kDebug()<<"EDIT FADE OUT : "<<start<<"x"<<end;
- slotUpdateClipEffect(item, effect, oldeffect, ix2);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix2);
emit clipItemSelected(item, ix2);
}
}
void CustomTrackView::cutSelectedClips()
{
QList<QGraphicsItem *> itemList = scene()->selectedItems();
+ QList<AbstractGroupItem *> groups;
GenTime currentPos = GenTime(m_cursorPos, m_document->fps());
for (int i = 0; i < itemList.count(); ++i) {
if (!itemList.at(i))
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
if (item->parentItem() && item->parentItem() != m_selectionGroup) {
- // remove all group children from itemList so we do not attempt to cut them twice
- QList <QGraphicsItem *> children = item->parentItem()->childItems();
- QList <int> toRemove;
- for (int j = 0; j < children.count(); ++j) {
- for (int k = 0; k < itemList.count(); ++k) {
- if (children.at(j)->pos() == itemList.at(k)->pos()
- && children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
- toRemove.append(k);
- }
- }
- }
- for (int j = 0; j < toRemove.count(); ++j)
- itemList.removeAt(toRemove.at(j));
-
- razorGroup((AbstractGroupItem *)item->parentItem(), currentPos);
+ AbstractGroupItem *group = static_cast <AbstractGroupItem *>(item->parentItem());
+ if (!groups.contains(group))
+ groups << group;
} else if (currentPos > item->startPos() && currentPos < item->endPos()) {
RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos);
m_commandStack->push(command);
}
} else if (itemList.at(i)->type() == GROUPWIDGET && itemList.at(i) != m_selectionGroup) {
- // remove all group children from itemList so we do not attempt to cut them twice
AbstractGroupItem *group = static_cast<AbstractGroupItem *>(itemList.at(i));
-
- QList <QGraphicsItem *> children = itemList.at(i)->childItems();
- QList <int> toRemove;
- for (int j = 0; j < children.count(); ++j) {
- for (int k = 0; k < itemList.count(); ++k) {
- if (children.at(j)->pos() == itemList.at(k)->pos()
- && children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
- toRemove.append(k);
- }
- }
- }
- for (int j = 0; j < toRemove.count(); ++j)
- itemList.removeAt(toRemove.at(j));
-
- razorGroup(group, currentPos);
+ if (!groups.contains(group))
+ groups << group;
}
}
+
+ for (int i = 0; i < groups.count(); ++i)
+ razorGroup(groups.at(i), currentPos);
}
void CustomTrackView::razorGroup(AbstractGroupItem* group, GenTime cutPos)
else
prod = clip->baseClip()->producer(info.track);
m_document->renderer()->mltInsertClip(info, clip->xml(), prod);
+ for (int i = 0; i < clip->effectsCount(); i++) {
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
+ }
} else if (item->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast <Transition*>(item);
int newTrack;
m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
- if (!reverseMove)
- rebuildGroup(m_selectionGroup);
+
resetSelectionGroup(false);
+
+ for (int i = 0; i < children.count(); i++) {
+ if (children.at(i)->parentItem())
+ rebuildGroup((AbstractGroupItem*)children.at(i)->parentItem());
+ }
+ clearSelection();
+
KdenliveSettings::setSnaptopoints(snap);
m_document->renderer()->doRefresh();
} else kDebug() << "///////// WARNING; NO GROUP TO MOVE";
new MoveTransitionCommand(this, trInfo, newTrInfo, true, command);
}
+ /*
+ TODO: cleanup the effect update process
+ */
ClipItem *clip = static_cast < ClipItem * >(item);
+
updatePositionEffects(clip, oldInfo);
// check keyframes
if (item->type() == AVWIDGET) {
ItemInfo resizeinfo = info;
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
- bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos);
+ bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.cropDuration);
if (success) {
// Check if there is an automatic transition on that clip (lower track)
Transition *tr = getTransitionItemAtEnd(oldInfo.endPos, oldInfo.track);
}
- // check keyframes
ClipItem *clip = static_cast < ClipItem * >(item);
+
+ updatePositionEffects(clip, oldInfo);
+
+ // check keyframes
QDomDocument doc;
QDomElement root = doc.createElement("list");
doc.appendChild(root);
} else {
new ResizeClipCommand(this, oldInfo, info, false, false, command);
}
-
- updatePositionEffects(clip, oldInfo);
} else {
KdenliveSettings::setSnaptopoints(false);
item->resizeEnd((int) oldInfo.endPos.frames(m_document->fps()));
}
}
- effectPos = item->hasEffect("affine", "pan_zoom");
- if (effectPos != -1) {
- QDomElement oldeffect = item->effectAt(effectPos);
- int start = item->cropStart().frames(m_document->fps());
- int max = start + item->cropDuration().frames(m_document->fps());
- if (start < 0) {
- max -= start;
- start = 0;
- }
- oldeffect.setAttribute("in", start);
- oldeffect.setAttribute("out", max);
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
- emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
- // if effect is displayed, update the effect edit widget with new clip duration
- if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
- }
+ updatePanZoom(item);
}
double CustomTrackView::getSnapPointForPos(double pos)
}
}
+ // add render zone
+ QPoint z = m_document->zone();
+ snaps.append(GenTime(z.x(), m_document->fps()));
+ snaps.append(GenTime(z.y(), m_document->fps()));
+
qSort(snaps);
m_scene->setSnapList(snaps);
//for (int i = 0; i < m_snapPoints.size(); ++i)
newmatrix = newmatrix.scale(scaleFactor, verticalScale);
m_scene->setScale(scaleFactor, verticalScale);
removeTipAnimation();
- double verticalPos = mapToScene(QPoint(0, viewport()->height() / 2)).y();
bool adjust = false;
if (verticalScale != matrix().m22()) adjust = true;
setMatrix(newmatrix);
if (adjust) {
double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight);
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight - 1);
for (int i = 0; i < m_guides.count(); i++) {
QLineF l = m_guides.at(i)->line();
l.setP2(QPointF(l.x2(), newHeight));
else
setSceneRect(0, 0, (m_projectDuration + 300), sceneRect().height());
}
+ double verticalPos = mapToScene(QPoint(0, viewport()->height() / 2)).y();
centerOn(QPointF(cursorPos(), verticalPos));
}
void CustomTrackView::drawBackground(QPainter * painter, const QRectF &rect)
{
- //kDebug() << "// DRAW BG: " << rect.width();
painter->setClipRect(rect);
- KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window);
QPen pen1 = painter->pen();
- pen1.setColor(scheme.shade(KColorScheme::DarkShade));
+ pen1.setColor(palette().dark().color());
painter->setPen(pen1);
double min = rect.left();
double max = rect.right();
painter->drawLine(QPointF(min, 0), QPointF(max, 0));
int maxTrack = m_document->tracksCount();
- QColor lockedColor = scheme.background(KColorScheme::NegativeBackground).color();
+ QColor lockedColor = palette().button().color();
QColor audioColor = palette().alternateBase().color();
- QColor base = scheme.background(KColorScheme::NormalBackground).color();
for (int i = 0; i < maxTrack; i++) {
TrackInfo info = m_document->trackInfoAt(maxTrack - i - 1);
if (info.isLocked || info.type == AUDIOTRACK || i == m_selectedTrack) {
const QRectF track(min, m_tracksHeight * i + 1, max - min, m_tracksHeight - 1);
if (i == m_selectedTrack)
- painter->fillRect(track, scheme.background(KColorScheme::ActiveBackground).color());
+ painter->fillRect(track, m_activeTrackBrush.brush(this));
else
painter->fillRect(track, info.isLocked ? lockedColor : audioColor);
}
painter->drawLine(QPointF(min, m_tracksHeight *(i + 1)), QPointF(max, m_tracksHeight *(i + 1)));
}
- int lowerLimit = m_tracksHeight * maxTrack + 1;
- if (height() > lowerLimit) {
- const QRectF bg(min, lowerLimit, max - min, height() - lowerLimit);
- painter->fillRect(bg, base);
- }
}
bool CustomTrackView::findString(const QString &text)
return;
}
QPoint position;
+ int track = -1;
+ GenTime pos = GenTime(-1);
if (m_menuPosition.isNull()) {
position = mapFromGlobal(QCursor::pos());
if (!contentsRect().contains(position) || mapToScene(position).y() / m_tracksHeight > m_document->tracksCount()) {
- emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage);
- return;
+ track = m_selectedTrack;
+ pos = GenTime(m_cursorPos, m_document->fps());
+ /*emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage);
+ return;*/
}
- } else position = m_menuPosition;
+ } else {
+ position = m_menuPosition;
+ }
- GenTime pos = GenTime((int)(mapToScene(position).x()), m_document->fps());
- int track = (int)(mapToScene(position).y() / m_tracksHeight);
+ if (pos == GenTime(-1))
+ pos = GenTime((int)(mapToScene(position).x()), m_document->fps());
+ if (track == -1)
+ track = (int)(mapToScene(position).y() / m_tracksHeight);
GenTime leftPos = m_copiedItems.at(0)->startPos();
int lowerTrack = m_copiedItems.at(0)->track();
void CustomTrackView::updatePalette()
{
+ m_activeTrackBrush = KStatefulBrush(KColorScheme::View, KColorScheme::ActiveBackground, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
if (m_cursorLine) {
QPen pen1 = QPen();
pen1.setWidth(1);
pen1.setColor(palette().text().color());
m_cursorLine->setPen(pen1);
}
+ emit tracksChanged();
}
void CustomTrackView::removeTipAnimation()
void CustomTrackView::slotAddTrackEffect(const QDomElement effect, int ix)
{
- m_document->renderer()->mltAddTrackEffect(m_document->tracksCount() - ix, getEffectArgs(effect));
+ AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true);
+ m_commandStack->push(command);
+ setDocumentModified();
}
QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
double factor = e.attribute("factor", "1").toDouble();
for (int j = 0; j < values.count(); j++) {
- QString pos = values.at(j).section(":", 0, 0);
- double val = values.at(j).section(":", 1, 1).toDouble() / factor;
+ QString pos = values.at(j).section(':', 0, 0);
+ double val = values.at(j).section(':', 1, 1).toDouble() / factor;
values[j] = pos + "=" + QString::number(val);
}
// kDebug() << "/ / / /SENDING KEYFR:" << values;
}
}
return parameters;
-}
\ No newline at end of file
+}
+
+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() > 0)
+ emit clipItemSelected(item, item->selectedEffectIndex());
+}