}
void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack, bool checkCollision) {
- double origX = rect().x();
- double origY = rect().y();
+ qreal origX = pos().x();
+ qreal origY = pos().y();
bool success = true;
if (x < 0) return;
- setRect(x * scale, origY + offset, rect().width(), rect().height());
+ //setRect(x * scale, origY + offset, rect().width(), rect().height());
+ //double xoffset = (x - m_startPos.frames(m_fps)) * scale;// - origX;
+ setPos((qreal) x * scale, (qreal) pos().y() + offset);
+
QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
if (collisionList.size() == 0) m_track = newTrack;
if (checkCollision)
if (x < m_startPos.frames(m_fps)) {
kDebug() << "COLLISION, MOVING TO------";
m_startPos = ((AbstractClipItem *)item)->endPos();
- origX = m_startPos.frames(m_fps) * scale;
+ origX = (qreal) m_startPos.frames(m_fps) * scale;
} else if (x > m_startPos.frames(m_fps)) {
//kDebug() << "COLLISION, MOVING TO+++: "<<x<<", CLIP CURR POS: "<<m_startPos.frames(m_fps)<<", COLLIDING START: "<<((AbstractClipItem *)item)->startPos().frames(m_fps);
m_startPos = ((AbstractClipItem *)item)->startPos() - m_cropDuration;
- origX = m_startPos.frames(m_fps) * scale;
+ origX = (qreal) m_startPos.frames(m_fps) * scale;
}
}
- setRect(origX, origY, rect().width(), rect().height());
+ setPos(origX, origY);
offset = 0;
- origX = rect().x();
success = false;
break;
}
m_track = newTrack;
m_startPos = GenTime(x, m_fps);
}
- /* QList <QGraphicsItem *> childrenList = QGraphicsItem::children();
- for (int i = 0; i < childrenList.size(); ++i) {
- childrenList.at(i)->moveBy(rect().x() - origX , offset);
- }*/
}
GenTime AbstractClipItem::endPos() const {
m_startPos += durationDiff;
if (type() == AVWIDGET) m_cropStart += durationDiff;
m_cropDuration = m_cropDuration - durationDiff;
- setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
- QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
- for (int i = 0; i < collisionList.size(); ++i) {
- QGraphicsItem *item = collisionList.at(i);
- if (item->type() == type()) {
- GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos;
- setRect((m_startPos + diff).frames(m_fps) * scale, rect().y(), (m_cropDuration - diff).frames(m_fps) * scale, rect().height());
- m_startPos += diff;
- if (type() == AVWIDGET) m_cropStart += diff;
- m_cropDuration = m_cropDuration - diff;
- break;
+
+ setRect(0, 0, (qreal) m_cropDuration.frames(m_fps) * scale - .5, rect().height());
+ setPos((qreal) m_startPos.frames(m_fps) * scale, pos().y());
+ //setRect((double) m_startPos.frames(m_fps) * scale, rect().y(), (double) m_cropDuration.frames(m_fps) * scale, rect().height());
+ if (durationDiff < GenTime()) {
+ QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
+ for (int i = 0; i < collisionList.size(); ++i) {
+ QGraphicsItem *item = collisionList.at(i);
+ if (item->type() == type() && item->pos().x() < pos().x()) {
+ kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
+ GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos;
+ setRect(0, 0, (qreal)(m_cropDuration - diff).frames(m_fps) * scale - .5, rect().height());
+ setPos((qreal)(m_startPos + diff).frames(m_fps) * scale, pos().y());
+ m_startPos += diff;
+ if (type() == AVWIDGET) m_cropStart += diff;
+ m_cropDuration = m_cropDuration - diff;
+ break;
+ }
}
}
}
durationDiff = maxDuration() - m_cropDuration - m_cropStart;
}
m_cropDuration += durationDiff;
- setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
- QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
- for (int i = 0; i < collisionList.size(); ++i) {
- QGraphicsItem *item = collisionList.at(i);
- if (item->type() == type()) {
- GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos();
- m_cropDuration = diff;
- setRect(m_startPos.frames(m_fps) * scale, rect().y(), (m_cropDuration.frames(m_fps)) * scale, rect().height());
- break;
+ setRect(0, 0, (qreal) m_cropDuration.frames(m_fps) * scale - .5, rect().height());
+ if (durationDiff > GenTime()) {
+ QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
+ for (int i = 0; i < collisionList.size(); ++i) {
+ QGraphicsItem *item = collisionList.at(i);
+ if (item->type() == type() && item->pos().x() > pos().x()) {
+ kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
+ kDebug() << "///////// CURRENT: " << startPos().frames(25) << "x" << endPos().frames(25) << ", RECT: " << rect() << "-" << pos();
+ kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();
+ GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos();
+ m_cropDuration = diff;
+ setRect(0, 0, (qreal)(m_cropDuration.frames(m_fps)) * scale - .5, rect().height());
+ break;
+ }
}
}
}
}
int AbstractClipItem::mouseOverKeyFrames(QPointF pos) {
- QRectF br = rect();
+ QRectF br = sceneBoundingRect();
double maxw = br.width() / m_cropDuration.frames(m_fps);
double maxh = br.height() / 100.0 * m_keyframeFactor;
if (m_keyframes.count() > 1) {
void AbstractClipItem::updateSelectedKeyFrame() {
if (m_editedKeyframe == -1) return;
- QRectF br = rect();
+ QRectF br = sceneBoundingRect();
double maxw = br.width() / m_cropDuration.frames(m_fps);
double maxh = br.height() / 100.0 * m_keyframeFactor;
update(br.x() + maxw * (m_selectedKeyframe - m_cropStart.frames(m_fps)) - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12);
}
void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) {
- QRectF br = rect();
+ QRectF br = sceneBoundingRect();
double maxh = 100.0 / br.height() / m_keyframeFactor;
double newval = (br.bottom() - value) * maxh;
+ kDebug() << "Rect: " << br << "/ SCENE: " << sceneBoundingRect() << ", VALUE: " << value << ", MAX: " << maxh << ", NEWVAL: " << newval;
int newpos = (int) pos.frames(m_fps) ;
m_keyframes[newpos] = newval;
m_selectedKeyframe = newpos;
#include "kthumb.h"
ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double scale, double fps)
- : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0) {
- QRectF rect((double) info.startPos.frames(fps) * scale, (double)(info.track * KdenliveSettings::trackheight() + 1), (double)(info.endPos - info.startPos).frames(fps) * scale, (double)(KdenliveSettings::trackheight() - 1));
- setRect(rect);
+ : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(2), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0), framePixelWidth(0) {
+ setRect(0, 0, (qreal)(info.endPos - info.startPos).frames(fps) * scale - .5, (qreal)(KdenliveSettings::trackheight() - 1));
+ setPos((qreal) info.startPos.frames(fps) * scale, (qreal)(info.track * KdenliveSettings::trackheight()) + 1);
+ kDebug() << "// ADDing CLIP TRK HGTH: " << KdenliveSettings::trackheight();
m_clipName = clip->name();
m_producer = clip->getId();
connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
- QTimer::singleShot(300, this, SLOT(slotFetchThumbs()));
+ QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
startThumbTimer = new QTimer(this);
startThumbTimer->setSingleShot(true);
ClipItem *ClipItem::clone(double scale, ItemInfo info) const {
ClipItem *duplicate = new ClipItem(m_clip, info, scale, m_fps);
+ if (info.cropStart == cropStart()) duplicate->slotThumbReady(info.cropStart.frames(m_fps), m_startPix);
+ if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotThumbReady((m_cropStart + m_cropDuration).frames(m_fps) - 1, 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);
duplicate->setSpeed(m_speed);
return duplicate;
}
void ClipItem::resetThumbs() {
+ m_startPix = QPixmap();
+ m_endPix = QPixmap();
+ m_thumbsRequested = 2;
slotFetchThumbs();
audioThumbCachePic.clear();
}
}
void ClipItem::slotFetchThumbs() {
- m_thumbsRequested = 2;
- emit getThumb((int)m_cropStart.frames(m_fps), (int)(m_cropStart + m_cropDuration).frames(m_fps));
+ if (m_endPix.isNull() && m_startPix.isNull()) {
+ emit getThumb((int)m_cropStart.frames(m_fps), (int)(m_cropStart + m_cropDuration).frames(m_fps) - 1);
+ } else {
+ if (m_endPix.isNull()) slotGetEndThumb();
+ if (m_startPix.isNull()) slotGetStartThumb();
+ }
}
void ClipItem::slotGetStartThumb() {
- m_thumbsRequested++;
emit getThumb((int)m_cropStart.frames(m_fps), -1);
}
void ClipItem::slotGetEndThumb() {
- m_thumbsRequested++;
- emit getThumb(-1, (int)(m_cropStart + m_cropDuration).frames(m_fps));
+ emit getThumb(-1, (int)(m_cropStart + m_cropDuration).frames(m_fps) - 1);
}
void ClipItem::slotThumbReady(int frame, QPixmap pix) {
- //if (m_thumbsRequested == 0) return;
if (frame == m_cropStart.frames(m_fps)) {
m_startPix = pix;
- QRectF r = boundingRect();
+ QRectF r = sceneBoundingRect();
r.setRight(pix.width() + 2);
update(r);
m_thumbsRequested--;
- } else if (frame == (m_cropStart + m_cropDuration).frames(m_fps)) {
+ } else if (frame == (m_cropStart + m_cropDuration).frames(m_fps) - 1) {
m_endPix = pix;
- QRectF r = boundingRect();
+ QRectF r = sceneBoundingRect();
r.setLeft(r.right() - pix.width() - 2);
update(r);
m_thumbsRequested--;
}
+ if (m_thumbsRequested == 0) {
+ // Ok, we have out start and end thumbnails...
+ disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+ }
}
void ClipItem::slotGotAudioData() {
QBrush paintColor = brush();
if (isSelected()) paintColor = QBrush(QColor(79, 93, 121));
QRectF br = rect();
- double scale = br.width() / m_cropDuration.frames(m_fps);
+ const double itemWidth = br.width();
+ const double itemHeight = br.height();
+ kDebug() << "/// ITEM RECT: " << br << ", EPXOSED: " << option->exposedRect;
+ double scale = itemWidth / (double) m_cropDuration.frames(m_fps);
// kDebug()<<"/// EXPOSED RECT: "<<option->exposedRect.x()<<" X "<<option->exposedRect.right();
- int startpixel = (int)option->exposedRect.x() - rect().x();
+ double startpixel = option->exposedRect.x(); // - pos().x();
if (startpixel < 0)
startpixel = 0;
- int endpixel = (int)option->exposedRect.right();
+ double endpixel = option->exposedRect.right();
if (endpixel < 0)
endpixel = 0;
// draw thumbnails
if (!m_startPix.isNull() && KdenliveSettings::videothumbnails()) {
if (m_clipType == IMAGE) {
- painter->drawPixmap(QPointF(br.right() - m_startPix.width(), br.y()), m_startPix);
- QLine l(br.right() - m_startPix.width(), br.y(), br.right() - m_startPix.width(), br.y() + br.height());
+ painter->drawPixmap(QPointF(itemWidth - m_startPix.width(), 0), m_startPix);
+ QLine l(itemWidth - m_startPix.width(), 0, itemWidth - m_startPix.width(), itemHeight);
painter->drawLine(l);
} else {
- painter->drawPixmap(QPointF(br.right() - m_endPix.width(), br.y()), m_endPix);
- QLine l(br.right() - m_endPix.width(), br.y(), br.right() - m_endPix.width(), br.y() + br.height());
+ painter->drawPixmap(QPointF(itemWidth - m_endPix.width(), 0), m_endPix);
+ QLine l(itemWidth - m_endPix.width(), 0, itemWidth - m_endPix.width(), itemHeight);
painter->drawLine(l);
}
- painter->drawPixmap(QPointF(br.x(), br.y()), m_startPix);
- QLine l2(br.x() + m_startPix.width(), br.y(), br.x() + m_startPix.width(), br.y() + br.height());
+ painter->drawPixmap(QPointF(0, 0), m_startPix);
+ QLine l2(m_startPix.width(), 0, 0 + m_startPix.width(), itemHeight);
painter->drawLine(l2);
}
// draw audio thumbnails
- if (KdenliveSettings::audiothumbnails() && ((m_clipType == AV && option->exposedRect.bottom() > (br.y() + br.height() / 2)) || m_clipType == AUDIO) && audioThumbReady) {
+ if (KdenliveSettings::audiothumbnails() && ((m_clipType == AV && option->exposedRect.bottom() > (itemHeight / 2)) || m_clipType == AUDIO) && audioThumbReady) {
QPainterPath path = m_clipType == AV ? roundRectPathLower : resultClipPath;
if (m_clipType == AV) painter->fillPath(path, QBrush(QColor(200, 200, 200, 140)));
int channels = baseClip()->getProperty("channels").toInt();
if (scale != framePixelWidth)
audioThumbCachePic.clear();
- emit prepareAudioThumb(scale, path, startpixel, endpixel + 200, channels);//200 more for less missing parts before repaint after scrolling
- int cropLeft = (int)((m_cropStart).frames(m_fps) * scale);
- for (int startCache = startpixel - startpixel % 100; startCache < endpixel + 300;startCache += 100) {
+ double cropLeft = m_cropStart.frames(m_fps) * scale;
+ emit prepareAudioThumb(scale, path, startpixel + cropLeft, endpixel + cropLeft, channels);//200 more for less missing parts before repaint after scrolling
+ int newstart = startpixel + cropLeft;
+ for (int startCache = newstart - (newstart) % 100; startCache < endpixel + cropLeft; startCache += 100) {
if (audioThumbCachePic.contains(startCache) && !audioThumbCachePic[startCache].isNull())
- painter->drawPixmap((int)(roundRectPathUpper.united(roundRectPathLower).boundingRect().x() + startCache - cropLeft), (int)(path.boundingRect().y()), audioThumbCachePic[startCache]);
+ painter->drawPixmap((int)(startCache - cropLeft), (int)(path.boundingRect().y()), audioThumbCachePic[startCache]);
}
}
if (pos > GenTime()) {
if (pos > duration()) break;
framepos = scale * pos.frames(m_fps);
- QLineF l(br.x() + framepos, br.y() + 5, br.x() + framepos, br.y() + br.height() - 5);
+ QLineF l(framepos, 5, framepos, itemHeight - 5);
painter->drawLine(l);
if (KdenliveSettings::showmarkers()) {
- const QRectF txtBounding = painter->boundingRect(br.x() + framepos + 1, br.y() + 10, br.width() - framepos - 2, br.height() - 10, Qt::AlignLeft | Qt::AlignTop, " " + (*it).comment() + " ");
+ const QRectF txtBounding = painter->boundingRect(framepos + 1, 10, itemWidth - framepos - 2, itemHeight - 10, Qt::AlignLeft | Qt::AlignTop, " " + (*it).comment() + " ");
QPainterPath path;
path.addRoundedRect(txtBounding, 3, 3);
painter->fillPath(path, markerBrush);
if (m_startFade != 0) {
QPainterPath fadeInPath;
- fadeInPath.moveTo(br.x() , br.y());
- fadeInPath.lineTo(br.x() , br.bottom());
- fadeInPath.lineTo(br.x() + m_startFade * scale, br.y());
+ fadeInPath.moveTo(0, 0);
+ fadeInPath.lineTo(0, itemHeight);
+ fadeInPath.lineTo(m_startFade * scale, itemHeight);
fadeInPath.closeSubpath();
painter->fillPath(fadeInPath/*.intersected(resultClipPath)*/, fades);
if (isSelected()) {
- QLineF l(br.x() + m_startFade * scale, br.y(), br.x(), br.bottom());
+ QLineF l(m_startFade * scale, 0, 0, itemHeight);
painter->drawLine(l);
}
}
if (m_endFade != 0) {
QPainterPath fadeOutPath;
- fadeOutPath.moveTo(br.right(), br.y());
- fadeOutPath.lineTo(br.right(), br.bottom());
- fadeOutPath.lineTo(br.right() - m_endFade * scale, br.y());
+ fadeOutPath.moveTo(itemWidth, 0);
+ fadeOutPath.lineTo(itemWidth, itemHeight);
+ fadeOutPath.lineTo(itemWidth - m_endFade * scale, 0);
fadeOutPath.closeSubpath();
painter->fillPath(fadeOutPath/*.intersected(resultClipPath)*/, fades);
if (isSelected()) {
- QLineF l(br.right() - m_endFade * scale, br.y(), br.x() + br.width(), br.bottom());
+ QLineF l(itemWidth - m_endFade * scale, 0, itemWidth, itemHeight);
painter->drawLine(l);
}
}
// Draw effects names
- if (!m_effectNames.isEmpty() && br.width() > 30) {
+ if (!m_effectNames.isEmpty() && itemWidth > 30) {
QRectF txtBounding = painter->boundingRect(br, Qt::AlignLeft | Qt::AlignTop, m_effectNames);
txtBounding.setRight(txtBounding.right() + 15);
painter->setPen(Qt::white);
// draw effect or transition keyframes
- if (br.width() > 20) drawKeyFrames(painter, option->exposedRect);
+ if (itemWidth > 20) drawKeyFrames(painter, option->exposedRect);
// draw clip border
painter->setClipRect(option->exposedRect);
//painter->setClipRect(option->exposedRect);
painter->drawPath(resultClipPath);
- if (m_hover && br.width() > 30) {
+ if (m_hover && itemWidth > 30) {
painter->setBrush(QColor(180, 180, 50, 180)); //gradient);
// draw transitions handles
transitionHandle.lineTo(handle_size * 3, handle_size * 3);
transitionHandle.lineTo(0, handle_size * 3);
transitionHandle.closeSubpath();
- int pointy = (int)(br.y() + br.height() / 2);
- int pointx1 = (int)(br.x() + 10);
- int pointx2 = (int)(br.x() + br.width() - (10 + handle_size * 3));
+ int pointy = (int)(itemHeight / 2);
+ int pointx1 = 10;
+ int pointx2 = (int)(itemWidth - (10 + handle_size * 3));
#if 0
painter->setPen(QPen(Qt::black));
painter->setBrush(QBrush(QColor(50, 50, 0)));
m_editedKeyframe = mouseOverKeyFrames(pos);
if (m_editedKeyframe != -1) return KEYFRAME;
}
- if (qAbs((int)(pos.x() - (rect().x() + scale * m_startFade))) < 6 && qAbs((int)(pos.y() - rect().y())) < 6) {
+ QRectF rect = sceneBoundingRect();
+ if (qAbs((int)(pos.x() - (rect.x() + scale * m_startFade))) < 6 && qAbs((int)(pos.y() - rect.y())) < 6) {
if (m_startFade == 0) setToolTip(i18n("Add audio fade"));
else setToolTip(i18n("Audio fade duration: %1s", GenTime(m_startFade, m_fps).seconds()));
return FADEIN;
- } else if (qAbs((int)(pos.x() - rect().x())) < 6) {
+ } else if (qAbs((int)(pos.x() - rect.x())) < 6) {
setToolTip(i18n("Crop from start: %1s", cropStart().seconds()));
return RESIZESTART;
- } else if (qAbs((int)(pos.x() - (rect().x() + rect().width() - scale * m_endFade))) < 6 && qAbs((int)(pos.y() - rect().y())) < 6) {
+ } else if (qAbs((int)(pos.x() - (rect.x() + rect.width() - scale * m_endFade))) < 6 && qAbs((int)(pos.y() - rect.y())) < 6) {
if (m_endFade == 0) setToolTip(i18n("Add audio fade"));
else setToolTip(i18n("Audio fade duration: %1s", GenTime(m_endFade, m_fps).seconds()));
return FADEOUT;
- } else if (qAbs((int)(pos.x() - (rect().x() + rect().width()))) < 6) {
+ } else if (qAbs((int)(pos.x() - (rect.x() + rect.width()))) < 6) {
setToolTip(i18n("Clip duration: %1s", duration().seconds()));
return RESIZEEND;
- } else if (qAbs((int)(pos.x() - (rect().x() + 16))) < 10 && qAbs((int)(pos.y() - (rect().y() + rect().height() / 2 + 5))) < 8) {
+ } else if (qAbs((int)(pos.x() - (rect.x() + 16))) < 10 && qAbs((int)(pos.y() - (rect.y() + rect.height() / 2 + 5))) < 8) {
setToolTip(i18n("Add transition"));
return TRANSITIONSTART;
- } else if (qAbs((int)(pos.x() - (rect().x() + rect().width() - 21))) < 10 && qAbs((int)(pos.y() - (rect().y() + rect().height() / 2 + 5))) < 8) {
+ } else if (qAbs((int)(pos.x() - (rect.x() + rect.width() - 21))) < 10 && qAbs((int)(pos.y() - (rect.y() + rect.height() / 2 + 5))) < 8) {
setToolTip(i18n("Add transition"));
return TRANSITIONEND;
}
void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path, int startpixel, int endpixel, int channels) {
QRectF re = path.boundingRect();
- //kDebug() << "// PREP AUDIO THMB FRMO : " << startpixel << ", to: " << endpixel;
+ kDebug() << "// PREP AUDIO THMB FRMO : " << startpixel << ", to: " << endpixel;
//if ( (!audioThumbWasDrawn || framePixelWidth!=pixelForOneFrame ) && !baseClip()->audioFrameChache.isEmpty()){
- for (int startCache = startpixel - startpixel % 100;startCache + 100 < endpixel ;startCache += 100) {
+ for (int startCache = startpixel - startpixel % 100;startCache + 100 < endpixel + 100;startCache += 100) {
//kDebug() << "creating " << startCache;
//if (framePixelWidth!=pixelForOneFrame ||
if (framePixelWidth == pixelForOneFrame && audioThumbCachePic.contains(startCache))
if (pos < 0) pos = 0;
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
m_startFade = pos;
- update(rect().x(), rect().y(), qMax(oldIn, pos) * scale, rect().height());
+ QRectF rect = boundingRect();
+ update(rect.x(), rect.y(), qMax(oldIn, pos) * scale, rect.height());
}
void ClipItem::setFadeOut(int pos, double scale) {
if (pos < 0) pos = 0;
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
m_endFade = pos;
- update(rect().x() + rect().width() - qMax(oldOut, pos) * scale, rect().y(), pos * scale, rect().height());
+ QRectF rect = boundingRect();
+ update(rect.x() + rect.width() - qMax(oldOut, pos) * scale, rect.y(), pos * scale, rect.height());
}
}
void ClipItem::resizeStart(int posx, double scale) {
+ const int min = (startPos() - cropStart()).frames(m_fps);
+ if (posx < min) posx = min;
+ if (posx == startPos().frames(m_fps)) return;
const int previous = cropStart().frames(m_fps);
AbstractClipItem::resizeStart(posx, scale);
checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
- if (m_hasThumbs && KdenliveSettings::videothumbnails()) startThumbTimer->start(100);
+ if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
+ m_thumbsRequested++;
+ connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+ startThumbTimer->start(100);
+ }
}
void ClipItem::resizeEnd(int posx, double scale) {
+ const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps) + 1;
+ if (posx > max) posx = max;
+ if (posx == endPos().frames(m_fps)) return;
const int previous = (cropStart() + duration()).frames(m_fps);
AbstractClipItem::resizeEnd(posx, scale);
checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
- if (m_hasThumbs && KdenliveSettings::videothumbnails()) endThumbTimer->start(100);
+ if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
+ m_thumbsRequested++;
+ connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+ endThumbTimer->start(100);
+ }
}
void checkEffectsKeyframesPos(const int previous, const int current, bool fromStart);
private slots:
- void slotThumbReady(int frame, QPixmap pix);
void slotFetchThumbs();
void slotGetStartThumb();
void slotGetEndThumb();
void slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path, int startpixel, int endpixel, int channels);
void animate(qreal value);
+public slots:
+ void slotThumbReady(int frame, QPixmap pix);
+
signals:
void getThumb(int, int);
void prepareAudioThumb(double, QPainterPath, int, int, int);
m_view.slide_info->setText(i18n("%1 images found", m_count));
QDomElement xml = m_clip->toXML();
xml.setAttribute("resource", m_view.clip_path->text() + extension);
- QPixmap pix = m_clip->thumbProducer()->getImage(xml, 1, 240, 180);
+ QPixmap pix = m_clip->thumbProducer()->getImage(KUrl(m_view.clip_path->text() + extension), 1, 240, 180);
QMap <QString, QString> props = m_clip->properties();
m_view.clip_duration->setText(m_tc.getTimecodeFromFrames(props.value("ttl").toInt() * m_count));
m_view.clip_thumb->setPixmap(pix);
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());
} 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);
} 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);
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);
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);
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();
}
} 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);
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);
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;
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);
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;
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();
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;
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);
+ 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.endPos = info.endPos;
newPos.cropStart = item->cropStart() + (cutTime - info.startPos);
newPos.track = info.track;
- item->resizeEnd(cutPos, m_scale);
ClipItem *dup = item->clone(m_scale, newPos);
+ kDebug() << "// REsizing item to: " << cutPos;
+ item->resizeEnd(cutPos, m_scale);
scene()->addItem(dup);
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->startPos().frames(25) << ", SECOND: " << dup->startPos().frames(25);
- kDebug() << "// UNCUTTING CLIPS, SEC END " << dup->endPos().frames(25) << ", CUT: " << cutTime.frames(25);
- kDebug() << "// UNCUTTING CLIPS, INFO " << info.endPos.frames(25) << ", start: " << info.startPos.frames(25);*/
- deleteClip(dup->info());
+
+ 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;
+ m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, cutTime);
+
ItemInfo clipinfo = item->info();
clipinfo.track = m_tracksList.count() - clipinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos);
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()));
}
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();
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);
+ 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);
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());
}
}
#include <QGraphicsItemAnimation>
#include <QTimeLine>
#include <QMenu>
-
-#include <KUndoStack>
+#include <QUndoStack>
#include "kdenlivedoc.h"
#include "docclipbase.h"
OPERATIONTYPE m_moveOpMode;
AbstractClipItem *m_dragItem;
Guide *m_dragGuide;
- KUndoStack *m_commandStack;
+ QUndoStack *m_commandStack;
QGraphicsItem *m_visualTip;
QGraphicsItemAnimation *m_animation;
QTimeLine *m_animationTimer;
#include "mainwindow.h"
-KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, MltVideoProfile profile, QUndoGroup *undoGroup, MainWindow *parent): QObject(parent), m_render(NULL), m_url(url), m_projectFolder(projectFolder), m_profile(profile), m_fps((double)profile.frame_rate_num / profile.frame_rate_den), m_width(profile.width), m_height(profile.height), m_commandStack(new KUndoStack(undoGroup)), m_modified(false), m_documentLoadingProgress(0), m_documentLoadingStep(0.0), m_startPos(0), m_zoom(7) {
+KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, MltVideoProfile profile, QUndoGroup *undoGroup, MainWindow *parent): QObject(parent), m_render(NULL), m_url(url), m_projectFolder(projectFolder), m_profile(profile), m_fps((double)profile.frame_rate_num / profile.frame_rate_den), m_width(profile.width), m_height(profile.height), m_commandStack(new QUndoStack(undoGroup)), m_modified(false), m_documentLoadingProgress(0), m_documentLoadingStep(0.0), m_startPos(0), m_zoom(7) {
kDebug() << "// init profile, ratnum: " << profile.frame_rate_num << ", " << profile.frame_rate_num << ", width: " << profile.width;
m_clipManager = new ClipManager(this);
KdenliveSettings::setProject_fps(m_fps);
emit progressInfo(QString(), (int) m_documentLoadingProgress);
}
-KUndoStack *KdenliveDoc::commandStack() {
+QUndoStack *KdenliveDoc::commandStack() {
return m_commandStack;
}
#define KDENLIVEDOC_H
#include <qdom.h>
-#include <qstring.h>
-#include <qmap.h>
+#include <QString>
+#include <QMap>
#include <QList>
#include <QObject>
#include <QUndoGroup>
+#include <QUndoStack>
#include <QTimer>
-#include <KUndoStack>
-#include <kurl.h>
+#include <KUrl>
#include "gentime.h"
#include "timecode.h"
Timecode timecode() const;
QDomDocument toXml() const;
void setRenderer(Render *render);
- KUndoStack *commandStack();
+ QUndoStack *commandStack();
QString producerName(int id);
void setProducerDuration(int id, int duration);
int getProducerDuration(int id);
int m_height;
Timecode m_timecode;
Render *m_render;
- KUndoStack *m_commandStack;
+ QUndoStack *m_commandStack;
QDomDocument generateSceneList();
ClipManager *m_clipManager;
MltVideoProfile m_profile;
return;
}
if (frame != -1) {
- QPixmap pix = getFrame(*m_producer, frame, twidth, KdenliveSettings::trackheight());
+ QPixmap pix = getFrame(m_producer, frame, twidth, KdenliveSettings::trackheight());
emit thumbReady(frame, pix);
}
if (frame2 != -1) {
- QPixmap pix = getFrame(*m_producer, frame2, twidth , KdenliveSettings::trackheight());
+ QPixmap pix = getFrame(m_producer, frame2, twidth , KdenliveSettings::trackheight());
emit thumbReady(frame2, pix);
}
}
+QPixmap KThumb::extractImage(int frame, int width, int height) {
+ return getFrame(m_producer, frame, width, height);
+}
+
//static
QPixmap KThumb::getImage(KUrl url, int frame, int width, int height) {
Mlt::Profile profile((char*) KdenliveSettings::current_profile().data());
QPixmap pix(width, height);
if (url.isEmpty()) return pix;
- char *tmp = Render::decodedString("<westley><playlist><producer resource=\"" + url.path() + "\" /></playlist></westley>");
- Mlt::Producer producer(profile, "westley-xml", tmp);
+ char *tmp = Render::decodedString(url.path());
+ //"<westley><playlist><producer resource=\"" + url.path() + "\" /></playlist></westley>");
+ //Mlt::Producer producer(profile, "westley-xml", tmp);
+ Mlt::Producer *producer = new Mlt::Producer(profile, tmp);
delete[] tmp;
- if (producer.is_blank()) {
-
+ if (producer->is_blank()) {
pix.fill(Qt::black);
+ delete producer;
return pix;
}
- return getFrame(producer, frame, width, height);
+ pix = getFrame(producer, frame, width, height);
+ delete producer;
+ return pix;
}
//static
+/*
QPixmap KThumb::getImage(QDomElement xml, int frame, int width, int height) {
Mlt::Profile profile((char*) KdenliveSettings::current_profile().data());
QPixmap pix(width, height);
return pix;
}
return getFrame(producer, frame, width, height);
-}
+}*/
//static
-QPixmap KThumb::getFrame(Mlt::Producer producer, int framepos, int width, int height) {
- producer.seek(framepos);
- Mlt::Frame *frame = producer.get_frame();
+QPixmap KThumb::getFrame(Mlt::Producer *producer, int framepos, int width, int height) {
+ kDebug() << "//REQUESTING FRAME: " << framepos;
+ if (producer == NULL) return QPixmap();
+ producer->seek(framepos);
+ Mlt::Frame *frame = producer->get_frame();
+ if (!frame) {
+ kDebug() << "///// BROKEN FRAME";
+ return QPixmap();
+ }
+ kDebug() << "///// FRAME exists";
mlt_image_format format = mlt_image_yuv422;
int frame_width = 0;
int frame_height = 0;
frame->set("normalised_height", height);
frame->set("normalised_width", width);
QPixmap pix(width, height);
-
+ kDebug() << "///// FRAME exists 2";
uint8_t *data = frame->get_image(format, frame_width, frame_height, 0);
+ kDebug() << "///// FRAME exists 2a";
uint8_t *new_image = (uint8_t *)mlt_pool_alloc(frame_width * (frame_height + 1) * 4);
+ kDebug() << "///// FRAME exists 2b";
mlt_convert_yuv422_to_rgb24a((uint8_t *)data, new_image, frame_width * frame_height);
+ kDebug() << "///// FRAME exists 2c";
QImage image((uchar *)new_image, frame_width, frame_height, QImage::Format_ARGB32);
-
+ kDebug() << "///// FRAME exists 3";
if (!image.isNull()) {
pix = pix.fromImage(image.rgbSwapped());
} else
mlt_pool_release(new_image);
delete frame;
+ kDebug() << "//REQUESTING FRAME " << framepos << " OVER";
return pix;
}
/*
public slots:
void extractImage(int frame, int frame2);
+ QPixmap extractImage(int frame, int width, int height);
void updateClipUrl(KUrl url);
static QPixmap getImage(KUrl url, int width, int height);
- static QPixmap getImage(QDomElement xml, int frame, int width, int height);
+// static QPixmap getImage(QDomElement xml, int frame, int width, int height);
/* void getImage(KUrl url, int frame, int width, int height);
void getThumbs(KUrl url, int startframe, int endframe, int width, int height);*/
void stopAudioThumbs();
void removeAudioThumb();
void getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth);
static QPixmap getImage(KUrl url, int frame, int width, int height);
- static QPixmap getFrame(Mlt::Producer producer, int framepos, int width, int height);
+ static QPixmap getFrame(Mlt::Producer *producer, int framepos, int width, int height);
protected:
virtual void customEvent(QEvent * event);
KStandardAction::paste(this, SLOT(slotPaste()),
actionCollection());
- KStandardAction::undo(this, SLOT(undo()),
- actionCollection());
+ KAction *undo = KStandardAction::undo(m_commandStack, SLOT(undo()),
+ actionCollection());
+ undo->setEnabled(false);
+ connect(m_commandStack, SIGNAL(canUndoChanged(bool)), undo, SLOT(setEnabled(bool)));
- KStandardAction::redo(this, SLOT(redo()),
- actionCollection());
+ KAction *redo = KStandardAction::redo(m_commandStack, SLOT(redo()),
+ actionCollection());
+ redo->setEnabled(false);
+ connect(m_commandStack, SIGNAL(canRedoChanged(bool)), redo, SLOT(setEnabled(bool)));
KStandardAction::fullScreen(this, SLOT(slotFullScreen()), this, actionCollection());
readOptions();
}
-void MainWindow::undo() {
- m_commandStack->undo();
-}
-
-void MainWindow::redo() {
- m_commandStack->redo();
-}
-
void MainWindow::slotDisplayActionMessage(QAction *a) {
statusBar()->showMessage(a->data().toString(), 3000);
}
private slots:
void newFile();
- void undo();
- void redo();
void queryQuit();
void activateDocument();
void connectDocument(TrackView*, KdenliveDoc*);
connect(this, SIGNAL(updateThumb()), m_previewTimer, SLOT(start()));
case IMAGE:
case TEXT:
- p = KThumb::getFrame(*m_producer, t.time().frames(m_fps), (int)(100 * m_dar), 100);
+ p = KThumb::getFrame(m_producer, t.time().frames(m_fps), (int)(100 * m_dar), 100);
break;
case COLOR:
colour = colour.replace(0, 2, "#");
void MarkerDialog::slotUpdateThumb() {
m_previewTimer->stop();
int pos = m_tc.getFrameCount(m_view.marker_position->text(), m_fps);
- QPixmap p = KThumb::getFrame(*m_producer, pos, (int)(100 * m_dar), 100);
+ QPixmap p = KThumb::getFrame(m_producer, pos, (int)(100 * m_dar), 100);
if (!p.isNull()) m_view.clip_thumb->setPixmap(p);
else kDebug() << "!!!!!!!!!!! ERROR CREATING THUMB";
}
if (item) {
int height = 50;
int width = (int)(height * m_render->dar());
- QPixmap pix = KThumb::getImage(item->toXml(), item->referencedClip()->getClipThumbFrame(), width, height);
+ QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
item->setIcon(0, pix);
}
}
#include <QTreeWidget>
#include <QPainter>
#include <QItemDelegate>
+#include <QUndoStack>
-#include <KUndoStack>
#include <KTreeWidgetSearchLine>
#include <KUrl>
double m_fps;
QToolBar *m_toolbar;
QMenu *m_menu;
- KUndoStack *m_commandStack;
+ QUndoStack *m_commandStack;
int m_clipIdCounter;
void selectItemById(const int clipId);
ProjectItem *getItemById(int id);
// virtual
void RazorClipCommand::undo() {
-// kDebug()<<"---- undoing action";
+ // kDebug()<<"---- undoing action";
m_doIt = true;
m_view->cutClip(m_info, m_cutTime, false);
}
// virtual
void RazorClipCommand::redo() {
- kDebug() << "---- redoing action cut: " << m_cutTime.frames(25);
+ // kDebug() << "---- redoing action cut: " << m_cutTime.frames(25);
if (m_doIt)
m_view->cutClip(m_info, m_cutTime, true);
m_doIt = true;
#include <QUndoCommand>
#include <QGraphicsView>
-#include <QPointF>
#include <KDebug>
#include "definitions.h"
pix.fill(Qt::black);
return pix;
}
- return KThumb::getFrame(*m_mltProducer, frame_position, width, height);
+ return KThumb::getFrame(m_mltProducer, frame_position, width, height);
}
QPixmap Render::getImageThumbnail(KUrl url, int width, int height) {
#include "kdenlivesettings.h"
#include "mainwindow.h"
-Transition::Transition(const ItemInfo info, int transitiontrack, double scale, double fps, QDomElement params) : AbstractClipItem(info, QRectF(info.startPos.frames(fps) *scale , info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 3 * 2, (info.endPos - info.startPos).frames(fps) * scale , KdenliveSettings::trackheight() / 3 * 2 - 1), fps), m_gradient(QLinearGradient(0, 0, 0, 0)) {
+Transition::Transition(const ItemInfo info, int transitiontrack, double scale, double fps, QDomElement params) : AbstractClipItem(info, QRectF(), fps), m_gradient(QLinearGradient(0, 0, 0, 0)) {
+ setRect(0, 0, (qreal)(info.endPos - info.startPos).frames(fps) * scale - .5, (qreal)(KdenliveSettings::trackheight() / 3 * 2 - 1));
+ setPos((qreal) info.startPos.frames(fps) * scale, (qreal)(info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 3 * 2));
+
m_singleClip = true;
m_transitionTrack = transitiontrack;
m_secondClip = NULL;
}
OPERATIONTYPE Transition::operationMode(QPointF pos, double scale) {
- if (qAbs((int)(pos.x() - rect().x())) < 6) return RESIZESTART;
- else if (qAbs((int)(pos.x() - (rect().x() + rect().width()))) < 6) return RESIZEEND;
+ QRectF rect = sceneBoundingRect();
+ if (qAbs((int)(pos.x() - rect.x())) < 6) return RESIZESTART;
+ else if (qAbs((int)(pos.x() - (rect.right()))) < 6) return RESIZEEND;
return MOVE;
}