From: Jean-Baptiste Mardelle Date: Tue, 27 Oct 2009 15:28:42 +0000 (+0000) Subject: animate clip deletion (Qt 4.3) X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=771bc1441771b8d45e51cdef07ef7bc180251ba1;p=kdenlive animate clip deletion (Qt 4.3) svn path=/trunk/kdenlive/; revision=4069 --- diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index c3149852..7e7e329d 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -37,6 +37,9 @@ AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, doub m_selectedKeyframe(0), m_keyframeFactor(1), m_fps(fps) +#if QT_VERSION >= 0x040600 + , m_closeAnimation(NULL) +#endif { setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); #if QT_VERSION >= 0x040600 @@ -44,6 +47,33 @@ AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, doub #endif } +AbstractClipItem::~AbstractClipItem() +{ +#if QT_VERSION >= 0x040600 + if (m_closeAnimation) delete m_closeAnimation; +#endif +} + +void AbstractClipItem::closeAnimation() +{ +#if QT_VERSION >= 0x040600 + if (m_closeAnimation) return; + m_closeAnimation = new QPropertyAnimation(this, "rect"); + connect(m_closeAnimation, SIGNAL(finished()), this, SLOT(deleteLater())); + m_closeAnimation->setDuration(200); + QRectF r = rect(); + QRectF r2 = r; + r2.setLeft(r.left() + r.width() / 2); + r2.setTop(r.top() + r.height() / 2); + r2.setWidth(1); + r2.setHeight(1); + m_closeAnimation->setStartValue(r); + m_closeAnimation->setEndValue(r2); + m_closeAnimation->setEasingCurve(QEasingCurve::InQuad); + m_closeAnimation->start(); +#endif +} + ItemInfo AbstractClipItem::info() const { ItemInfo info = m_info; diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index 09fd98d4..7cf0d5fa 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -22,17 +22,28 @@ #define ABSTRACTCLIPITEM #include +#include + +#if QT_VERSION >= 0x040600 +#include +#endif + #include "definitions.h" #include "gentime.h" class CustomTrackScene; class QGraphicsSceneMouseEvent; -class AbstractClipItem : public QObject , public QGraphicsRectItem +class AbstractClipItem : public QObject, public QGraphicsRectItem { Q_OBJECT +#if QT_VERSION >= 0x040600 + Q_PROPERTY(QRectF rect READ rect WRITE setRect) +#endif + public: AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps); + virtual ~ AbstractClipItem(); void updateSelectedKeyFrame(); void updateKeyFramePos(const GenTime pos, const double value); void addKeyFrame(const GenTime pos, const double value); @@ -46,7 +57,8 @@ public: void updateItem(); void setItemLocked(bool locked); bool isItemLocked() const; - + void closeAnimation(); + virtual OPERATIONTYPE operationMode(QPointF pos) = 0; virtual GenTime startPos() const ; virtual void setTrack(int track); @@ -79,6 +91,11 @@ protected: void drawKeyFrames(QPainter *painter, QRectF exposedRect); int mouseOverKeyFrames(QPointF pos, double maxOffset); virtual void mousePressEvent(QGraphicsSceneMouseEvent * event); + +private: +#if QT_VERSION >= 0x040600 + QPropertyAnimation *m_closeAnimation; +#endif }; #endif diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 71687d87..5c21201c 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -116,6 +116,7 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i ClipItem::~ClipItem() { blockSignals(true); + if (scene()) scene()->removeItem(this); if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) { disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage))); disconnect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData())); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 4dd28fd6..5658ceec 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -3287,9 +3287,14 @@ void CustomTrackView::deleteClip(ItemInfo info, bool refresh) }*/ m_waitingThumbs.removeAll(item); if (m_dragItem == item) m_dragItem = NULL; - scene()->removeItem(item); +#if QT_VERSION >= 0x040600 + // animate item deletion + item->closeAnimation(); +#else delete item; item = NULL; +#endif + setDocumentModified(); if (refresh) m_document->renderer()->doRefresh(); } diff --git a/src/transition.cpp b/src/transition.cpp index faca57f4..84507918 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -66,6 +66,8 @@ Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDo Transition::~Transition() { + blockSignals(true); + if (scene()) scene()->removeItem(this); } Transition *Transition::clone()