#include "kdenlivesettings.h"
#include "kthumb.h"
#include "profilesdialog.h"
-#ifdef QJSON
+#ifdef USE_QJSON
#include "rotoscoping/rotowidget.h"
#endif
connect(&m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
m_endThumbTimer.setSingleShot(true);
connect(&m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
-
- connect(this, SIGNAL(getThumb(int, int)), m_clip, SLOT(slotExtractImage(int, int)));
-
connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage)));
connect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
if (generateThumbs) QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
} else if (m_clipType == IMAGE || m_clipType == TEXT) {
m_baseColor = QColor(141, 166, 215);
if (m_clipType == TEXT) {
- connect(this, SIGNAL(getThumb(int, int)), m_clip, SLOT(slotExtractImage(int, int)));
connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage)));
}
//m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
ClipItem::~ClipItem()
{
blockSignals(true);
+ m_endThumbTimer.stop();
+ m_startThumbTimer.stop();
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)));
if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix);
else if (m_clipType != COLOR) {
if (info.cropStart == m_info.cropStart) duplicate->slotSetStartThumb(m_startPix);
- if (info.cropStart + (info.endPos - info.startPos) == m_info.cropStart + (m_info.endPos - m_info.startPos)) duplicate->slotSetEndThumb(m_endPix);
+ if (info.cropStart + (info.endPos - info.startPos) == m_info.cropStart + m_info.cropDuration) {
+ duplicate->slotSetEndThumb(m_endPix);
+ }
}
//kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps);
duplicate->setEffectList(m_effectList);
m_endPix = QPixmap();
m_audioThumbCachePic.clear();
}
- kDebug()<<"........... RESET THMBS";
slotFetchThumbs();
}
return;
}
- if (m_endPix.isNull() && m_startPix.isNull()) {
+ QList <int> frames;
+ if (m_startPix.isNull()) {
m_startThumbRequested = true;
+ frames.append((int)m_speedIndependantInfo.cropStart.frames(m_fps));
+ }
+
+ if (m_endPix.isNull()) {
m_endThumbRequested = true;
- emit getThumb((int)m_speedIndependantInfo.cropStart.frames(m_fps), (int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1);
- } else {
- if (m_endPix.isNull()) {
- slotGetEndThumb();
- }
- if (m_startPix.isNull()) {
- slotGetStartThumb();
- }
+ frames.append((int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1);
}
+
+ if (!frames.isEmpty()) m_clip->slotExtractImage(frames);
+}
+
+void ClipItem::stopThumbs()
+{
+ // Clip is about to be deleted, make sure we don't request thumbnails
+ disconnect(&m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
+ disconnect(&m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
}
void ClipItem::slotGetStartThumb()
{
m_startThumbRequested = true;
- emit getThumb((int)m_speedIndependantInfo.cropStart.frames(m_fps), -1);
+ m_clip->slotExtractImage(QList<int>() << (int)m_speedIndependantInfo.cropStart.frames(m_fps));
}
void ClipItem::slotGetEndThumb()
{
m_endThumbRequested = true;
- emit getThumb(-1, (int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1);
+ m_clip->slotExtractImage(QList<int>() << (int)(m_speedIndependantInfo.cropStart + m_speedIndependantInfo.cropDuration).frames(m_fps) - 1);
}
painter->drawRect(mapped.adjusted(0.5, 0.5, -0.5, -0.5));
}
else {
- painter->drawRect(mapped.adjusted(0, 0, -0.5, -0.5));
+ painter->drawRect(mapped.adjusted(0, 0, -0.5, 0));
}
}
//virtual
void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event)
{
- const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
- QDomDocument doc;
- doc.setContent(effects, true);
- const QDomElement e = doc.documentElement();
- if (scene() && !scene()->views().isEmpty()) {
- event->accept();
+ if (event->proposedAction() == Qt::CopyAction && scene() && !scene()->views().isEmpty()) {
+ const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
+ event->acceptProposedAction();
+ QDomDocument doc;
+ doc.setContent(effects, true);
+ const QDomElement e = doc.documentElement();
CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
if (view) view->slotAddEffect(e, m_info.startPos, track());
}
+ else return;
}
//virtual
void ClipItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if (isItemLocked()) event->setAccepted(false);
- else event->setAccepted(event->mimeData()->hasFormat("kdenlive/effectslist"));
+ else if (event->mimeData()->hasFormat("kdenlive/effectslist")) {
+ event->acceptProposedAction();
+ } else event->setAccepted(false);
}
void ClipItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
else if (isVideoOnly())
return m_clip->videoProducer();
else
- return m_clip->producer(trackSpecific ? track : -1);
+ return m_clip->getProducer(trackSpecific ? track : -1);
}
QMap<int, QDomElement> ClipItem::adjustEffectsToDuration(int width, int height, ItemInfo oldInfo)
if (!effects.contains(i))
effects[i] = effect.cloneNode().toElement();
updateNormalKeyframes(param);
-#ifdef QJSON
+#ifdef USE_QJSON
} else if (type == "roto-spline") {
if (!effects.contains(i))
effects[i] = effect.cloneNode().toElement();