]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
const'ify
[kdenlive] / src / customtrackview.cpp
index 7178b2f5e7d8b379e7d83c6172b958722029c6c3..7cc622012bf50053a6491d8c30e8146aad223d24 100644 (file)
@@ -239,7 +239,7 @@ void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transi
     m_markerMenu = new QMenu(i18n("Go to marker..."), this);
     m_markerMenu->setEnabled(false);
     markermenu->addMenu(m_markerMenu);
-    connect(m_markerMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotGoToMarker(QAction *)));
+    connect(m_markerMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotGoToMarker(QAction*)));
     QList <QAction *> list = m_timelineContextClipMenu->actions();
     for (int i = 0; i < list.count(); i++) {
         if (list.at(i)->data().toString() == "paste_effects") m_pasteEffectsAction = list.at(i);
@@ -422,6 +422,11 @@ void CustomTrackView::slotAlignPlayheadToMousePos()
        seekCursorPos(mappedXPos);
 }
 
+int CustomTrackView::getMousePos() const
+{
+    return qMax((int)(mapToScene(mapFromGlobal(QCursor::pos())).x() + 0.5), 0);
+}
+
 // virtual
 void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 {
@@ -511,7 +516,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 
             // Make sure there is no collision
             QList<QGraphicsItem *> children = m_selectionGroup->childItems();
-            QPainterPath shape = m_selectionGroup->clipGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0));
+            QPainterPath shape = m_selectionGroup->clipGroupSpacerShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0));
             QList<QGraphicsItem*> collidingItems = scene()->items(shape, Qt::IntersectsItemShape);
             collidingItems.removeAll(m_selectionGroup);
             for (int i = 0; i < children.count(); i++) {
@@ -537,7 +542,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
             }
             snappedPos += offset;
             // make sure we have no collision
-            shape = m_selectionGroup->clipGroupShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0));
+            shape = m_selectionGroup->clipGroupSpacerShape(QPointF(snappedPos - m_selectionGroup->sceneBoundingRect().left(), 0));
             collidingItems = scene()->items(shape, Qt::IntersectsItemShape);
             collidingItems.removeAll(m_selectionGroup);
             for (int i = 0; i < children.count(); i++) {
@@ -825,6 +830,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     bool found = false;
     QStringList lockedTracks;
     double yOffset = 0;
+    m_selectionMutex.lock();
     while (!m_dragGuide && ct < collisionList.count()) {
         if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
             collisionClip = static_cast <AbstractClipItem *>(collisionList.at(ct));
@@ -923,7 +929,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         displayContextMenu(event->globalPos(), m_dragItem, dragGroup);
         m_menuPosition = m_clickEvent;
     }
-
+    m_selectionMutex.unlock();
     // No item under click
     if (m_dragItem == NULL || m_tool == SPACERTOOL) {
         resetSelectionGroup(false);
@@ -960,6 +966,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
 
             QList <GenTime> offsetList;
             // create group to hold selected items
+           m_selectionMutex.lock();
             m_selectionGroup = new AbstractGroupItem(m_document->fps());
             scene()->addItem(m_selectionGroup);
 
@@ -985,6 +992,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                 }
             }
             m_spacerOffset = m_selectionGroup->sceneBoundingRect().left() - (int)(mapToScene(m_clickEvent).x());
+           m_selectionMutex.unlock();
             if (!offsetList.isEmpty()) {
                 qSort(offsetList);
                 QList <GenTime> cleandOffsetList;
@@ -1076,11 +1084,12 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
            m_dragItem = NULL;
        }
         groupSelectedItems(QList <QGraphicsItem*>(), false, true);
+       m_selectionMutex.lock();
        if (m_selectionGroup) {
            m_selectionGroup->setProperty("y_absolute", yOffset);
            m_selectionGroup->setProperty("locked_tracks", lockedTracks);
        }
-       
+       m_selectionMutex.unlock();
        if (m_dragItem) { 
            ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
            updateClipTypeActions(dragGroup == NULL ? clip : NULL);
@@ -1090,6 +1099,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     }
     else {
        QGraphicsView::mousePressEvent(event);
+       m_selectionMutex.lock();
        if (m_selectionGroup) {
            QList<QGraphicsItem *> children = m_selectionGroup->childItems();
            for (int i = 0; i < children.count(); i++) {
@@ -1102,6 +1112,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             dragGroup->setSelected(itemSelected);
        }
        m_dragItem->setSelected(itemSelected);
+       m_selectionMutex.unlock();
     }
 
     if (collisionClip != NULL || m_dragItem == NULL) {
@@ -1139,6 +1150,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         else
             updateSnapPoints(m_dragItem);
     } else {
+       m_selectionMutex.lock();
         QList <GenTime> offsetList;
         QList<QGraphicsItem *> children = m_selectionGroup->childItems();
         for (int i = 0; i < children.count(); i++) {
@@ -1160,6 +1172,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             }
             updateSnapPoints(NULL, cleandOffsetList, true);
         }
+        m_selectionMutex.unlock();
     }
 
     if (m_operationMode == KEYFRAME) {
@@ -1259,18 +1272,22 @@ void CustomTrackView::rebuildGroup(int childTrack, GenTime childPos)
 void CustomTrackView::rebuildGroup(AbstractGroupItem *group)
 {
     if (group) {
+       m_selectionMutex.lock();
+       if (group == m_selectionGroup) m_selectionGroup = NULL;
         QList <QGraphicsItem *> children = group->childItems();
         m_document->clipManager()->removeGroup(group);
        for (int i = 0; i < children.count(); i++) {
            group->removeFromGroup(children.at(i));
        }
        scene()->destroyItemGroup(group);
+       m_selectionMutex.unlock();
         groupSelectedItems(children, group != m_selectionGroup, true);
     }
 }
 
 void CustomTrackView::resetSelectionGroup(bool selectItems)
 {
+    QMutexLocker lock(&m_selectionMutex);
     if (m_selectionGroup) {
         // delete selection group
         bool snap = KdenliveSettings::snaptopoints();
@@ -1298,6 +1315,7 @@ void CustomTrackView::resetSelectionGroup(bool selectItems)
 
 void CustomTrackView::groupSelectedItems(QList <QGraphicsItem *> selection, bool createNewGroup, bool selectNewGroup)
 {
+    QMutexLocker lock(&m_selectionMutex);
     if (m_selectionGroup) {
         kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP";
         return;
@@ -1374,6 +1392,7 @@ void CustomTrackView::groupSelectedItems(QList <QGraphicsItem *> selection, bool
            }
            AbstractGroupItem *grp = static_cast<AbstractGroupItem *>(value);
            m_document->clipManager()->removeGroup(grp);
+           if (grp == m_selectionGroup) m_selectionGroup = NULL;
            scene()->destroyItemGroup(grp);
        }
 
@@ -1664,6 +1683,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
     m_scene->clearSelection();
     m_dragItem = NULL;
     resetSelectionGroup(false);
+    QMutexLocker lock(&m_selectionMutex);
     if (track < 0 || track > m_document->tracksCount() - 1 || m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) return true;
     if (data->hasFormat("kdenlive/clip")) {    
         QStringList list = QString(data->data("kdenlive/clip")).split(';');
@@ -1884,9 +1904,11 @@ void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
             return;
         }
         EffectsParameterList params = clip->addEffect(effect);
-        if (!m_document->renderer()->mltAddEffect(track, pos, params))
+        if (!m_document->renderer()->mltAddEffect(track, pos, params)) {
             emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
-       clip->setSelectedEffect(params.paramValue("kdenlive_ix").toInt());
+           clip->deleteEffect(params.paramValue("kdenlive_ix"));
+       }
+       else clip->setSelectedEffect(params.paramValue("kdenlive_ix").toInt());
         if (clip->isMainSelectedClip()) emit clipItemSelected(clip);
     } else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage);
 }
@@ -2749,6 +2771,7 @@ void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event)
         m_thumbsTimer.stop();
         m_waitingThumbs.clear();
         QList<QGraphicsItem *> items;
+       QMutexLocker lock(&m_selectionMutex);
        if (m_selectionGroup) items = m_selectionGroup->childItems();
        else if (m_dragItem) items.append(m_dragItem);
         qDeleteAll(items);
@@ -3041,7 +3064,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
         QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY);
         QList<QGraphicsItem *> selection = m_scene->items(r);
         resetSelectionGroup();
-
+       m_selectionMutex.lock();
         m_selectionGroup = new AbstractGroupItem(m_document->fps());
         scene()->addItem(m_selectionGroup);
         for (int i = 0; i < selection.count(); i++) {
@@ -3093,7 +3116,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
            if (tr) tr->setForcedTrack(info.forceTrack, info.a_track);
            else kDebug()<<"// Cannot update TRANSITION AT: "<<info.b_track<<" / "<<info.startPos.frames(m_document->fps()); 
        }
-       
+       m_selectionMutex.unlock();
         resetSelectionGroup(false);
         m_document->renderer()->unlockService(tractor);
     }
@@ -3125,7 +3148,7 @@ void CustomTrackView::removeTrack(int ix)
     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);
-
+    m_selectionMutex.lock();
     m_selectionGroup = new AbstractGroupItem(m_document->fps());
     scene()->addItem(m_selectionGroup);
     for (int i = 0; i < selection.count(); i++) {
@@ -3168,6 +3191,7 @@ void CustomTrackView::removeTrack(int ix)
             }
         }
     }
+    m_selectionMutex.unlock();
     resetSelectionGroup(false);
     m_document->renderer()->unlockService(tractor);
 
@@ -3487,6 +3511,7 @@ void CustomTrackView::insertSpace(QList<ItemInfo> clipsToMove, QList<ItemInfo> t
 {
     int diff = duration.frames(m_document->fps());
     resetSelectionGroup();
+    m_selectionMutex.lock();
     m_selectionGroup = new AbstractGroupItem(m_document->fps());
     scene()->addItem(m_selectionGroup);
     ClipItem *clip;
@@ -3543,6 +3568,7 @@ void CustomTrackView::insertSpace(QList<ItemInfo> clipsToMove, QList<ItemInfo> t
             }
         }
     }
+    m_selectionMutex.unlock();
     resetSelectionGroup(false);
     if (track != -1)
         track = m_document->tracksCount() - track;
@@ -4504,6 +4530,7 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
             if (clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) {
                 AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(clip->parentItem());
                 m_document->clipManager()->removeGroup(grp);
+               if (grp == m_selectionGroup) m_selectionGroup = NULL;
                 scene()->destroyItemGroup(grp);
             }
             clip->setFlag(QGraphicsItem::ItemIsMovable, true);
@@ -4514,7 +4541,9 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
             if (tr->parentItem() && tr->parentItem()->type() == GROUPWIDGET) {
                 AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(tr->parentItem());
                 m_document->clipManager()->removeGroup(grp);
+               if (grp == m_selectionGroup) m_selectionGroup = NULL;
                 scene()->destroyItemGroup(grp);
+               grp = NULL;
             }
             tr->setFlag(QGraphicsItem::ItemIsMovable, true);
         }
@@ -4806,7 +4835,7 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
     // Group Items
     resetSelectionGroup();
     m_scene->clearSelection();
-
+    m_selectionMutex.lock();
     m_selectionGroup = new AbstractGroupItem(m_document->fps());
     scene()->addItem(m_selectionGroup);
 
@@ -4904,7 +4933,7 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
                 m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
             }
         }
-
+       m_selectionMutex.unlock();
         resetSelectionGroup(false);
        for (int i = 0; i < groupList.count(); i++) {
            rebuildGroup(groupList.at(i));
@@ -5196,18 +5225,18 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
                 QDomElement xml = transition->toXML();
                 m_document->renderer()->mltUpdateTransition(xml.attribute("tag"), xml.attribute("tag"), xml.attribute("transition_btrack").toInt(), m_document->tracksCount() - xml.attribute("transition_atrack").toInt(), transition->startPos(), transition->endPos(), xml);
                 new EditTransitionCommand(this, transition->track(), transition->startPos(), old, xml, false, command);
-               ItemInfo info = transition->info();
-               QPoint p;
-               ClipItem *transitionClip = getClipItemAt(info.startPos, info.track);
-               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());
-               }
-               emit transitionItemSelected(transition, getPreviousVideoTrack(info.track), p, true);
             }
+            ItemInfo info = transition->info();
+           QPoint p;
+           ClipItem *transitionClip = getClipItemAt(info.startPos, info.track);
+           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());
+           }
+           emit transitionItemSelected(transition, getPreviousVideoTrack(info.track), p, true);
             new MoveTransitionCommand(this, oldInfo, info, false, command);
         }
     }
@@ -6910,6 +6939,7 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, EffectsList ef
         }
         clip->setFlag(QGraphicsItem::ItemIsMovable, true);
         m_document->clipManager()->removeGroup(grp);
+       if (grp == m_selectionGroup) m_selectionGroup = NULL;
         scene()->destroyItemGroup(grp);
     }
 }
@@ -7162,6 +7192,7 @@ void CustomTrackView::updateProjectFps()
             }
             m_document->clipManager()->removeGroup(grp);
             m_scene->addItem(grp);
+           if (grp == m_selectionGroup) m_selectionGroup = NULL;
             scene()->destroyItemGroup(grp);
             scene()->clearSelection();
             /*for (int j = 0; j < children.count(); j++) {