]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
new icon for "add transition" handle
[kdenlive] / src / customtrackview.cpp
index 1fe7b94429f786f45de84bf0da5924083d03222b..25228bc7257164d3e62ebcfe4752929000f9ce41 100644 (file)
@@ -70,7 +70,7 @@
 // const int duration = animate ? 1500 : 1;
 
 CustomTrackView::CustomTrackView(KdenliveDoc *doc, QGraphicsScene * projectscene, QWidget *parent)
-        : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()), m_tool(SELECTTOOL), m_dragGuide(NULL), m_findIndex(0), m_menuPosition(QPoint()) {
+        : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()), m_tool(SELECTTOOL), m_dragGuide(NULL), m_findIndex(0), m_menuPosition(QPoint()), m_blockRefresh(false) {
     if (doc) m_commandStack = doc->commandStack();
     else m_commandStack == NULL;
     setMouseTracking(true);
@@ -125,11 +125,13 @@ void CustomTrackView::checkTrackHeight() {
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
             item = (ClipItem*) itemList.at(i);
-            item->setRect(item->rect().x(), item->track() * m_tracksHeight, item->rect().width(), m_tracksHeight - 1);
+            item->setRect(0, 0, item->rect().width(), m_tracksHeight - 1);
+            item->setPos((qreal) item->startPos().frames(m_document->fps()) * m_scale, (qreal) item->track() * m_tracksHeight);
             item->resetThumbs();
         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
             transitionitem = (Transition*) itemList.at(i);
-            transitionitem->setRect(transitionitem->rect().x(), transitionitem->track() * m_tracksHeight + m_tracksHeight / 2, transitionitem->rect().width(), m_tracksHeight - 1);
+            transitionitem->setRect(0, 0, transitionitem->rect().width(), m_tracksHeight / 3 * 2 - 1);
+            transitionitem->setPos((qreal) transitionitem->startPos().frames(m_document->fps()) * m_scale, (qreal) transitionitem->track() * m_tracksHeight + m_tracksHeight / 3 * 2);
         }
     }
     m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_tracksList.count());
@@ -216,7 +218,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
             } else if (m_operationMode == KEYFRAME) {
                 GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
                 double pos = mapToScene(event->pos()).toPoint().y();
-                QRectF br = m_dragItem->rect();
+                QRectF br = m_dragItem->sceneBoundingRect();
                 double maxh = 100.0 / br.height();
                 pos = (br.bottom() - pos) * maxh;
                 m_dragItem->updateKeyFramePos(keyFramePos, pos);
@@ -258,13 +260,14 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
         }
 
     if (item && event->buttons() == Qt::NoButton) {
-        AbstractClipItem *clip = (AbstractClipItem*) item;
+        AbstractClipItem *clip = static_cast <AbstractClipItem*>(item);
         if (m_tool == RAZORTOOL) {
             // razor tool over a clip, display current frame in monitor
-            if (item->type() == AVWIDGET) {
-                emit showClipFrame(((ClipItem *) item)->baseClip(), mapToScene(event->pos()).x() / m_scale - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
+            if (!m_blockRefresh && item->type() == AVWIDGET) {
+               //TODO: solve crash when showing frame when moving razor over clip
+                //emit showClipFrame(((ClipItem *) item)->baseClip(), mapToScene(event->pos()).x() / m_scale - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
             }
-            QGraphicsView::mouseMoveEvent(event);
+            event->accept();
             return;
         }
         opMode = clip->operationMode(mapToScene(event->pos()), m_scale);
@@ -287,11 +290,12 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
         } else if (opMode == RESIZESTART) {
             setCursor(KCursor("left_side", Qt::SizeHorCursor));
             if (m_visualTip == NULL) {
+                QRectF rect = clip->sceneBoundingRect();
                 QPolygon polygon;
-                polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
-                polygon << QPoint((int)(clip->rect().x() + size * 2), (int)(clip->rect().y() + clip->rect().height() / 2));
-                polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 + size * 2));
-                polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
+                polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 - size * 2));
+                polygon << QPoint((int)(rect.x() + size * 2), (int)(rect.y() + rect.height() / 2));
+                polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 + size * 2));
+                polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 - size * 2));
 
                 m_visualTip = new QGraphicsPolygonItem(polygon);
                 ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
@@ -303,21 +307,22 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_visualTip->setPos(0, 0);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, 1);
-                m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+                m_animation->setPosAt(.5, QPointF(rect.x() - rect.x() * scale, 0));
                 scale = 1.0;
                 m_animation->setScaleAt(1, scale, 1);
-                m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+                m_animation->setPosAt(1, QPointF(rect.x() - rect.x() * scale, 0));
                 scene()->addItem(m_visualTip);
                 m_animationTimer->start();
             }
         } else if (opMode == RESIZEEND) {
             setCursor(KCursor("right_side", Qt::SizeHorCursor));
             if (m_visualTip == NULL) {
+                QRectF rect = clip->sceneBoundingRect();
                 QPolygon polygon;
-                polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
-                polygon << QPoint((int)(clip->rect().x() + clip->rect().width() - size * 2), (int)(clip->rect().y() + clip->rect().height() / 2));
-                polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 + size * 2));
-                polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
+                polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 - size * 2));
+                polygon << QPoint((int)(rect.x() + rect.width() - size * 2), (int)(rect.y() + rect.height() / 2));
+                polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 + size * 2));
+                polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 - size * 2));
 
                 m_visualTip = new QGraphicsPolygonItem(polygon);
                 ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
@@ -330,17 +335,17 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_visualTip->setPos(0, 0);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, 1);
-                m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale - clip->rect().width(), 0));
+                m_animation->setPosAt(.5, QPointF(rect.x() - rect.x() * scale - rect.width(), 0));
                 scale = 1.0;
                 m_animation->setScaleAt(1, scale, 1);
-                m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+                m_animation->setPosAt(1, QPointF(rect.x() - rect.x() * scale, 0));
                 scene()->addItem(m_visualTip);
                 m_animationTimer->start();
             }
         } else if (opMode == FADEIN) {
             if (m_visualTip == NULL) {
                 ClipItem *item = (ClipItem *) clip;
-                m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->fadeIn() * m_scale - size, item->rect().y() - 8, size * 2, 16);
+                m_visualTip = new QGraphicsEllipseItem(item->pos().x() + item->fadeIn() * m_scale - size, item->pos().y() - 8, size * 2, 16);
                 ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                 ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
                 m_visualTip->setZValue(100);
@@ -350,10 +355,10 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_visualTip->setPos(0, 0);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, scale);
-                m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale -  item->fadeIn() * m_scale, item->rect().y() - item->rect().y() * scale));
+                m_animation->setPosAt(.5, QPointF(item->pos().x() - item->pos().x() * scale -  item->fadeIn() * m_scale, item->pos().y() - item->pos().y() * scale));
                 scale = 1.0;
                 m_animation->setScaleAt(1, scale, scale);
-                m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
+                m_animation->setPosAt(1, QPointF(item->pos().x() - item->pos().x() * scale, item->pos().y() - item->pos().y() * scale));
                 scene()->addItem(m_visualTip);
                 m_animationTimer->start();
             }
@@ -361,7 +366,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
         } else if (opMode == FADEOUT) {
             if (m_visualTip == NULL) {
                 ClipItem *item = (ClipItem *) clip;
-                m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->rect().width() - item->fadeOut() * m_scale - size, item->rect().y() - 8, size*2, 16);
+                m_visualTip = new QGraphicsEllipseItem(item->pos().x() + item->rect().width() - item->fadeOut() * m_scale - size, item->pos().y() - 8, size*2, 16);
                 ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                 ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
                 m_visualTip->setZValue(100);
@@ -371,16 +376,17 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_visualTip->setPos(0, 0);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, scale);
-                m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale - item->rect().width() + item->fadeOut() * m_scale, item->rect().y() - item->rect().y() * scale));
+                m_animation->setPosAt(.5, QPointF(item->pos().x() - item->pos().x() * scale - item->rect().width() + item->fadeOut() * m_scale, item->pos().y() - item->pos().y() * scale));
                 scale = 1.0;
                 m_animation->setScaleAt(1, scale, scale);
-                m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
+                m_animation->setPosAt(1, QPointF(item->pos().x() - item->pos().x() * scale, item->pos().y() - item->pos().y() * scale));
                 scene()->addItem(m_visualTip);
                 m_animationTimer->start();
             }
             setCursor(Qt::PointingHandCursor);
         } else if (opMode == TRANSITIONSTART) {
             if (m_visualTip == NULL) {
+                QRectF rect = clip->sceneBoundingRect();
                 m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
                 ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                 ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
@@ -388,7 +394,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_animation = new QGraphicsItemAnimation;
                 m_animation->setItem(m_visualTip);
                 m_animation->setTimeLine(m_animationTimer);
-                m_visualTip->setPos(clip->rect().x() + 10, clip->rect().y() + clip->rect().height() / 2 + 12);
+                m_visualTip->setPos(rect.x() + 10, rect.y() + rect.height() / 2 + 12);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, scale);
                 scale = 1.0;
@@ -399,6 +405,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
             setCursor(Qt::PointingHandCursor);
         } else if (opMode == TRANSITIONEND) {
             if (m_visualTip == NULL) {
+                QRectF rect = clip->sceneBoundingRect();
                 m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
                 ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
                 ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
@@ -406,7 +413,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 m_animation = new QGraphicsItemAnimation;
                 m_animation->setItem(m_visualTip);
                 m_animation->setTimeLine(m_animationTimer);
-                m_visualTip->setPos(clip->rect().x() + clip->rect().width() - 10 , clip->rect().y() + clip->rect().height() / 2 + 12);
+                m_visualTip->setPos(rect.x() + rect.width() - 10 , rect.y() + rect.height() / 2 + 12);
                 double scale = 2.0;
                 m_animation->setScaleAt(.5, scale, scale);
                 scale = 1.0;
@@ -420,7 +427,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
         }
     } // no clip under mouse
     else if (m_tool == RAZORTOOL) {
-        QGraphicsView::mouseMoveEvent(event);
+        event->accept();
         return;
     } else if (opMode == MOVEGUIDE) {
         m_moveOpMode = opMode;
@@ -446,20 +453,24 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
 // virtual
 void CustomTrackView::mousePressEvent(QMouseEvent * event) {
     m_menuPosition = QPoint();
-    activateMonitor();
+    m_blockRefresh = true;
+    if (m_tool != RAZORTOOL) activateMonitor();
     m_clickEvent = event->pos();
     QList<QGraphicsItem *> collisionList = items(event->pos());
     if (event->button() == Qt::MidButton) {
         m_document->renderer()->switchPlay();
+        m_blockRefresh = false;
         return;
     }
     if (event->modifiers() == Qt::ControlModifier && collisionList.count() == 0) {
         setDragMode(QGraphicsView::ScrollHandDrag);
         QGraphicsView::mousePressEvent(event);
+        m_blockRefresh = false;
         return;
     } else if (event->modifiers() == Qt::ShiftModifier && collisionList.count() == 0) {
         setDragMode(QGraphicsView::RubberBandDrag);
         QGraphicsView::mousePressEvent(event);
+        m_blockRefresh = false;
         return;
     } else {
         bool collision = false;
@@ -480,18 +491,17 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
                 QGraphicsItem *item = collisionList.at(i);
                 if (item->type() == AVWIDGET || item->type() == TRANSITIONWIDGET) {
                     if (m_tool == RAZORTOOL) {
+                        m_dragItem = NULL;
                         if (item->type() == TRANSITIONWIDGET) {
                             emit displayMessage(i18n("Cannot cut a transition"), ErrorMessage);
+                            event->accept();
                             return;
                         }
-                        AbstractClipItem *clip = (AbstractClipItem *) item;
-                        ItemInfo info;
-                        info.startPos = clip->startPos();
-                        info.endPos = clip->endPos();
-                        info.track = clip->track();
-                        RazorClipCommand* command = new RazorClipCommand(this, info, GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()), true);
+                        AbstractClipItem *clip = static_cast <AbstractClipItem *>(item);
+                        RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()), true);
                         m_commandStack->push(command);
                         m_document->setModified(true);
+                        event->accept(); //QGraphicsView::mousePressEvent(event);
                         return;
                     }
                     // select item
@@ -510,7 +520,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
 
                     m_dragItem = (AbstractClipItem *) item;
 
-                    m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale), (int)(event->pos().y() - m_dragItem->rect().top()));
+                    m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale), (int)(event->pos().y() - m_dragItem->pos().y()));
                     m_dragItemInfo.startPos = m_dragItem->startPos();
                     m_dragItemInfo.endPos = m_dragItem->endPos();
                     m_dragItemInfo.track = m_dragItem->track();
@@ -522,9 +532,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
                             m_selectedClipList.append(static_cast <AbstractClipItem *>(selected.at(i)));
                     }
 
-                    m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale);
+                    m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()), m_scale);
                     if (m_operationMode == KEYFRAME) {
                         m_dragItem->updateSelectedKeyFrame();
+                        m_blockRefresh = false;
                         return;
                     } else if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor);
                     else if (m_operationMode == TRANSITIONSTART) {
@@ -576,6 +587,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
         if (m_dragItem && m_dragItem->type() == AVWIDGET) emit clipItemSelected((ClipItem*) m_dragItem);
         else emit clipItemSelected(NULL);
     }
+    m_blockRefresh = false;
     //kDebug()<<pos;
     //QGraphicsView::mousePressEvent(event);
 }
@@ -805,41 +817,69 @@ void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect
 void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) {
     if (cut) {
         // cut clip
-        ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
-        if (!item) {
+        ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+        if (!item || cutTime >= item->endPos() || cutTime <= item->startPos()) {
             emit displayMessage(i18n("Cannot find clip to cut"), ErrorMessage);
+            kDebug() << "/////////  ERROR CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+            m_blockRefresh = false;
             return;
         }
+        kDebug() << "/////////  CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+
+        m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
         int cutPos = (int) cutTime.frames(m_document->fps());
         ItemInfo newPos;
         newPos.startPos = cutTime;
         newPos.endPos = info.endPos;
         newPos.cropStart = item->cropStart() + (cutTime - info.startPos);
         newPos.track = info.track;
+        ClipItem *dup = item->clone(m_scale, newPos);
+        kDebug() << "// REsizing item to: " << cutPos;
         item->resizeEnd(cutPos, m_scale);
-        ClipItem *dup = new ClipItem(item->baseClip(), newPos, m_scale, m_document->fps());
-        dup->setEffectList(item->effectList());
         scene()->addItem(dup);
-        m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
         item->baseClip()->addReference();
         m_document->updateClip(item->baseClip()->getId());
+        kDebug() << "/////////  CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+        kDebug() << "//  CUTTING CLIP dONE";
     } else {
         // uncut clip
+
         ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
-        ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()), info.track);
-        if (!item || !dup) {
+        ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()) + 1, info.track);
+        if (!item || !dup || item == dup) {
             emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage);
+            m_blockRefresh = false;
             return;
         }
+
+        kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")";
+        kDebug() << "// UNCUTTING CLIPS: ITEM 2 (" << dup->startPos().frames(25) << "x" << dup->endPos().frames(25) << ")";
+        kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;
+        //deleteClip(dup->info());
+
+
+        if (dup->isSelected()) emit clipItemSelected(NULL);
+        dup->baseClip()->removeReference();
+        m_document->updateClip(dup->baseClip()->getId());
+        scene()->removeItem(dup);
         delete dup;
-        item->baseClip()->removeReference();
-        m_document->updateClip(item->baseClip()->getId());
-        item->resizeEnd((int) info.endPos.frames(m_document->fps()), m_scale);
         m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, cutTime);
-        m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - info.track, info.startPos, item->cropStart(), item->cropStart() + info.endPos - info.startPos);
+
+        ItemInfo clipinfo = item->info();
+        clipinfo.track = m_tracksList.count() - clipinfo.track;
+        bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos);
+        if (success) {
+            item->resizeEnd((int) info.endPos.frames(m_document->fps()), m_scale);
+        } else
+            emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+
     }
+    QTimer::singleShot(3000, this, SLOT(slotEnableRefresh()));
 }
 
+void CustomTrackView::slotEnableRefresh() {
+    m_blockRefresh = false;
+}
 
 void CustomTrackView::slotAddTransitionToSelectedClips(QDomElement transition) {
     QList<QGraphicsItem *> itemList = scene()->selectedItems();
@@ -1050,10 +1090,10 @@ void CustomTrackView::checkScrolling() {
 }
 
 void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
+    QGraphicsView::mouseReleaseEvent(event);
     if (event->button() == Qt::MidButton) {
         return;
     }
-    QGraphicsView::mouseReleaseEvent(event);
     setDragMode(QGraphicsView::NoDrag);
     if (m_operationMode == MOVEGUIDE) {
         setCursor(Qt::ArrowCursor);
@@ -1070,10 +1110,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
         emit transitionItemSelected(NULL);
         return;
     }
-    ItemInfo info;
-    info.startPos = m_dragItem->startPos();
-    info.endPos = m_dragItem->endPos();
-    info.track = m_dragItem->track();
+    ItemInfo info = m_dragItem->info();
 
     if (m_operationMode == MOVE) {
         setCursor(Qt::OpenHandCursor);
@@ -1149,10 +1186,17 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
     } else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) {
         // resize start
         if (m_dragItem->type() == AVWIDGET) {
-            m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), m_dragItemInfo.startPos, m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
-            updateClipFade((ClipItem *) m_dragItem);
-            ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
-            m_commandStack->push(command);
+            ItemInfo resizeinfo = m_dragItemInfo;
+            resizeinfo.track = m_tracksList.count() - resizeinfo.track;
+            bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.startPos);
+            if (success) {
+                updateClipFade((ClipItem *) m_dragItem);
+                ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
+                m_commandStack->push(command);
+            } else {
+                m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_scale);
+                emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+            }
         } else if (m_dragItem->type() == TRANSITIONWIDGET) {
             MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
             m_commandStack->push(command);
@@ -1164,14 +1208,21 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
     } else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
         // resize end
         if (m_dragItem->type() == AVWIDGET) {
-            ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
-            m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - m_dragItem->track(), m_dragItem->startPos(), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
-            m_commandStack->push(command);
+            ItemInfo resizeinfo = info;
+            resizeinfo.track = m_tracksList.count() - 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);
+            } else {
+                m_dragItem->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps()), m_scale);
+                emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+            }
         } else if (m_dragItem->type() == TRANSITIONWIDGET) {
             MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
             m_commandStack->push(command);
             Transition *transition = (Transition *) m_dragItem;
-            m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+//             m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
         }
         //m_document->renderer()->doRefresh();
     } else if (m_operationMode == FADEIN) {
@@ -1251,6 +1302,7 @@ void CustomTrackView::deleteClip(ItemInfo info) {
     if (item->isSelected()) emit clipItemSelected(NULL);
     item->baseClip()->removeReference();
     m_document->updateClip(item->baseClip()->getId());
+    scene()->removeItem(item);
     delete item;
     m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, info.startPos);
     m_document->renderer()->doRefresh();
@@ -1294,7 +1346,8 @@ void CustomTrackView::changeClipSpeed() {
             ItemInfo info = item->info();
             int percent = QInputDialog::getInteger(this, i18n("Edit Clip Speed"), i18n("New speed (percents)"), 100, 1, 300);
             double speed = (double) percent / 100.0;
-            new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), true, changeSelected);
+            if (item->speed() != speed)
+                new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), true, changeSelected);
         }
     }
     m_commandStack->push(changeSelected);
@@ -1304,10 +1357,9 @@ void CustomTrackView::doChangeClipSpeed(ItemInfo info, double speed, int id) {
     DocClipBase *baseclip = m_document->clipManager()->getClipById(id);
     ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
     info.track = m_tracksList.count() - item->track();
-    int newLength = m_document->renderer()->mltChangeClipSpeed(info, speed, baseclip->producer());
-    GenTime maxDuration(newLength, m_document->fps());
-    item->setMaxDuration(maxDuration);
+    m_document->renderer()->mltChangeClipSpeed(info, speed, baseclip->producer());
     item->setSpeed(speed);
+    GenTime maxDuration = item->maxDuration();
     if (maxDuration < item->duration()) {
         info = item->info();
         ItemInfo endInfo = info;
@@ -1322,13 +1374,9 @@ void CustomTrackView::cutSelectedClips() {
     GenTime currentPos = GenTime(m_cursorPos, m_document->fps());
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
-            ClipItem *item = (ClipItem *) itemList.at(i);
-            ItemInfo info;
-            info.startPos = item->startPos();
-            info.endPos = item->endPos();
-            if (currentPos > info.startPos && currentPos <  info.endPos) {
-                info.track = item->track();
-                RazorClipCommand *command = new RazorClipCommand(this, info, currentPos, true);
+            ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
+            if (currentPos > item->startPos() && currentPos <  item->endPos()) {
+                RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos, true);
                 m_commandStack->push(command);
             }
         }
@@ -1456,13 +1504,21 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) {
         return;
     }
     if (resizeClipStart) {
-        m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), end.startPos, item->startPos(), item->cropStart() + end.startPos - start.startPos, item->cropStart() + end.startPos - start.startPos + item->endPos() - end.startPos);
-        item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale);
-        updateClipFade(item);
+        ItemInfo clipinfo = item->info();
+        clipinfo.track = m_tracksList.count() - clipinfo.track;
+        bool success = m_document->renderer()->mltResizeClipStart(clipinfo, item->startPos() - end.startPos);
+        if (success) {
+            item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale);
+            updateClipFade(item);
+        } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
     } else {
-        m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + end.endPos - item->startPos());
-        item->resizeEnd((int) end.endPos.frames(m_document->fps()), m_scale);
-        updateClipFade(item, true);
+        ItemInfo clipinfo = item->info();
+        clipinfo.track = m_tracksList.count() - clipinfo.track;
+        bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, end.endPos - clipinfo.startPos);
+        if (success) {
+            item->resizeEnd((int) end.endPos.frames(m_document->fps()), m_scale);
+            updateClipFade(item, true);
+        } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
     }
     m_document->renderer()->doRefresh();
 }
@@ -1873,7 +1929,8 @@ void CustomTrackView::setScale(double scaleFactor) {
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
             AbstractClipItem *clip = (AbstractClipItem *)itemList.at(i);
-            clip->setRect(clip->startPos().frames(m_document->fps()) * m_scale, clip->rect().y(), clip->duration().frames(m_document->fps()) * m_scale, clip->rect().height());
+            clip->setRect(0, 0, (qreal) clip->duration().frames(m_document->fps()) * m_scale - .5, clip->rect().height());
+            clip->setPos((qreal) clip->startPos().frames(m_document->fps()) * m_scale, clip->pos().y());
         }
     }
 
@@ -1988,7 +2045,7 @@ void CustomTrackView::copyClip() {
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
             ClipItem *dup = static_cast <ClipItem *>(itemList.at(i));
-            m_copiedItems.append(dup->clone(m_scale));
+            m_copiedItems.append(dup->clone(m_scale, dup->info()));
         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
             Transition *dup = static_cast <Transition *>(itemList.at(i));
             m_copiedItems.append(dup->clone(m_scale));