]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
331 fixed: Naming of tracks now Audio 1, Video 1, etc. http://www.kdenlive.org/mantis...
[kdenlive] / src / customtrackview.cpp
index cfdd5562635a7817ef32bf32b62909efec2b3a15..3ce7d0d8d9614be773a53ac31c991f634d05a49a 100644 (file)
@@ -130,7 +130,9 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
     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);
@@ -199,6 +201,7 @@ void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transi
     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);
@@ -229,6 +232,17 @@ void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transi
     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();
@@ -818,9 +832,12 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     while (!m_dragGuide && ct < collisionList.count()) {
         if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
             collisionClip = static_cast <AbstractClipItem *>(collisionList.at(ct));
-            if (collisionClip == m_dragItem) {
+            if (collisionClip->isItemLocked())
+                break;
+            if (collisionClip == m_dragItem)
                 collisionClip = NULL;
-            } else m_dragItem = collisionClip;
+            else
+                m_dragItem = collisionClip;
             found = true;
             m_dragItemInfo = m_dragItem->info();
             if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) {
@@ -2167,6 +2184,7 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
         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());
         }
@@ -2625,6 +2643,7 @@ void CustomTrackView::lockTrack(int ix, bool lock)
     int tracknumber = m_document->tracksCount() - ix - 1;
     m_document->switchTrackLock(tracknumber, lock);
     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);
 
     for (int i = 0; i < selection.count(); i++) {
@@ -2633,7 +2652,10 @@ void CustomTrackView::lockTrack(int ix, bool lock)
             if (selection.at(i)->type() == AVWIDGET) emit clipItemSelected(NULL);
             else emit transitionItemSelected(NULL);
         }
-        static_cast <AbstractClipItem *>(selection.at(i))->setItemLocked(lock);
+        clip = static_cast <AbstractClipItem *>(selection.at(i));
+        clip->setItemLocked(lock);
+        if (clip == m_dragItem)
+            m_dragItem = NULL;
     }
     kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked;
     viewport()->update();
@@ -2733,7 +2755,7 @@ void CustomTrackView::slotInsertSpace()
         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();
@@ -3557,6 +3579,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         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());
         }
@@ -4175,6 +4198,7 @@ void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end, b
         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());
         }
@@ -4493,6 +4517,18 @@ int CustomTrackView::hasGuide(int pos, int offset)
     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()) {
@@ -4891,7 +4927,7 @@ void CustomTrackView::pasteClip()
     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;
         }
@@ -5812,6 +5848,31 @@ int CustomTrackView::selectedTrack() const
     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);
@@ -5898,6 +5959,7 @@ void CustomTrackView::checkTrackSequence(int track)
 
 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());