+ 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());
+ Ui::AddTrack_UI view;
+ 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) {
+ ix++;
+ }
+ 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;
+ }
+ AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true, true);
+ m_commandStack->push(addTrack);
+ m_document->setModified(true);
+ }
+}
+
+void CustomTrackView::slotDeleteTrack(int ix) {
+ bool ok;
+ ix = QInputDialog::getInteger(this, i18n("Remove Track"), i18n("Track"), ix, 0, m_document->tracksCount() - 1, 1, &ok);
+ if (ok) {
+ TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
+ deleteTimelineTrack(ix, info);
+ m_document->setModified(true);
+ /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false, true);
+ m_commandStack->push(command);*/
+ }
+}
+
+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"));
+
+ 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);
+ QList<QGraphicsItem *> selection = m_scene->items(r);
+ QUndoCommand *deleteTrack = new QUndoCommand();
+ deleteTrack->setText("Delete track");
+
+ // Delete all clips in selected track
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *item = static_cast <ClipItem *>(selection.at(i));
+ new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, true, deleteTrack);
+ m_scene->removeItem(item);
+ delete item;
+ item = NULL;
+ } else if (selection.at(i)->type() == TRANSITIONWIDGET) {
+ Transition *item = static_cast <Transition *>(selection.at(i));
+ new AddTransitionCommand(this, item->info(), item->transitionEndTrack(), item->toXML(), true, false, deleteTrack);
+ m_scene->removeItem(item);
+ delete item;
+ item = NULL;
+ }
+ }
+
+ new AddTrackCommand(this, ix, trackinfo, false, true, deleteTrack);
+ m_commandStack->push(deleteTrack);
+}
+
+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);