#include "insertspacecommand.h"
#include "spacerdialog.h"
#include "addtrackcommand.h"
+#include "changetrackcommand.h"
+#include "movegroupcommand.h"
#include "ui_addtrack_ui.h"
//TODO:
m_tipPen.setColor(border);
m_tipPen.setWidth(3);
setContentsMargins(0, 0, 0, 0);
- if (projectscene) {
- m_cursorLine = projectscene->addLine(0, 0, 0, m_tracksHeight);
- m_cursorLine->setZValue(1000);
- }
+ const int maxWidth = m_tracksHeight * m_document->tracksCount();
+ setSceneRect(0, 0, sceneRect().width(), maxWidth);
+ verticalScrollBar()->setMaximum(maxWidth);
+ m_cursorLine = projectscene->addLine(0, 0, 0, maxWidth);
+ m_cursorLine->setZValue(1000);
KIcon razorIcon("edit-cut");
m_razorCursor = QCursor(razorIcon.pixmap(22, 22));
m_timelineContextMenu = timeline;
m_timelineContextClipMenu = clip;
m_timelineContextTransitionMenu = transition;
+ QList <QAction *> list = m_timelineContextTransitionMenu->actions();
+ for (int i = 0; i < list.count(); i++)
+ if (list.at(i)->data().toString() == "auto") m_autoTransition = list.at(i);
}
void CustomTrackView::checkAutoScroll() {
}
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+// verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
update();
}
int mappedXPos = (int)(mapToScene(event->pos()).x() + 0.5);
emit mousePosition(mappedXPos);
if (event->buttons() & Qt::MidButton) return;
- if (event->modifiers() == Qt::ControlModifier || event->modifiers() == Qt::ShiftModifier) {
+ if ((event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL) || event->modifiers() == Qt::ShiftModifier) {
QGraphicsView::mouseMoveEvent(event);
m_moveOpMode = NONE;
return;
if (event->button() == Qt::MidButton) {
m_document->renderer()->switchPlay();
m_blockRefresh = false;
+ m_operationMode = NONE;
return;
}
// check item under mouse
QList<QGraphicsItem *> collisionList = items(event->pos());
- if (event->modifiers() == Qt::ControlModifier && collisionList.count() == 0) {
+ if (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && collisionList.count() == 0) {
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsView::mousePressEvent(event);
m_blockRefresh = false;
+ m_operationMode = NONE;
return;
}
setDragMode(QGraphicsView::RubberBandDrag);
QGraphicsView::mousePressEvent(event);
m_blockRefresh = false;
+ m_operationMode = RUBBERSELECTION;
return;
}
i++;
}
+ if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
+ // update transition menu action
+ m_autoTransition->setChecked(static_cast<Transition *>(m_dragItem)->isAutomatic());
+ m_autoTransition->setEnabled(true);
+ } else m_autoTransition->setEnabled(false);
+
// context menu requested
if (event->button() == Qt::RightButton) {
if (m_dragItem) {
if (!m_dragItem->isSelected()) {
+ resetSelectionGroup(false);
m_scene->clearSelection();
- resetSelectionGroup();
m_dragItem->setSelected(true);
}
}
m_operationMode = NONE;
displayContextMenu(event->globalPos(), m_dragItem);
- m_menuPosition = event->pos();
+ m_menuPosition = m_clickEvent;
m_dragItem = NULL;
event->accept();
return;
event->accept();
emit clipItemSelected(NULL);
if (m_tool == SPACERTOOL) {
- // Select all items on track after click position
- int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight);
- QList<QGraphicsItem *> selection = items(event->pos().x(), track * m_tracksHeight + 1, sceneRect().width() - event->pos().x(), m_tracksHeight - 2);
+ QList<QGraphicsItem *> selection;
+ if (event->modifiers() == Qt::ControlModifier) {
+ // Ctrl + click, select all items on track after click position
+ int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight);
+ selection = items(m_clickEvent.x(), track * m_tracksHeight + 1, sceneRect().width() - m_clickEvent.x(), m_tracksHeight - 2);
+ } else {
+ // Select all items on all tracks after click position
+ selection = items(event->pos().x(), 1, sceneRect().width() - event->pos().x(), sceneRect().height());
+ }
m_selectionGroup = new AbstractGroupItem(m_document->fps());
scene()->addItem(m_selectionGroup);
m_spacerStart = -1;
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
m_selectionGroup->addToGroup(selection.at(i));
+ selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
AbstractClipItem *item = static_cast <AbstractClipItem *>(selection.at(i));
itemStart = item->startPos().frames(m_document->fps());
if (m_spacerStart == -1 || itemStart < m_spacerStart)
}
}
QPointF top = m_selectionGroup->boundingRect().topLeft();
- const int width = m_selectionGroup->boundingRect().width();
- const int height = m_selectionGroup->boundingRect().height();
m_selectionGroup->setPos(top);
m_selectionGroup->translate(-top.x(), -top.y() + 1);
- //kDebug()<<"// SPACER START GRP: "<<m_spacerStart;
m_operationMode = SPACER;
} else setCursorPos((int)(mapToScene(event->x(), 0).x()));
return;
resetSelectionGroup();
if (event->modifiers() != Qt::ControlModifier) m_scene->clearSelection();
m_dragItem->setSelected(!m_dragItem->isSelected());
- QList<QGraphicsItem *> selection = m_scene->selectedItems();
- if (selection.count() > 1) {
- m_selectionGroup = new AbstractGroupItem(m_document->fps());
- scene()->addItem(m_selectionGroup);
- for (int i = 0; i < selection.count(); i++) {
- if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
- m_selectionGroup->addToGroup(selection.at(i));
- selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
- }
- }
- }
- if (m_selectionGroup) {
- QPointF top = m_selectionGroup->boundingRect().topLeft();
- const int width = m_selectionGroup->boundingRect().width();
- const int height = m_selectionGroup->boundingRect().height();
- m_selectionGroup->setPos(top);
- m_selectionGroup->translate(-top.x(), -top.y() + 1);
- m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
- m_selectionGroupInfo.track = m_selectionGroup->track();
- }
+ groupSelectedItems();
}
m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
//QGraphicsView::mousePressEvent(event);
}
-void CustomTrackView::resetSelectionGroup() {
+void CustomTrackView::resetSelectionGroup(bool selectItems) {
if (m_selectionGroup) {
// delete selection group
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
for (int i = 0; i < children.count(); i++) {
children.at(i)->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
- children.at(i)->setSelected(true);
+ children.at(i)->setSelected(selectItems);
}
scene()->destroyItemGroup(m_selectionGroup);
m_selectionGroup = NULL;
}
}
+void CustomTrackView::groupSelectedItems() {
+ if (m_selectionGroup) kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP";
+ QList<QGraphicsItem *> selection = m_scene->selectedItems();
+ if (selection.count() > 1) {
+ m_selectionGroup = new AbstractGroupItem(m_document->fps());
+ scene()->addItem(m_selectionGroup);
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
+ m_selectionGroup->addToGroup(selection.at(i));
+ selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
+ }
+ }
+
+ if (m_selectionGroup) {
+ QPointF top = m_selectionGroup->boundingRect().topLeft();
+ m_selectionGroup->setPos(top);
+ m_selectionGroup->translate(-top.x(), -top.y() + 1);
+ m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+ m_selectionGroupInfo.track = m_selectionGroup->track();
+ }
+ } else resetSelectionGroup();
+}
+
void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) {
kDebug() << "++++++++++++ DBL CLK";
if (m_dragItem && m_dragItem->hasKeyFrames()) {
} else if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
QStringList ids = QString(event->mimeData()->data("kdenlive/producerslist")).split(";");
m_scene->clearSelection();
- resetSelectionGroup();
+ resetSelectionGroup(false);
m_selectionGroup = new AbstractGroupItem(m_document->fps());
QPoint pos = QPoint();
}
void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params) {
- Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params);
+ Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params, true);
scene()->addItem(tr);
//kDebug() << "---- ADDING transition " << params.attribute("value");
void CustomTrackView::dropEvent(QDropEvent * event) {
if (m_selectionGroup) {
QList<QGraphicsItem *> items = m_selectionGroup->childItems();
- m_scene->clearSelection();
resetSelectionGroup();
+ m_scene->clearSelection();
for (int i = 0; i < items.count(); i++) {
ClipItem *item = static_cast <ClipItem *>(items.at(i));
AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false);
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)
m_selectionGroup->addToGroup(selection.at(i));
+ selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
}
- QPointF top = m_selectionGroup->boundingRect().topLeft();
- const int width = m_selectionGroup->boundingRect().width();
- const int height = m_selectionGroup->boundingRect().height();
- m_selectionGroup->setPos(top);
- m_selectionGroup->translate(-top.x(), -top.y() + 1);
-
// Move graphic items
- m_selectionGroup->setPos(m_selectionGroup->pos().x(), m_selectionGroup->pos().y() + m_tracksHeight);
+ m_selectionGroup->translate(0, m_tracksHeight);
// adjust track number
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
}
}
}
- resetSelectionGroup();
+ resetSelectionGroup(false);
}
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_document->tracksCount());
- setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+ int maxHeight = m_tracksHeight * m_document->tracksCount();
+ for (int i = 0; i < m_guides.count(); i++) {
+ QLineF l = m_guides.at(i)->line();
+ 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);
+ setSceneRect(0, 0, sceneRect().width(), maxHeight);
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
+ viewport()->update();
//setFixedHeight(50 * m_tracksCount);
}
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)
m_selectionGroup->addToGroup(selection.at(i));
+ selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
}
-
- QPointF top = m_selectionGroup->boundingRect().topLeft();
- const int width = m_selectionGroup->boundingRect().width();
- const int height = m_selectionGroup->boundingRect().height();
- m_selectionGroup->setPos(top);
- m_selectionGroup->translate(-top.x(), -top.y() + 1);
-
// Move graphic items
- m_selectionGroup->setPos(m_selectionGroup->pos().x(), m_selectionGroup->pos().y() - m_tracksHeight);
+ qreal ydiff = 0 - (int) m_tracksHeight;
+ m_selectionGroup->translate(0, ydiff);
// adjust track number
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
- kDebug() << "// FOUND CLIPS TO MOVE: " << children.count();
+ //kDebug() << "// FOUND CLIPS TO MOVE: " << children.count();
for (int i = 0; i < children.count(); i++) {
if (children.at(i)->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem *>(children.at(i));
}
}
}
- resetSelectionGroup();
+ resetSelectionGroup(false);
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_document->tracksCount());
- setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+ int maxHeight = m_tracksHeight * m_document->tracksCount();
+ for (int i = 0; i < m_guides.count(); i++) {
+ QLineF l = m_guides.at(i)->line();
+ 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);
+ setSceneRect(0, 0, sceneRect().width(), maxHeight);
+ QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
+ viewport()->update();
+}
+
+void CustomTrackView::changeTrack(int ix, TrackInfo type) {
+ int tracknumber = m_document->tracksCount() - ix;
+ m_document->setTrackType(tracknumber - 1, type);
+ m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
+ viewport()->update();
}
void CustomTrackView::slotSwitchTrackAudio(int ix) {
+ /*for (int i = 0; i < m_document->tracksCount(); i++)
+ kDebug() << "TRK " << i << " STATE: " << m_document->trackInfoAt(i).isMute << m_document->trackInfoAt(i).isBlind;*/
+
int tracknumber = m_document->tracksCount() - ix;
- kDebug() << "///// MUTING TRK: " << ix << "; PL NUM: " << tracknumber;
+
+ m_document->switchTrackAudio(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isMute);
+ kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber - 1).isMute << m_document->trackInfoAt(tracknumber - 1).isBlind;
m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+ m_document->setModified(true);
}
void CustomTrackView::slotSwitchTrackVideo(int ix) {
int tracknumber = m_document->tracksCount() - ix;
+ m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind);
m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+ m_document->setModified(true);
}
void CustomTrackView::slotRemoveSpace() {
m_commandStack->push(command);
}
-void CustomTrackView::insertSpace(const GenTime &pos, int track, const GenTime duration, bool add) {
+void CustomTrackView::insertSpace(const GenTime &pos, int track, const GenTime duration) {
int diff = duration.frames(m_document->fps());
- if (!add) diff = -diff;
QList<QGraphicsItem *> itemList;
if (track == -1) itemList = scene()->items(pos.frames(m_document->fps()) , 1, sceneRect().width() - pos.frames(m_document->fps()), sceneRect().height());
else itemList = scene()->items(pos.frames(m_document->fps()) , track * m_tracksHeight + 1, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight - 2);
scene()->addItem(m_selectionGroup);
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
- /*AbstractClipItem *item = static_cast <AbstractClipItem *> (itemList.at(i));
- if (item->endPos() > pos)*/
m_selectionGroup->addToGroup(itemList.at(i));
- //item->moveBy(diff, 0);
+ itemList.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
}
}
- QPointF top = m_selectionGroup->boundingRect().topLeft();
- const int width = m_selectionGroup->boundingRect().width();
- const int height = m_selectionGroup->boundingRect().height();
- m_selectionGroup->setPos(top);
- m_selectionGroup->translate(-top.x(), -top.y() + 1);
- m_selectionGroup->moveBy(diff, 0);
- resetSelectionGroup();
+
+ m_selectionGroup->translate(diff, 0);
+ resetSelectionGroup(false);
if (track != -1) track = m_document->tracksCount() - track;
- if (!add) m_document->renderer()->mltInsertSpace(pos, track, GenTime() - duration);
- else m_document->renderer()->mltInsertSpace(pos, track, duration);
+ m_document->renderer()->mltInsertSpace(pos, track, duration);
}
void CustomTrackView::deleteClip(const QString &clipId) {
int endClick = (int)(mapToScene(event->pos()).x() + 0.5);
int mappedClick = (int)(mapToScene(m_clickEvent).x() + 0.5);
int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight);
+ if (m_selectionGroup->sceneBoundingRect().height() > m_tracksHeight) {
+ // We are moving all tracks
+ track = -1;
+ }
ClipItem *item = getClipItemAt(mappedClick, track);
if (item) mappedClick = item->startPos().frames(m_document->fps());
int diff = m_selectionGroup->pos().x() - m_spacerStart;//endClick - mappedClick;
if (diff < 0) mappedClick += diff;
InsertSpaceCommand *command = new InsertSpaceCommand(this, GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps()), false);
m_commandStack->push(command);
- track = m_document->tracksCount() - track;
+ if (track != -1) track = m_document->tracksCount() - track;
m_document->renderer()->mltInsertSpace(GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps()));
+ resetSelectionGroup(false);
+ m_operationMode = NONE;
+ } else if (m_operationMode == RUBBERSELECTION) {
resetSelectionGroup();
+ groupSelectedItems();
m_operationMode = NONE;
}
ClipItem *item = static_cast <ClipItem *>(m_dragItem);
bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps())), item->baseClip()->producer(info.track));
if (success) {
- MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false, false);
- m_commandStack->push(command);
- if (item->baseClip()->isTransparent()) {
- // Also move automatic transition
- Transition *tr = getTransitionItemAt((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_dragItemInfo.track);
+ QUndoCommand *moveCommand = new QUndoCommand();
+ moveCommand->setText(i18n("Move clip"));
+ new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand);
+ // Also move automatic transitions (on lower track)
+ Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+ if (tr && tr->isAutomatic()) {
+ tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track));
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+ // transition end should be adjusted to clip on lower track
+ newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
+ }
+ if (tr == NULL || tr->endPos() < item->endPos()) {
+ // Check if there is a transition at clip end
+ tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
if (tr && tr->isAutomatic()) {
tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track));
- m_document->renderer()->mltMoveTransition(tr->transitionTag(), m_document->tracksCount() - m_dragItemInfo.track, m_document->tracksCount() - info.track, tr->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
- tr->setPos((int) info.startPos.frames(m_document->fps()), (int)(info.track * m_tracksHeight + 1));
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+ // transition end should be moved
+ newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
+ }
+ }
+ // Also move automatic transitions (on upper track)
+ tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if (m_dragItemInfo.track == info.track && tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtEnd(newTrInfo.endPos, tr->track())) {
+ // transition end should be adjusted to clip on upper track
+ newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
+ }
+ if (m_dragItemInfo.track == info.track && (tr == NULL || tr->endPos() < item->endPos())) {
+ // Check if there is a transition at clip end
+ tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
+ if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtStart(trInfo.startPos, tr->track())) {
+ // transition start should be moved
+ newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
}
+ m_commandStack->push(moveCommand);
} else {
// undo last move and emit error message
MoveClipCommand *command = new MoveClipCommand(this, info, m_dragItemInfo, true);
QList<QGraphicsItem *> items = m_selectionGroup->childItems();
+ QList<ItemInfo> clipsToMove = QList<ItemInfo> ();
+ QList<ItemInfo> transitionsToMove = QList<ItemInfo> ();
+
GenTime timeOffset = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()) - m_selectionGroupInfo.startPos;
const int trackOffset = m_selectionGroup->track() - m_selectionGroupInfo.track;
- // kDebug() << "&DROPPED GRPOUP:" << timeOffset.frames(25) << "TRK OFF: " << trackOffset;
if (timeOffset != GenTime() || trackOffset != 0) {
QUndoCommand *moveClips = new QUndoCommand();
- moveClips->setText("Move clips");
+ moveClips->setText(i18n("Move group"));
// remove items in MLT playlist
for (int i = 0; i < items.count(); i++) {
AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
// error, clip cannot be removed from playlist
emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage);
} else {
- // clip removed from playlist, create command
- ClipItem *clip = static_cast <ClipItem*>(item);
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
+ clipsToMove.append(info);
}
} else {
+ transitionsToMove.append(info);
Transition *tr = static_cast <Transition*>(item);
- new AddTransitionCommand(this, info, tr->transitionEndTrack(), tr->toXML(), true, false, moveClips);
m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
item->updateItem();
ItemInfo info = item->info();
- /*info.startPos = info.startPos + timeOffset;
- info.endPos = info.endPos + timeOffset;
- info.track = info.track + trackOffset;*/
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, false, moveClips);
info.track = m_document->tracksCount() - info.track;
m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track));
} else {
newTrack += trackOffset;
if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track);
}
- new AddTransitionCommand(this, info, newTrack, tr->toXML(), false, false, moveClips);
-
+ tr->updateTransitionEndTrack(newTrack);
m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
+
+ new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveClips);
m_commandStack->push(moveClips);
+
+ QPointF top = m_selectionGroup->sceneBoundingRect().topLeft();
+ //QPointF oldpos = m_selectionGroup->scenePos();
+ //kDebug()<<"SELECTION GRP POS: "<<m_selectionGroup->scenePos()<<", TOP: "<<top;
+ m_selectionGroup->setPos(top);
+ m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+ m_selectionGroupInfo.track = m_selectionGroup->track();
}
}
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.startPos);
if (success) {
+ QUndoCommand *resizeCommand = new QUndoCommand();
+ resizeCommand->setText(i18n("Resize clip"));
+
+ // Check if there is an automatic transition on that clip (lower track)
+ Transition *transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+ if (transition && transition->isAutomatic()) {
+ ItemInfo trInfo = transition->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
+ // Check if there is an automatic transition on that clip (upper track)
+ transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if (transition && transition->isAutomatic() && (m_document->tracksCount() - transition->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = transition->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
updateClipFade(static_cast <ClipItem *>(m_dragItem));
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
+ new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
+ m_commandStack->push(resizeCommand);
} else {
m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()));
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
m_commandStack->push(command);
Transition *transition = static_cast <Transition *>(m_dragItem);
- m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+ m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
}
//m_document->renderer()->doRefresh();
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos);
if (success) {
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
+ QUndoCommand *resizeCommand = new QUndoCommand();
+ resizeCommand->setText(i18n("Resize clip"));
+
+ // Check if there is an automatic transition on that clip (lower track)
+ Transition *tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
+ if (tr && tr->isAutomatic()) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ if (!static_cast<ClipItem*>(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+ // transition start should be moved
+ newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
+
+ // Check if there is an automatic transition on that clip (upper track)
+ tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
+ if (tr) kDebug() << "TRANS TRK: " << tr->transitionEndTrack() << ", CLP TRK:" << m_dragItemInfo.track << ", CALC: " << m_document->tracksCount() - tr->transitionEndTrack();
+ if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
+ kDebug() << ".............. GOT TRANSITION";
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ if (!static_cast<ClipItem*>(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, trInfo.track)) {
+ // transition start should be moved
+ newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
+
+ new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
+ m_commandStack->push(resizeCommand);
updateClipFade(static_cast <ClipItem *>(m_dragItem), true);
} else {
m_dragItem->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps()));
}
}
+ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) {
+ QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()) - 1, track * m_tracksHeight + m_tracksHeight / 2));
+ ClipItem *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == AVWIDGET) {
+ ClipItem *test = static_cast <ClipItem *>(list.at(i));
+ if (test->endPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
+ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track) {
+ QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2));
+ ClipItem *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == AVWIDGET) {
+ ClipItem *test = static_cast <ClipItem *>(list.at(i));
+ if (test->startPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
ClipItem *CustomTrackView::getClipItemAt(int pos, int track) {
QList<QGraphicsItem *> list = scene()->items(QPointF(pos , track * m_tracksHeight + m_tracksHeight / 2));
ClipItem *clip = NULL;
return getTransitionItemAt(framepos, track);
}
+Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track) {
+ int framepos = (int)(pos.frames(m_document->fps()));
+ QList<QGraphicsItem *> list = scene()->items(QPointF(framepos - 1, (track + 1) * m_tracksHeight));
+ Transition *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == TRANSITIONWIDGET) {
+ Transition *test = static_cast <Transition *>(list.at(i));
+ if (test->endPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
+Transition *CustomTrackView::getTransitionItemAtStart(GenTime pos, int track) {
+ QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()), (track + 1) * m_tracksHeight));
+ Transition *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == TRANSITIONWIDGET) {
+ Transition *test = static_cast <Transition *>(list.at(i));
+ if (test->startPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) {
+ if (m_selectionGroup) resetSelectionGroup(false);
ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track);
if (!item) {
emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
- kDebug() << "---------------- ERROR, CANNOT find clip to move at.. ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
+ kDebug() << "---------------- ERROR, CANNOT find clip to move at.. ";
return;
}
- //kDebug() << "---------------- Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y();
-
bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - start.track), (int)(m_document->tracksCount() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps()), item->baseClip()->producer(end.track));
if (success) {
item->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1));
+ m_scene->clearSelection();
+ item->setSelected(true);
if (item->baseClip()->isTransparent()) {
// Also move automatic transition
Transition *tr = getTransitionItemAt((int) start.startPos.frames(m_document->fps()), start.track);
// undo last move and emit error message
emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage);
}
+ kDebug() << " // MOVED CLIP TO: " << end.startPos.frames(25) << ", ITEM START: " << item->startPos().frames(25);
+}
+
+void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove) {
+ // Group Items
+ kDebug() << "// GROUP MOVE; OFFSET: " << offset.frames(25) << ", TK OFF: " << trackOffset;
+ resetSelectionGroup();
+ m_scene->clearSelection();
+ for (int i = 0; i < startClip.count(); i++) {
+ if (reverseMove) {
+ startClip[i].startPos = startClip.at(i).startPos - offset;
+ startClip[i].track = startClip.at(i).track - trackOffset;
+ }
+ ClipItem *clip = getClipItemAt(startClip.at(i).startPos, startClip.at(i).track);
+ if (clip) {
+ clip->setSelected(true);
+ m_document->renderer()->mltRemoveClip(m_document->tracksCount() - startClip.at(i).track, startClip.at(i).startPos);
+ }
+ }
+ for (int i = 0; i < startTransition.count(); i++) {
+ if (reverseMove) {
+ startTransition[i].startPos = startTransition.at(i).startPos - offset;
+ startTransition[i].track = startTransition.at(i).track - trackOffset;
+ }
+ Transition *tr = getTransitionItemAt(startTransition.at(i).startPos, startTransition.at(i).track);
+ if (tr) {
+ tr->setSelected(true);
+ m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - startTransition.at(i).track, startTransition.at(i).startPos, startTransition.at(i).endPos, tr->toXML());
+ }
+ }
+ groupSelectedItems();
+ if (m_selectionGroup) {
+ QPointF pos = m_selectionGroup->pos();
+ qreal posx = pos.x() + offset.frames(m_document->fps());
+ qreal posy = pos.y() + trackOffset * (qreal) m_tracksHeight;
+ m_selectionGroup->setPos(posx, posy);
+
+ QPointF top = m_selectionGroup->sceneBoundingRect().topLeft();
+ m_selectionGroup->setPos(top);
+ m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+ m_selectionGroupInfo.track = m_selectionGroup->track();
+
+ QList<QGraphicsItem *> children = m_selectionGroup->childItems();
+ for (int i = 0; i < children.count(); i++) {
+ // re-add items in correct place
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(i));
+ item->updateItem();
+ ItemInfo info = item->info();
+ if (item->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem*>(item);
+ info.track = m_document->tracksCount() - info.track;
+ m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track));
+ } else {
+ Transition *tr = static_cast <Transition*>(item);
+ int newTrack = tr->transitionEndTrack();
+ kDebug() << "/// TRANSITION CURR TRK: " << newTrack;
+ if (!tr->forcedTrack()) {
+ newTrack += trackOffset;
+ if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track);
+ }
+ tr->updateTransitionEndTrack(newTrack);
+ kDebug() << "/// TRANSITION UPDATED TRK: " << newTrack;
+ m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
+ }
+ }
+ }
+
}
void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) {
} else if (end.endPos == start.endPos) {
// Transition start resize
item->resizeStart((int) end.startPos.frames(m_document->fps()));
- } else {
+ } else if (end.startPos == start.startPos) {
// Transition end resize;
item->resizeEnd((int) end.endPos.frames(m_document->fps()));
+ } else {
+ // Move & resize
+ item->setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1);
+ item->resizeStart((int) end.startPos.frames(m_document->fps()));
+ item->resizeEnd((int) end.endPos.frames(m_document->fps()));
}
//item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps()));
item->updateTransitionEndTrack(getPreviousVideoTrack(end.track));
void CustomTrackView::clipEnd() {
ClipItem *item = getMainActiveClip();
if (item != NULL) {
- setCursorPos((int) item->endPos().frames(m_document->fps()));
+ setCursorPos((int) item->endPos().frames(m_document->fps()) - 1);
checkScrolling();
}
}
void CustomTrackView::slotUpdateAllThumbs() {
QList<QGraphicsItem *> itemList = items();
+ //if (itemList.isEmpty()) return;
ClipItem *item;
- Transition *transitionitem;
+ QString thumbBase = m_document->projectFolder().path() + "/thumbs/";
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
item = static_cast <ClipItem *>(itemList.at(i));
+ if (item->clipType() != COLOR) {
+ // Check if we have a cached thumbnail
+ if (item->clipType() == IMAGE || item->clipType() == TEXT || item->clipType() == AUDIO) {
+ QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png";
+ if (QFile::exists(thumb)) {
+ QPixmap pix(thumb);
+ item->slotSetStartThumb(pix);
+ item->slotSetEndThumb(pix);
+ }
+ } else {
+ QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_';
+ QString endThumb = startThumb;
+ startThumb.append(QString::number(item->cropStart().frames(m_document->fps())) + ".png");
+ endThumb.append(QString::number((item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1) + ".png");
+ if (QFile::exists(startThumb)) {
+ QPixmap pix(startThumb);
+ item->slotSetStartThumb(pix);
+ }
+ if (QFile::exists(endThumb)) {
+ QPixmap pix(endThumb);
+ item->slotSetEndThumb(pix);
+ }
+ }
+ }
item->refreshClip();
qApp->processEvents();
}
}
+ viewport()->update();
+}
+
+void CustomTrackView::saveThumbnails() {
+ QList<QGraphicsItem *> itemList = items();
+ ClipItem *item;
+ QString thumbBase = m_document->projectFolder().path() + "/thumbs/";
+ for (int i = 0; i < itemList.count(); i++) {
+ if (itemList.at(i)->type() == AVWIDGET) {
+ item = static_cast <ClipItem *>(itemList.at(i));
+ if (item->clipType() != COLOR) {
+ // Check if we have a cached thumbnail
+ if (item->clipType() == IMAGE || item->clipType() == TEXT || item->clipType() == AUDIO) {
+ QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png";
+ if (!QFile::exists(thumb)) {
+ QPixmap pix(item->startThumb());
+ pix.save(thumb);
+ }
+ } else {
+ QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_';
+ QString endThumb = startThumb;
+ startThumb.append(QString::number(item->cropStart().frames(m_document->fps())) + ".png");
+ endThumb.append(QString::number((item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1) + ".png");
+ if (!QFile::exists(startThumb)) {
+ QPixmap pix(item->startThumb());
+ pix.save(startThumb);
+ }
+ if (!QFile::exists(endThumb)) {
+ QPixmap pix(item->endThumb());
+ pix.save(endThumb);
+ }
+ }
+ }
+ }
+ }
}
+
void CustomTrackView::slotInsertTrack(int ix) {
kDebug() << "// INSERTING TRK: " << ix;
QDialog d(parentWidget());
view.setupUi(&d);
view.track_nb->setMaximum(m_document->tracksCount() - 1);
view.track_nb->setValue(ix);
+ d.setWindowTitle(i18n("Insert Track"));
if (d.exec() == QDialog::Accepted) {
+ ix = view.track_nb->value();
if (view.before_select->currentIndex() == 1) {
- kDebug() << "// AFTER";
ix++;
}
TrackInfo info;
} else {
info.type = AUDIOTRACK;
info.isMute = false;
- info.isBlind = false;
+ info.isBlind = true;
}
- addTimelineTrack(ix, info);
+ AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true, true);
+ m_commandStack->push(addTrack);
m_document->setModified(true);
- /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, true, true);
- m_commandStack->push(command);*/
}
}
}
}
-void CustomTrackView::addTimelineTrack(int ix, TrackInfo trackinfo) {
- double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
- QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY);
- QList<QGraphicsItem *> selection = m_scene->items(r);
- kDebug() << "// TRK RECT: " << r << ", ITEMS: " << selection.count();
- QUndoCommand *addTrack = new QUndoCommand();
- addTrack->setText("Add track");
- new AddTrackCommand(this, ix, trackinfo, true, true, addTrack);
+void CustomTrackView::slotChangeTrack(int ix) {
+ QDialog d(parentWidget());
+ Ui::AddTrack_UI view;
+ view.setupUi(&d);
+ view.label->setText(i18n("Change track"));
+ view.before_select->setHidden(true);
+ view.track_nb->setMaximum(m_document->tracksCount() - 1);
+ view.track_nb->setValue(ix);
+ d.setWindowTitle(i18n("Change Track Type"));
- m_commandStack->push(addTrack);
- kDebug() << "// ADD TRCKL DONE...";
- update();
+ if (d.exec() == QDialog::Accepted) {
+ TrackInfo info;
+ if (view.video_track->isChecked()) {
+ info.type = VIDEOTRACK;
+ info.isMute = false;
+ info.isBlind = false;
+ } else {
+ info.type = AUDIOTRACK;
+ info.isMute = false;
+ info.isBlind = true;
+ }
+ changeTimelineTrack(ix, info);
+ m_document->setModified(true);
+ }
}
+
void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo) {
double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
QRectF r(0, startY, sceneRect().width(), m_tracksHeight / 2 - 1);
new AddTrackCommand(this, ix, trackinfo, false, true, deleteTrack);
m_commandStack->push(deleteTrack);
- //removeTrack(ix, trackinfo);
- kDebug() << "// REM TRK DONE...";
- update();
+}
+
+void CustomTrackView::changeTimelineTrack(int ix, TrackInfo trackinfo) {
+ TrackInfo oldinfo = m_document->trackInfoAt(m_document->tracksCount() - ix);
+ ChangeTrackCommand *changeTrack = new ChangeTrackCommand(this, ix, oldinfo, trackinfo, true);
+ m_commandStack->push(changeTrack);
+}
+
+void CustomTrackView::autoTransition() {
+ QList<QGraphicsItem *> itemList = scene()->selectedItems();
+ if (itemList.count() != 1 || itemList.at(0)->type() != TRANSITIONWIDGET) {
+ emit displayMessage(i18n("You must select one transition for this action"), ErrorMessage);
+ return;
+ }
+ Transition *tr = static_cast <Transition*>(itemList.at(0));
+ tr->setAutomatic(!tr->isAutomatic());
+ QDomElement transition = tr->toXML();
+ m_document->renderer()->mltUpdateTransition(transition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), tr->startPos(), tr->endPos(), transition);
}
#include "customtrackview.moc"