m_timeLine(0),
m_startThumbRequested(false),
m_endThumbRequested(false),
- m_hover(false),
+ //m_hover(false),
m_speed(speed),
m_framePixelWidth(0)
{
- setZValue(1);
+ setZValue(2);
setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
m_audioThumbReady = clip->audioThumbCreated();
setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
- setAcceptsHoverEvents(true);
+ //setAcceptsHoverEvents(true);
connect(this , SIGNAL(prepareAudioThumb(double, int, int, int)) , this, SLOT(slotPrepareAudioThumb(double, int, int, int)));
if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) {
setBrush(QColor(colour.left(7)));
} else if (m_clipType == IMAGE || m_clipType == TEXT) {
setBrush(QColor(141, 166, 215));
- m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
- m_endPix = m_startPix;
+ //m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
} else if (m_clipType == AUDIO) {
setBrush(QColor(141, 215, 166));
connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
ClipItem *ClipItem::clone(ItemInfo info) const
{
ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed);
- if (info.cropStart == m_cropStart) duplicate->slotSetStartThumb(m_startPix);
- if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotSetEndThumb(m_endPix);
- kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps);
+ if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix);
+ else {
+ if (info.cropStart == m_cropStart) duplicate->slotSetStartThumb(m_startPix);
+ if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_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.clone());
duplicate->setVideoOnly(m_videoOnly);
duplicate->setAudioOnly(m_audioOnly);
return effectAt(m_selectedEffect);
}
-void ClipItem::resetThumbs()
+void ClipItem::resetThumbs(bool clearExistingThumbs)
{
- m_startPix = QPixmap();
- m_endPix = QPixmap();
+ if (clearExistingThumbs) {
+ m_startPix = QPixmap();
+ m_endPix = QPixmap();
+ m_audioThumbCachePic.clear();
+ }
slotFetchThumbs();
- m_audioThumbCachePic.clear();
}
QString colour = m_clip->getProperty("colour");
colour = colour.replace(0, 2, "#");
setBrush(QColor(colour.left(7)));
- } else resetThumbs();
+ } else resetThumbs(checkDuration);
}
void ClipItem::slotFetchThumbs()
{
+ if (m_clipType == IMAGE || m_clipType == TEXT) {
+ if (m_startPix.isNull()) {
+ m_startPix = KThumb::getImage(KUrl(m_clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
+ update();
+ }
+ return;
+ }
+
if (m_endPix.isNull() && m_startPix.isNull()) {
m_startThumbRequested = true;
m_endThumbRequested = true;
{
if (scene() == NULL) return;
QRectF r = boundingRect();
- double width = pix.width() / projectScene()->scale();
+ double width = pix.width() / projectScene()->scale().x();
if (m_startThumbRequested && frame == cropStart().frames(m_fps)) {
m_startPix = pix;
m_startThumbRequested = false;
const double itemWidth = br.width();
const double itemHeight = br.height();
const double scale = option->matrix.m11();
+ const double vscale = option->matrix.m22();
const qreal xoffset = pen().widthF() / scale;
//painter->setRenderHints(QPainter::Antialiasing);
//painter->setClipPath(resultClipPath, Qt::IntersectClip);
// draw thumbnails
- painter->setMatrixEnabled(false);
if (KdenliveSettings::videothumbnails() && !isAudioOnly()) {
QPen pen = painter->pen();
pen.setColor(QColor(255, 255, 255, 150));
painter->setPen(pen);
- if (m_clipType == IMAGE && !m_startPix.isNull()) {
- QPointF p1 = painter->matrix().map(QPointF(itemWidth, 0)) - QPointF(m_startPix.width(), 0);
- QPointF p2 = painter->matrix().map(QPointF(itemWidth, itemHeight)) - QPointF(m_startPix.width(), 0);
- painter->drawPixmap(p1, m_startPix);
- QLineF l(p1, p2);
- painter->drawLine(l);
+ if ((m_clipType == IMAGE || m_clipType == TEXT) && !m_startPix.isNull()) {
+ double left = itemWidth - m_startPix.width() * vscale / scale;
+ QRectF pixrect(left, 0.0, m_startPix.width() * vscale / scale, m_startPix.height());
+ QRectF source(0.0, 0.0, (double) m_startPix.width(), (double) m_startPix.height());
+ painter->drawPixmap(pixrect, m_startPix, source);
+ QLineF l2(left, 0, left, m_startPix.height());
+ painter->drawLine(l2);
} else if (!m_endPix.isNull()) {
- QPointF p1 = painter->matrix().map(QPointF(itemWidth, 0)) - QPointF(m_endPix.width(), 0);
- QPointF p2 = painter->matrix().map(QPointF(itemWidth, itemHeight)) - QPointF(m_endPix.width(), 0);
- painter->drawPixmap(p1, m_endPix);
- QLineF l(p1, p2);
- painter->drawLine(l);
+ double left = itemWidth - m_endPix.width() * vscale / scale;
+ QRectF pixrect(left, 0.0, m_endPix.width() * vscale / scale, m_endPix.height());
+ QRectF source(0.0, 0.0, (double) m_endPix.width(), (double) m_endPix.height());
+ painter->drawPixmap(pixrect, m_endPix, source);
+ QLineF l2(left, 0, left, m_startPix.height());
+ painter->drawLine(l2);
}
if (!m_startPix.isNull()) {
- QPointF p1 = painter->matrix().map(QPointF(0, 0)) + QPointF(1.0, 0);
- QPointF p2 = painter->matrix().map(QPointF(0, itemHeight)) + QPointF(1.0, 0);
- painter->drawPixmap(p1, m_startPix);
- QLineF l2(p1.x() + m_startPix.width(), p1.y(), p2.x() + m_startPix.width(), p2.y());
+ double right = m_startPix.width() * vscale / scale;
+ QRectF pixrect(0.0, 0.0, right, m_startPix.height());
+ QRectF source(0.0, 0.0, (double) m_startPix.width(), (double) m_startPix.height());
+ painter->drawPixmap(pixrect, m_startPix, source);
+ QLineF l2(right, 0, right, m_startPix.height());
painter->drawLine(l2);
}
painter->setPen(Qt::black);
}
+ painter->setMatrixEnabled(false);
// draw audio thumbnails
if (KdenliveSettings::audiothumbnails() && m_speed == 1.0 && !isVideoOnly() && ((m_clipType == AV && (exposed.bottom() > (itemHeight / 2) || isAudioOnly())) || m_clipType == AUDIO) && m_audioThumbReady) {
QRectF mappedRect;
if (m_clipType == AV && !isAudioOnly()) {
QRectF re = br;
- re.setTop(re.y() + re.height() / 2);
mappedRect = painter->matrix().mapRect(re);
- //painter->fillRect(mappedRect, QBrush(QColor(200, 200, 200, 140)));
+ mappedRect.setTop(mappedRect.bottom() - re.height() / 2);
} else mappedRect = mapped;
int channels = baseClip()->getProperty("channels").toInt();
if (m_timeLine && m_timeLine->state() == QTimeLine::Running) {
qreal value = m_timeLine->currentValue();
txtBounding.setWidth(txtBounding.width() * value);
- markerBrush.setColor(QColor(50 + 200 * (1.0 - value), 50, 50, 100 + 50 * value));
+ markerBrush.setColor(QColor(50 + 200 *(1.0 - value), 50, 50, 100 + 50 * value));
} else markerBrush.setColor(QColor(50, 50, 50, 150));
painter->setBrush(markerBrush);
painter->setPen(Qt::NoPen);
// draw transition handles on hover
- if (m_hover && itemWidth * scale > 40) {
+ /*if (m_hover && itemWidth * scale > 40) {
QPointF p1 = painter->matrix().map(QPointF(0, itemHeight / 2)) + QPointF(10, 0);
painter->drawPixmap(p1, projectScene()->m_transitionPixmap);
p1 = painter->matrix().map(QPointF(itemWidth, itemHeight / 2)) - QPointF(22, 0);
painter->drawPixmap(p1, projectScene()->m_transitionPixmap);
- }
+ }*/
// draw effect or transition keyframes
- if (itemWidth > 20) drawKeyFrames(painter, exposed);
+ if (mapped.width() > 20) drawKeyFrames(painter, exposed);
painter->setMatrixEnabled(true);
if (m_editedKeyframe != -1) return KEYFRAME;
}
QRectF rect = sceneBoundingRect();
- const double scale = projectScene()->scale();
+ const double scale = projectScene()->scale().x();
double maximumOffset = 6 / scale;
+ int addtransitionOffset = 10;
+ // Don't allow add transition if track height is very small
+ if (rect.height() < 30) addtransitionOffset = 0;
if (qAbs((int)(pos.x() - (rect.x() + m_startFade))) < maximumOffset && 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 (pos.x() - rect.x() < maximumOffset) {
+ } else if (pos.x() - rect.x() < maximumOffset && (rect.bottom() - pos.y() > addtransitionOffset)) {
setToolTip(i18n("Crop from start: %1s", cropStart().seconds()));
return RESIZESTART;
} else if (qAbs((int)(pos.x() - (rect.x() + rect.width() - m_endFade))) < maximumOffset && 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()))) < maximumOffset) {
+ } else if ((rect.right() - pos.x() < maximumOffset) && (rect.bottom() - pos.y() > addtransitionOffset)) {
setToolTip(i18n("Clip duration: %1s", duration().seconds()));
return RESIZEEND;
- } else if (qAbs((int)(pos.x() - (rect.x() + 16 / scale))) < maximumOffset && qAbs((int)(pos.y() - (rect.y() + rect.height() / 2 + 9))) < 6) {
+ } else if ((pos.x() - rect.x() < 16 / scale) && (rect.bottom() - pos.y() <= addtransitionOffset)) {
setToolTip(i18n("Add transition"));
return TRANSITIONSTART;
- } else if (qAbs((int)(pos.x() - (rect.x() + rect.width() - 21 / scale))) < maximumOffset && qAbs((int)(pos.y() - (rect.y() + rect.height() / 2 + 9))) < 6) {
+ } else if ((rect.right() - pos.x() < 16 / scale) && (rect.bottom() - pos.y() <= addtransitionOffset)) {
setToolTip(i18n("Add transition"));
return TRANSITIONEND;
}
//kDebug() << "// PREP AUDIO THMB FRMO : scale:" << pixelForOneFrame<< ", from: " << startpixel << ", to: " << endpixel;
//if ( (!audioThumbWasDrawn || framePixelWidth!=pixelForOneFrame ) && !baseClip()->audioFrameChache.isEmpty()){
- for (int startCache = startpixel - startpixel % 100;startCache < endpixel;startCache += 100) {
+ for (int startCache = startpixel - startpixel % 100; startCache < endpixel; startCache += 100) {
//kDebug() << "creating " << startCache;
//if (framePixelWidth!=pixelForOneFrame ||
if (m_framePixelWidth == pixelForOneFrame && m_audioThumbCachePic.contains(startCache))
int channelHeight = m_audioThumbCachePic[startCache].height() / channels;
- for (int i = 0;i < channels;i++) {
+ for (int i = 0; i < channels; i++) {
positiveChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2);
negativeChannelPaths[i].moveTo(0, channelHeight*i + channelHeight / 2);
}
- for (int samples = 0;samples <= 100;samples++) {
+ for (int samples = 0; samples <= 100; samples++) {
double frame = (double)(samples + startCache - 0) / pixelForOneFrame;
int sample = (int)((frame - (int)(frame)) * 20); // AUDIO_FRAME_SIZE
if (frame < 0 || sample < 0 || sample > 19)
continue;
QMap<int, QByteArray> frame_channel_data = baseClip()->m_audioFrameCache[(int)frame];
- for (int channel = 0;channel < channels && frame_channel_data[channel].size() > 0;channel++) {
+ for (int channel = 0; channel < channels && frame_channel_data[channel].size() > 0; channel++) {
int y = channelHeight * channel + channelHeight / 2;
int delta = (int)(frame_channel_data[channel][sample] - 127 / 2) * channelHeight / 64;
negativeChannelPaths[channel].lineTo(samples, 0.1 + y - delta);
}
}
- for (int channel = 0;channel < channels ;channel++)
+ for (int channel = 0; channel < channels ; channel++)
if (fullAreaDraw && samples == 100) {
positiveChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2);
negativeChannelPaths[channel].lineTo(samples, channelHeight*channel + channelHeight / 2);
pixpainter.setPen(QPen(QColor(0, 0, 0)));
pixpainter.setBrush(QBrush(QColor(60, 60, 60)));
- for (int i = 0;i < channels;i++) {
+ for (int i = 0; i < channels; i++) {
if (fullAreaDraw) {
//pixpainter.fillPath(positiveChannelPaths[i].united(negativeChannelPaths[i]),QBrush(Qt::SolidPattern));//or singleif looks better
pixpainter.drawPath(positiveChannelPaths[i].united(negativeChannelPaths[i]));//or singleif looks better
QGraphicsRectItem::mouseReleaseEvent(event);
}
+/*
//virtual
-void ClipItem::hoverEnterEvent(QGraphicsSceneHoverEvent */*e*/)
+void ClipItem::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
{
//if (e->pos().x() < 20) m_hover = true;
+ return;
if (isItemLocked()) return;
m_hover = true;
QRectF r = boundingRect();
- double width = 35 / projectScene()->scale();
+ double width = 35 / projectScene()->scale().x();
double height = r.height() / 2;
//WARNING: seems like it generates a full repaint of the clip, maybe not so good...
update(r.x(), r.y() + height, width, height);
if (isItemLocked()) return;
m_hover = false;
QRectF r = boundingRect();
- double width = 35 / projectScene()->scale();
+ double width = 35 / projectScene()->scale().x();
double height = r.height() / 2;
//WARNING: seems like it generates a full repaint of the clip, maybe not so good...
update(r.x(), r.y() + height, width, height);
update(r.right() - width, r.y() + height, width, height);
}
+*/
void ClipItem::resizeStart(int posx, double /*speed*/)
{
QTextStream txtNeu(&neu);
if (values.size() > 0)
txtNeu << (int)values[0].toDouble();
- for (int i = 0;i < separators.size() && i + 1 < values.size();i++) {
+ for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) {
txtNeu << separators[i];
txtNeu << (int)(values[i+1].toDouble());
}