X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipitem.cpp;h=47a0c73e14ed97de696cd819fa2f1f35142d6c67;hb=d213b296a20981638a0bdfd4ec479d86ef16a41a;hp=5d73dc42241e73cb13d83c63d1093a1887ef86e8;hpb=12bd13b246f3cf974339c619c62104ca10af3170;p=kdenlive diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 5d73dc42..47a0c73e 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -60,8 +60,7 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i m_speed(speed), m_strobe(strobe), m_framePixelWidth(0), - m_limitedKeyFrames(false), - m_isMainSelectedClip(false) + m_limitedKeyFrames(false) { setZValue(2); m_effectList = EffectsList(true); @@ -795,7 +794,7 @@ void ClipItem::paint(QPainter *painter, QPainterPath p; p.addRect(mappedExposed); QPainterPath q; - q.addRoundedRect(mapped.adjusted(0, 0, -0.5, 0), 3, 3); + q.addRoundedRect(mapped, 3, 3); painter->setClipPath(p.intersected(q)); painter->setPen(Qt::NoPen); painter->fillRect(mappedExposed, paintColor); @@ -890,8 +889,8 @@ void ClipItem::paint(QPainter *painter, } for (int startCache = mappedStartPixel - (mappedStartPixel) % 100; startCache < mappedEndPixel; startCache += 100) { - if (m_audioThumbCachePic.contains(startCache) && !m_audioThumbCachePic[startCache].isNull()) - painter->drawPixmap(clipStart + startCache - cropLeft, mappedRect.y(), m_audioThumbCachePic[startCache]); + if (!m_audioThumbCachePic.value(startCache).isNull()) + painter->drawPixmap(clipStart + startCache - cropLeft, mappedRect.y(), m_audioThumbCachePic.value(startCache)); } } @@ -941,10 +940,8 @@ void ClipItem::paint(QPainter *painter, QList < CommentedTime >::Iterator it = markers.begin(); GenTime pos; double framepos; - QBrush markerBrush(QColor(120, 120, 0, 140)); + QBrush markerBrush(QColor(120, 120, 0, 140)); QPen pen = painter->pen(); - pen.setColor(QColor(255, 255, 255, 200)); - pen.setStyle(Qt::DotLine); for (; it != markers.end(); ++it) { pos = GenTime((int)((*it).time().frames(m_fps) / qAbs(m_speed) + 0.5), m_fps) - cropStart(); @@ -952,6 +949,8 @@ void ClipItem::paint(QPainter *painter, if (pos > cropDuration()) break; QLineF l(rect().x() + pos.frames(m_fps), rect().y(), rect().x() + pos.frames(m_fps), rect().bottom()); QLineF l2 = painter->worldTransform().map(l); + pen.setColor(CommentedTime::markerColor((*it).markerType())); + pen.setStyle(Qt::DotLine); painter->setPen(pen); painter->drawLine(l2); if (KdenliveSettings::showmarkers()) { @@ -960,9 +959,10 @@ void ClipItem::paint(QPainter *painter, const QRectF r2 = painter->worldTransform().mapRect(r1); const QRectF txtBounding3 = painter->boundingRect(r2, Qt::AlignLeft | Qt::AlignTop, ' ' + (*it).comment() + ' '); painter->setBrush(markerBrush); - painter->setPen(Qt::NoPen); - painter->drawRoundedRect(txtBounding3, 3, 3); - painter->setBrush(QBrush(Qt::NoBrush)); + pen.setStyle(Qt::SolidLine); + painter->setPen(pen); + painter->drawRect(txtBounding3); + painter->setBrush(Qt::NoBrush); painter->setPen(Qt::white); painter->drawText(txtBounding3, Qt::AlignCenter, (*it).comment()); } @@ -1016,7 +1016,7 @@ void ClipItem::paint(QPainter *painter, painter->setRenderHint(QPainter::Antialiasing, true); framePen.setWidthF(1.5); painter->setPen(framePen); - painter->drawRoundedRect(mapped.adjusted(0, 0, -0.5, -0.5), 3, 3); + painter->drawRoundedRect(mapped.adjusted(0.5, 0, -0.5, 0), 3, 3); } @@ -1093,7 +1093,7 @@ QList ClipItem::commentedSnapMarkers() const pos = GenTime((int)(markers.at(i).time().frames(m_fps) / qAbs(m_speed) + 0.5), m_fps) - cropStart(); if (pos > GenTime()) { if (pos > cropDuration()) break; - else snaps.append(CommentedTime(pos + startPos(), markers.at(i).comment())); + else snaps.append(CommentedTime(pos + startPos(), markers.at(i).comment(), markers.at(i).markerType())); } } return snaps; @@ -1101,87 +1101,107 @@ QList ClipItem::commentedSnapMarkers() const void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, int startpixel, int endpixel, int channels) { + // Bail out, if caller provided invalid data + if (channels <= 0) { + kWarning() << "Unable to draw image with " << channels << "number of channels"; + return; + } QRectF re = sceneBoundingRect(); if (m_clipType == AV && !isAudioOnly()) re.setTop(re.y() + re.height() / 2); + int factor = 64; + if (KdenliveSettings::normaliseaudiothumbs()) { + factor = m_clip->getProperty("audio_max").toInt(); + } //kDebug() << "// PREP AUDIO THMB FRMO : scale:" << pixelForOneFrame<< ", from: " << startpixel << ", to: " << endpixel; //if ( (!audioThumbWasDrawn || framePixelWidth!=pixelForOneFrame ) && !baseClip()->audioFrameChache.isEmpty()){ + bool fullAreaDraw = pixelForOneFrame < 10; + bool simplifiedAudio = !KdenliveSettings::displayallchannels(); + QPen audiopen; + audiopen.setWidth(0); + if (simplifiedAudio) channels = 1; + int channelHeight = re.height() / channels; + QMap positiveChannelPaths; + QMap negativeChannelPaths; for (int startCache = startpixel - startpixel % 100; startCache < endpixel; startCache += 100) { - //kDebug() << "creating " << startCache; - //if (framePixelWidth!=pixelForOneFrame || if (m_framePixelWidth == pixelForOneFrame && m_audioThumbCachePic.contains(startCache)) continue; - if (m_audioThumbCachePic[startCache].isNull() || m_framePixelWidth != pixelForOneFrame) { - m_audioThumbCachePic[startCache] = QPixmap(100, (int)(re.height())); - m_audioThumbCachePic[startCache].fill(QColor(180, 180, 200, 140)); + if (m_audioThumbCachePic.value(startCache).isNull() || m_framePixelWidth != pixelForOneFrame) { + QPixmap pix(100, (int)(re.height())); + pix.fill(QColor(180, 180, 180, 150)); + m_audioThumbCachePic[startCache] = pix; } - bool fullAreaDraw = pixelForOneFrame < 10; - QMap positiveChannelPaths; - QMap negativeChannelPaths; + positiveChannelPaths.clear(); + negativeChannelPaths.clear(); + QPainter pixpainter(&m_audioThumbCachePic[startCache]); - QPen audiopen; - audiopen.setWidth(0); - pixpainter.setPen(audiopen); - //pixpainter.setRenderHint(QPainter::Antialiasing,true); - //pixpainter.drawLine(0,0,100,re.height()); - // Bail out, if caller provided invalid data - if (channels <= 0) { - kWarning() << "Unable to draw image with " << channels << "number of channels"; - return; - } - int channelHeight = m_audioThumbCachePic[startCache].height() / channels; - - 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 i = 0; i < channels; i++) { + if (simplifiedAudio) { + positiveChannelPaths[i].moveTo(-1, channelHeight); + } + else if (fullAreaDraw) { + positiveChannelPaths[i].moveTo(-1, channelHeight*i + channelHeight / 2); + negativeChannelPaths[i].moveTo(-1, channelHeight*i + channelHeight / 2); + } + else { + positiveChannelPaths[i].moveTo(-1, channelHeight*i + channelHeight / 2); + audiopen.setColor(QColor(60, 60, 60, 50)); + pixpainter.setPen(audiopen); + pixpainter.drawLine(0, channelHeight*i + channelHeight / 2, 100, channelHeight*i + channelHeight / 2); + } + } 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 frame_channel_data = baseClip()->m_audioFrameCache[(int)frame]; - - 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; - if (fullAreaDraw) { - positiveChannelPaths[channel].lineTo(samples, 0.1 + y + qAbs(delta)); - negativeChannelPaths[channel].lineTo(samples, 0.1 + y - qAbs(delta)); + const QMap frame_channel_data = baseClip()->audioFrameCache.value((int)frame); + + for (int channel = 0; channel < channels && !frame_channel_data.value(channel).isEmpty(); channel++) { + int y = channelHeight * channel + channelHeight / 2; + if (simplifiedAudio) { + double delta = qAbs((frame_channel_data.value(channel).at(sample) - 63.5) * channelHeight / factor); + positiveChannelPaths[channel].lineTo(samples, channelHeight - delta); + } else if (fullAreaDraw) { + double delta = qAbs((frame_channel_data.value(channel).at(sample) - 63.5) * channelHeight / (2 * factor)); + positiveChannelPaths[channel].lineTo(samples, y + delta); + negativeChannelPaths[channel].lineTo(samples, y - delta); } else { - positiveChannelPaths[channel].lineTo(samples, 0.1 + y + delta); - negativeChannelPaths[channel].lineTo(samples, 0.1 + y - delta); + double delta = (frame_channel_data.value(channel).at(sample) - 63.5) * channelHeight / (2 * factor); + positiveChannelPaths[channel].lineTo(samples, y + delta); } } - 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); - positiveChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2); - negativeChannelPaths[channel].lineTo(0, channelHeight*channel + channelHeight / 2); - } - } - pixpainter.setPen(QPen(QColor(0, 0, 0))); - pixpainter.setBrush(QBrush(QColor(60, 60, 60))); - + for (int channel = 0; channel < channels; channel++) { + if (simplifiedAudio) { + positiveChannelPaths[channel].lineTo(101, channelHeight); + } else if (fullAreaDraw) { + int y = channelHeight * channel + channelHeight / 2; + positiveChannelPaths[channel].lineTo(101, y); + negativeChannelPaths[channel].lineTo(101, y); + } + } + if (fullAreaDraw || simplifiedAudio) { + audiopen.setColor(QColor(80, 80, 80, 200)); + pixpainter.setPen(audiopen); + pixpainter.setBrush(QBrush(QColor(120, 120, 120, 200))); + } + else { + audiopen.setColor(QColor(60, 60, 60, 100)); + pixpainter.setPen(audiopen); + pixpainter.setBrush(Qt::NoBrush); + } 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 + pixpainter.drawPath(positiveChannelPaths[i].united(negativeChannelPaths.value(i))); } else - pixpainter.drawPath(positiveChannelPaths[i]); + pixpainter.drawPath(positiveChannelPaths.value(i)); } } - //audioThumbWasDrawn=true; m_framePixelWidth = pixelForOneFrame; - - //} } int ClipItem::fadeIn() const @@ -1250,7 +1270,7 @@ void ClipItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) } */ -void ClipItem::resizeStart(int posx, bool /*size*/) +void ClipItem::resizeStart(int posx, bool /*size*/, bool emitChange) { bool sizeLimit = false; if (clipType() != IMAGE && clipType() != COLOR && clipType() != TEXT) { @@ -1273,9 +1293,15 @@ void ClipItem::resizeStart(int posx, bool /*size*/) m_startThumbTimer.start(150); } } + if (emitChange) slotUpdateRange(); +} + +void ClipItem::slotUpdateRange() +{ + if (m_isMainSelectedClip) emit updateRange(); } -void ClipItem::resizeEnd(int posx) +void ClipItem::resizeEnd(int posx, bool emitChange) { const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps); if (posx > max && maxDuration() != GenTime()) posx = max; @@ -1294,6 +1320,7 @@ void ClipItem::resizeEnd(int posx) m_endThumbTimer.start(150); } } + if (emitChange) slotUpdateRange(); } //virtual @@ -1917,8 +1944,9 @@ QMap ClipItem::adjustEffectsToDuration(int width, int height, effects[i] = effect.cloneNode().toElement(); EffectsList::setParameter(effect, "out", QString::number(clipEnd)); } - if (effects.contains(i)) + if (effects.contains(i)) { setFadeIn(out - in); + } } else { if (out != clipEnd) { effects[i] = effect.cloneNode().toElement(); @@ -2086,17 +2114,6 @@ void ClipItem::slotGotThumbsCache() update(); } -void ClipItem::setMainSelectedClip(bool selected) -{ - if (selected == m_isMainSelectedClip) return; - m_isMainSelectedClip = selected; - update(); -} - -bool ClipItem::isMainSelectedClip() -{ - return m_isMainSelectedClip; -} #include "clipitem.moc"