setLineWidth(0);
//setCacheMode(QGraphicsView::CacheBackground);
//setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+ setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
+ pixmapCache = new KPixmapCache("kdenlive-thumbs");
KdenliveSettings::setTrackheight(m_tracksHeight);
m_animationTimer = new QTimeLine(800);
m_animationTimer->setFrameRange(0, 5);
m_timelineContextMenu = timeline;
m_timelineContextClipMenu = clip;
m_clipTypeGroup = clipTypeGroup;
+ connect(m_timelineContextMenu, SIGNAL(aboutToHide()), this, SLOT(slotResetMenuPosition()));
m_markerMenu = new QMenu(i18n("Go to marker..."), this);
m_markerMenu->setEnabled(false);
m_timelineContextMenu->addAction(m_editGuide);
}
+void CustomTrackView::slotDoResetMenuPosition()
+{
+ m_menuPosition = QPoint();
+}
+
+void CustomTrackView::slotResetMenuPosition()
+{
+ // after a short time (so that the action is triggered / or menu is closed, we reset the menu pos
+ QTimer::singleShot(300, this, SLOT(slotDoResetMenuPosition()));
+}
+
void CustomTrackView::checkAutoScroll()
{
m_autoScroll = KdenliveSettings::autoscroll();
item = m_dragItem;
} else {
if (m_scene->selectedItems().count() == 1) {
- item = static_cast <AbstractClipItem *> (m_scene->selectedItems().at(0));
+ item = static_cast <AbstractClipItem *>(m_scene->selectedItems().at(0));
} else {
if (m_scene->selectedItems().empty()) {
emit displayMessage(i18n("Cannot find clip to edit"), ErrorMessage);
void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
{
//kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
- EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false);
+ QDomElement xml = tr->toXML();
+ if (old.isNull() || xml.isNull()) {
+ emit displayMessage(i18n("Cannot update transition"), ErrorMessage);
+ return;
+ }
+ EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, xml, false);
m_commandStack->push(command);
setDocumentModified();
}
kWarning() << "Unable to find transition at pos :" << pos.frames(m_document->fps()) << ", ON track: " << track;
return;
}
- 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);
+ bool force = false;
+ 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);
if (updateTransitionWidget) {
if (transitionClip && transitionClip->baseClip()) {
QString size = transitionClip->baseClip()->getProperty("frame_size");
double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble();
+ if (factor == 0) factor = 1.0;
p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5));
p.setY(size.section('x', 1, 1).toInt());
}
pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps());
track = (int)(mapToScene(m_menuPosition).y() / m_tracksHeight) + 1;
}
- SpacerDialog d(GenTime(65, m_document->fps()), m_document->timecode(), track, m_document->tracksCount(), this);
+ SpacerDialog d(GenTime(65, m_document->fps()), m_document->timecode(), track, m_document->tracksCount() + 1, this);
if (d.exec() != QDialog::Accepted) return;
GenTime spaceDuration = d.selectedDuration();
track = d.selectedTrack();
if (transitionClip && transitionClip->baseClip()) {
QString size = transitionClip->baseClip()->getProperty("frame_size");
double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble();
+ if (factor == 0) factor = 1.0;
p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5));
p.setY(size.section('x', 1, 1).toInt());
}
if (transitionClip && transitionClip->baseClip()) {
QString size = transitionClip->baseClip()->getProperty("frame_size");
double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble();
+ if (factor == 0) factor = 1.0;
p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5));
p.setY(size.section('x', 1, 1).toInt());
}
return -1;
}
+void CustomTrackView::buildGuidesMenu(QMenu *goMenu) const
+{
+ QAction *act;
+ goMenu->clear();
+ double fps = m_document->fps();
+ for (int i = 0; i < m_guides.count(); i++) {
+ act = goMenu->addAction(m_guides.at(i)->label() + "/" + Timecode::getStringTimecode(m_guides.at(i)->position().frames(fps), fps));
+ act->setData(m_guides.at(i)->position().frames(m_document->fps()));
+ }
+ goMenu->setEnabled(!m_guides.isEmpty());
+}
+
void CustomTrackView::editGuide(const GenTime oldPos, const GenTime pos, const QString &comment)
{
if (oldPos > GenTime() && pos > GenTime()) {
return true;
}
+
void CustomTrackView::pasteClip()
{
if (m_copiedItems.count() == 0) {
QPoint position;
if (m_menuPosition.isNull()) {
position = mapFromGlobal(QCursor::pos());
- if (!underMouse() || position.y() > m_tracksHeight * m_document->tracksCount()) {
+ if (!contentsRect().contains(position) || mapToScene(position).y() / m_tracksHeight > m_document->tracksCount()) {
emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage);
return;
}
} else position = m_menuPosition;
+
GenTime pos = GenTime((int)(mapToScene(position).x()), m_document->fps());
- int track = (int)(position.y() / m_tracksHeight);
- ItemInfo first = m_copiedItems.at(0)->info();
+ int track = (int)(mapToScene(position).y() / m_tracksHeight);
+
+ GenTime leftPos = m_copiedItems.at(0)->startPos();
+ int lowerTrack = m_copiedItems.at(0)->track();
+ int upperTrack = m_copiedItems.at(0)->track();
+ for (int i = 1; i < m_copiedItems.count(); i++) {
+ if (m_copiedItems.at(i)->startPos() < leftPos) leftPos = m_copiedItems.at(i)->startPos();
+ if (m_copiedItems.at(i)->track() < lowerTrack) lowerTrack = m_copiedItems.at(i)->track();
+ if (m_copiedItems.at(i)->track() > upperTrack) upperTrack = m_copiedItems.at(i)->track();
+ }
- GenTime offset = pos - first.startPos;
- int trackOffset = track - first.track;
+ GenTime offset = pos - leftPos;
+ int trackOffset = track - lowerTrack;
+ if (lowerTrack + trackOffset < 0) trackOffset = 0 - lowerTrack;
+ if (upperTrack + trackOffset > m_document->tracksCount() - 1) trackOffset = m_document->tracksCount() - upperTrack - 1;
if (!canBePasted(m_copiedItems, offset, trackOffset)) {
emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage);
return;
return m_selectedTrack;
}
+QStringList CustomTrackView::selectedClips() const
+{
+ QStringList clipIds;
+ QList<QGraphicsItem *> selection = m_scene->selectedItems();
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *item = (ClipItem *)selection.at(i);
+ clipIds << item->clipProducer();
+ }
+ }
+ return clipIds;
+}
+
+QList<ClipItem *> CustomTrackView::selectedClipItems() const
+{
+ QList<ClipItem *> clips;
+ QList<QGraphicsItem *> selection = m_scene->selectedItems();
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ clips.append((ClipItem *)selection.at(i));
+ }
+ }
+ return clips;
+}
+
void CustomTrackView::slotSelectTrack(int ix)
{
m_selectedTrack = qMax(0, ix);
void CustomTrackView::insertZoneOverwrite(QStringList data, int in)
{
+ if (data.isEmpty()) return;
DocClipBase *clip = m_document->getBaseClip(data.at(0));
ItemInfo info;
info.startPos = GenTime(in, m_document->fps());