]> git.sesse.net Git - kdenlive/commitdiff
Show error message when there is a problem deleting a clip, fix problem when selectin...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Dec 2008 10:08:03 +0000 (10:08 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Dec 2008 10:08:03 +0000 (10:08 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=417

svn path=/branches/KDE4/; revision=2741

src/abstractclipitem.cpp
src/abstractclipitem.h
src/abstractgroupitem.cpp
src/clipitem.cpp
src/customtrackview.cpp

index 9c8d7d94d8e545538eb811e82b2cd50f4fcf784b..eca35ba0d949d0da321560146b09d56fc112becf 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "abstractclipitem.h"
 #include "customtrackscene.h"
+#include "kdenlivesettings.h"
 
 AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1) {
     setFlags(/*QGraphicsItem::ItemClipsToShape | */QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
@@ -65,6 +66,11 @@ void AbstractClipItem::setCropStart(GenTime pos) {
     m_cropStart = pos;
 }
 
+void AbstractClipItem::updateItem() {
+    m_track = (int)(scenePos().y() / KdenliveSettings::trackheight());
+    m_startPos = GenTime((int) scenePos().x(), m_fps);
+}
+
 void AbstractClipItem::updateRectGeometry() {
     setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
 }
index dbc75d4792a21f723ab8fbbe7fe3849c020c4bf8..33138bfdff35f279fb39ae1103e71794ab57e37e 100644 (file)
@@ -41,6 +41,7 @@ public:
     ItemInfo info() const;
     CustomTrackScene* projectScene();
     void updateRectGeometry();
+    void updateItem();
 
     virtual  OPERATIONTYPE operationMode(QPointF pos) = 0;
     virtual GenTime startPos() const ;
index 5d581c22a5164a583995d5677565adf5a29e65ca..f7ee7bea1d24de899b78133fda2ea4637fbb23fb 100644 (file)
@@ -84,6 +84,7 @@ void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWi
 QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) {
     if (change == ItemPositionChange && scene()) {
         // calculate new position.
+        const int trackHeight = KdenliveSettings::trackheight();
         QPointF newPos = value.toPointF();
         int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
         xpos = qMax(xpos, 0);
@@ -93,12 +94,35 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant
         QPointF start = pos();//sceneBoundingRect().topLeft();
         int posx = start.x() + newPos.x(); //projectScene()->getSnapPointForPos(start.x() + sc.x(), KdenliveSettings::snaptopoints());
 
-        int startTrack = (start.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
-        int newTrack = (newPos.y()) / KdenliveSettings::trackheight();
+        int startTrack = (start.y() + trackHeight / 2) / trackHeight;
+        int newTrack = (newPos.y()) / trackHeight;
         //kDebug()<<"// GROUP NEW T:"<<newTrack<<",START T:"<<startTrack<<",MAX:"<<projectScene()->tracksCount() - 1;
-        newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / KdenliveSettings::trackheight());
+        newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / trackHeight);
         newTrack = qMax(newTrack, 0);
-        newPos.setY((int)((newTrack) * KdenliveSettings::trackheight()));
+
+        // Check if top item is a clip or a transition
+        int offset = 0;
+        int topTrack = -1;
+        QList<QGraphicsItem *> children = childItems();
+        for (int i = 0; i < children.count(); i++) {
+            int currentTrack = (int)(children.at(i)->scenePos().y() / trackHeight);
+            if (children.at(i)->type() == AVWIDGET) {
+                kDebug() << "// CLIP ITEM TRK: " << currentTrack << "; POS: " << children.at(i)->scenePos().y();
+                if (topTrack == -1 || currentTrack <= topTrack) {
+                    offset = 0;
+                    topTrack = currentTrack;
+                }
+            } else if (children.at(i)->type() == TRANSITIONWIDGET) {
+                kDebug() << "// TRANS ITEM TRK: " << currentTrack << "; POS: " << children.at(i)->scenePos().y();
+                if (topTrack == -1 || currentTrack < topTrack) {
+                    offset = (int)(trackHeight / 3 * 2 - 1);
+                    topTrack = currentTrack;
+                }
+            }
+        }
+        kDebug() << "// OFFSET: " << offset << "\n------------------------------------\n------------";
+
+        newPos.setY((int)((newTrack) * trackHeight) + offset);
 
         //kDebug() << "------------------------------------GRUOP MOVE";
 
@@ -109,7 +133,6 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant
 
         QPolygonF sceneShape = groupShape(newPos - pos());
         QList<QGraphicsItem*> collindingItems = scene()->items(sceneShape, Qt::IntersectsItemShape);
-        QList<QGraphicsItem *> children = childItems();
         for (int i = 0; i < children.count(); i++) {
             collindingItems.removeAll(children.at(i));
         }
index d1b277c16430f657d8a0ad461e2c6d1402ce746b..3f86891f9c925f57aba085e2001d85889918efb7 100644 (file)
@@ -1000,7 +1000,6 @@ void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b
     if (m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect);
 }
 
-
 //virtual
 QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
     if (change == ItemPositionChange && scene()) {
@@ -1011,7 +1010,7 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
         int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
         xpos = qMax(xpos, 0);
         newPos.setX(xpos);
-        int newTrack = (newPos.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
+        int newTrack = newPos.y() / KdenliveSettings::trackheight();
         newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
         newTrack = qMax(newTrack, 0);
         newPos.setY((int)(newTrack  * KdenliveSettings::trackheight() + 1));
index 6c7829be0044fa1fa5026155a4b60b3389f6e686..1d7752b301b17adda2757afc2b9b694fe33c72e2 100644 (file)
@@ -1086,6 +1086,10 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) {
             m_blockRefresh = false;
             return;
         }
+        if (m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, cutTime) == false) {
+            emit displayMessage(i18n("Error removing clip at %1 on track %2", cutTime.frames(m_document->fps()), info.track), ErrorMessage);
+            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) << ")";
@@ -1098,7 +1102,6 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) {
         m_document->updateClip(dup->baseClip()->getId());
         scene()->removeItem(dup);
         delete dup;
-        m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, cutTime);
 
         ItemInfo clipinfo = item->info();
         clipinfo.track = m_scene->m_tracksList.count() - clipinfo.track;
@@ -1554,9 +1557,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                     AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
                     ItemInfo info = item->info();
                     if (item->type() == AVWIDGET) {
-                        ClipItem *clip = static_cast <ClipItem*>(item);
-                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
-                        m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos);
+                        if (m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos) == false) {
+                            // error, clip cannot be removed from playlist
+                            emit displayMessage(i18n("Error removing clip at %1 on track %2", info.startPos.frames(m_document->fps()), info.track), ErrorMessage);
+                        } else {
+                            // clip removed from playlist, create command
+                            ClipItem *clip = static_cast <ClipItem*>(item);
+                            new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
+                        }
                     } else {
                         Transition *tr = static_cast <Transition*>(item);
                         new AddTransitionCommand(this, info, tr->transitionEndTrack(), tr->toXML(), true, false, moveClips);
@@ -1567,10 +1575,11 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 for (int i = 0; i < items.count(); i++) {
                     // re-add items in correct place
                     AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
+                    item->updateItem();
                     ItemInfo info = item->info();
-                    info.startPos = info.startPos + timeOffset;
+                    /*info.startPos = info.startPos + timeOffset;
                     info.endPos = info.endPos + timeOffset;
-                    info.track = info.track + trackOffset;
+                    info.track = info.track + trackOffset;*/
                     if (item->type() == AVWIDGET) {
                         ClipItem *clip = static_cast <ClipItem*>(item);
                         new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, false, moveClips);
@@ -1699,8 +1708,9 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
 
 void CustomTrackView::deleteClip(ItemInfo info) {
     ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
-    if (!item) {
-        kDebug() << "----------------  ERROR, CANNOT find clip to delete at...";// << rect.x();
+
+    if (!item || m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos) == false) {
+        emit displayMessage(i18n("Error removing clip at %1 on track %2", info.startPos.frames(m_document->fps()), info.track), ErrorMessage);
         return;
     }
     if (item->isSelected()) emit clipItemSelected(NULL);
@@ -1719,7 +1729,6 @@ void CustomTrackView::deleteClip(ItemInfo info) {
     scene()->removeItem(item);
     if (m_dragItem == item) m_dragItem = NULL;
     delete item;
-    m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos);
     m_document->renderer()->doRefresh();
 }