m_speed(speed),
m_strobe(strobe),
m_framePixelWidth(0),
- m_limitedKeyFrames(false)
+ m_limitedKeyFrames(false),
+ m_isMainSelectedClip(false)
{
setZValue(2);
m_effectList = EffectsList(true);
const QStyleOptionGraphicsItem *option,
QWidget *)
{
+ QPalette palette = scene()->palette();
QColor paintColor;
+ QColor textColor;
+ QColor textBgColor;
QPen framePen;
if (parentItem()) paintColor = QColor(255, 248, 149);
else paintColor = m_baseColor;
if (isSelected() || (parentItem() && parentItem()->isSelected())) {
+ textColor = palette.highlightedText().color();
+ textBgColor = palette.highlight().color();
paintColor = paintColor.darker();
- framePen.setColor(Qt::red);
- framePen.setWidthF(2.0);
+ framePen.setColor(textBgColor);
}
else {
+ textColor = palette.text().color();
+ textBgColor = palette.window().color();
+ textBgColor.setAlpha(200);
framePen.setColor(paintColor.darker());
}
-
const QRectF exposed = option->exposedRect;
- painter->setClipRect(exposed);
- painter->fillRect(exposed, paintColor);
- painter->setWorldMatrixEnabled(false);;
+ const QRectF mappedExposed = painter->worldTransform().mapRect(exposed);
const QRectF mapped = painter->worldTransform().mapRect(rect());
+ painter->setWorldMatrixEnabled(false);
+ QPainterPath p;
+ p.addRect(mappedExposed);
+ QPainterPath q;
+ q.addRoundedRect(mapped.adjusted(0, 0, -0.5, 0), 3, 3);
+ painter->setClipPath(p.intersected(q));
+ painter->setPen(Qt::NoPen);
+ painter->fillRect(mappedExposed, paintColor);
+ painter->setPen(paintColor.darker());
// draw thumbnails
if (KdenliveSettings::videothumbnails() && !isAudioOnly()) {
- QPen pen = painter->pen();
- pen.setColor(QColor(255, 255, 255, 150));
- painter->setPen(pen);
if ((m_clipType == IMAGE || m_clipType == TEXT) && !m_startPix.isNull()) {
const QPointF top = mapped.topRight() - QPointF(m_startPix.width() - 1, 0);
painter->drawPixmap(top, m_startPix);
else {
#if KDE_IS_VERSION(4,5,0)
if (m_clip && m_clip->thumbProducer()) {
- QString path = m_clip->fileURL().path() + "_";
+ QString path = m_clip->fileURL().path() + '_';
QImage img;
QPen pen(Qt::white);
pen.setStyle(Qt::DotLine);
- painter->setPen(pen);
QList <int> missing;
for (int i = left; i <= right; i++) {
img = m_clip->thumbProducer()->findCachedThumb(path + QString::number(i));
#endif
}
}
- painter->setPen(Qt::black);
}
// draw audio thumbnails
// Draw effects names
if (!m_effectNames.isEmpty() && mapped.width() > 40) {
QRectF txtBounding = painter->boundingRect(mapped, Qt::AlignLeft | Qt::AlignTop, m_effectNames);
- QColor bgColor;
+ QColor bColor = palette.window().color();
+ QColor tColor = palette.text().color();
+ tColor.setAlpha(220);
if (m_timeLine && m_timeLine->state() == QTimeLine::Running) {
qreal value = m_timeLine->currentValue();
txtBounding.setWidth(txtBounding.width() * value);
- bgColor.setRgb(50 + 200 *(1.0 - value), 50, 50, 100 + 50 * value);
- } else bgColor.setRgb(50, 50, 90, 180);
-
- QPainterPath rounded;
- rounded.moveTo(txtBounding.bottomRight());
- rounded.arcTo(txtBounding.right() - txtBounding.height() - 2, txtBounding.top() - txtBounding.height(), txtBounding.height() * 2, txtBounding.height() * 2, 270, 90);
- rounded.lineTo(txtBounding.topLeft());
- rounded.lineTo(txtBounding.bottomLeft());
- painter->fillPath(rounded, bgColor);
- painter->setPen(Qt::lightGray);
- painter->drawText(txtBounding.adjusted(1, 0, 1, 0), Qt::AlignCenter, m_effectNames);
+ bColor.setAlpha(100 + 50 * value);
+ };
+
+ painter->setBrush(bColor);
+ painter->setPen(Qt::NoPen);
+ painter->drawRoundedRect(txtBounding.adjusted(-1, -2, 4, -1), 3, 3);
+ painter->setPen(tColor);
+ painter->drawText(txtBounding.adjusted(2, 0, 1, -1), Qt::AlignCenter, m_effectNames);
}
- const QRectF txtBounding2 = painter->boundingRect(mapped, Qt::AlignHCenter | Qt::AlignVCenter, ' ' + m_clipName + ' ');
- painter->setBrush(framePen.color());
- painter->setPen(Qt::NoPen);
- painter->drawRoundedRect(txtBounding2, 3, 3);
+ // Draw clip name
+ const QRectF txtBounding2 = painter->boundingRect(mapped, Qt::AlignRight | Qt::AlignTop, m_clipName + ' ').adjusted(0, -1, 0, -1);
+ painter->setPen(Qt::NoPen);
+ if (m_isMainSelectedClip) {
+ framePen.setColor(Qt::red);
+ textBgColor = Qt::red;
+ }
+ painter->fillRect(txtBounding2.adjusted(-3, 0, 0, 0), textBgColor);
painter->setBrush(QBrush(Qt::NoBrush));
-
+ painter->setPen(textColor);
if (m_videoOnly) {
painter->drawPixmap(txtBounding2.topLeft() - QPointF(17, -1), m_videoPix);
} else if (m_audioOnly) {
painter->drawPixmap(txtBounding2.topLeft() - QPointF(17, -1), m_audioPix);
}
- painter->setPen(Qt::white);
- painter->drawText(txtBounding2, Qt::AlignCenter, m_clipName);
+ painter->drawText(txtBounding2, Qt::AlignLeft, m_clipName);
// draw markers
painter->drawLine(l2);
if (KdenliveSettings::showmarkers()) {
framepos = rect().x() + pos.frames(m_fps);
- const QRectF r1(framepos + 0.04, 10, rect().width() - framepos - 2, rect().height() - 10);
+ const QRectF r1(framepos + 0.04, rect().height()/3, rect().width() - framepos - 2, rect().height() / 2);
const QRectF r2 = painter->worldTransform().mapRect(r1);
const QRectF txtBounding3 = painter->boundingRect(r2, Qt::AlignLeft | Qt::AlignTop, ' ' + (*it).comment() + ' ');
painter->setBrush(markerBrush);
// draw clip border
// expand clip rect to allow correct painting of clip border
painter->setClipping(false);
+ painter->setRenderHint(QPainter::Antialiasing, true);
+ framePen.setWidthF(1.5);
painter->setPen(framePen);
- if (isSelected() || (parentItem() && parentItem()->isSelected())) {
- painter->drawRect(mapped.adjusted(0.5, 0.5, -0.5, -0.5));
- }
- else {
- painter->drawRect(mapped.adjusted(0, 0, -0.5, 0));
- }
+ painter->drawRoundedRect(mapped.adjusted(0, 0, -0.5, -0.5), 3, 3);
}
}
QRectF rect = sceneBoundingRect();
int addtransitionOffset = 10;
- // Don't allow add transition if track height is very small
- if (rect.height() < 30) addtransitionOffset = 0;
+ // Don't allow add transition if track height is very small. No transitions for audio only clips
+ if (rect.height() < 30 || isAudioOnly() || m_clipType == AUDIO) addtransitionOffset = 0;
if (qAbs((int)(pos.x() - (rect.x() + m_startFade))) < maximumOffset && qAbs((int)(pos.y() - rect.y())) < 6) {
return FADEIN;
QList <GenTime> ClipItem::snapMarkers() const
{
QList < GenTime > snaps;
- QList < GenTime > markers = baseClip()->snapMarkers();
+ if (!m_clip) return snaps;
+ QList < GenTime > markers = m_clip->snapMarkers();
GenTime pos;
for (int i = 0; i < markers.size(); i++) {
QList <CommentedTime> ClipItem::commentedSnapMarkers() const
{
QList < CommentedTime > snaps;
- QList < CommentedTime > markers = baseClip()->commentedSnapMarkers();
+ if (!m_clip) return snaps;
+ QList < CommentedTime > markers = m_clip->commentedSnapMarkers();
GenTime pos;
for (int i = 0; i < markers.size(); i++) {
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
newPos.setX(xpos);
- int newTrack = newPos.y() / KdenliveSettings::trackheight();
+ // Warning: newPos gives a position relative to the click event, so hack to get absolute pos
+ int yOffset = property("y_absolute").toInt() + newPos.y();
+ int newTrack = yOffset / KdenliveSettings::trackheight();
newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
newTrack = qMax(newTrack, 0);
newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + 1));
needInOutSync = true;
}
if (e.attribute("type") == "simplekeyframe") {
- QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
+ QStringList values = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
double factor = locale.toDouble(e.attribute("factor", "1"));
double offset = e.attribute("offset", "0").toDouble();
if (factor != 1 || offset != 0) {
for (int j = 0; j < values.count(); j++) {
QString pos = values.at(j).section(':', 0, 0);
double val = (locale.toDouble(values.at(j).section(':', 1, 1)) - offset) / factor;
- values[j] = pos + "=" + locale.toString(val);
+ values[j] = pos + '=' + locale.toString(val);
}
}
parameters.addParam(e.attribute("name"), values.join(";"));
if (m_speed <= 0 && m_speed > -1)
m_speed = -1.0;
m_strobe = strobe;
- if (m_speed == 1.0) m_clipName = baseClip()->name();
- else m_clipName = baseClip()->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
+ if (m_speed == 1.0) m_clipName = m_clip->name();
+ else m_clipName = m_clip->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
m_info.cropStart = GenTime((int)(m_speedIndependantInfo.cropStart.frames(m_fps) / qAbs(m_speed) + 0.5), m_fps);
m_info.cropDuration = GenTime((int)(m_speedIndependantInfo.cropDuration.frames(m_fps) / qAbs(m_speed) + 0.5), m_fps);
//update();
newkfr.append(str);
} else if (!added) {
if (i == m_visibleParam)
- newkfr.append(QString::number(pos) + ":" + QString::number(val));
+ newkfr.append(QString::number(pos) + ':' + QString::number(val));
else
- newkfr.append(QString::number(pos) + ":" + locale.toString(newval));
+ newkfr.append(QString::number(pos) + ':' + locale.toString(newval));
if (kpos > pos) newkfr.append(str);
added = true;
} else newkfr.append(str);
}
if (!added) {
if (i == m_visibleParam)
- newkfr.append(QString::number(pos) + ":" + QString::number(val));
+ newkfr.append(QString::number(pos) + ':' + QString::number(val));
else
- newkfr.append(QString::number(pos) + ":" + e.attribute("default"));
+ newkfr.append(QString::number(pos) + ':' + e.attribute("default"));
}
e.setAttribute("keyframes", newkfr.join(";"));
}
newpos = qMax(newpos, start);
newpos = qMin(newpos, end);
if (i == m_visibleParam)
- newkfr.append(QString::number(newpos) + ":" + locale.toString(value));
+ newkfr.append(QString::number(newpos) + ':' + locale.toString(value));
else
- newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1));
+ newkfr.append(QString::number(newpos) + ':' + str.section(':', 1, 1));
}
}
e.setAttribute("keyframes", newkfr.join(";"));
if (isAudioOnly())
return m_clip->audioProducer(track);
else if (isVideoOnly())
- return m_clip->videoProducer();
+ return m_clip->videoProducer(track);
else
return m_clip->getProducer(trackSpecific ? track : -1);
}
if (offset > 0) {
QStringList kfrs = data.split(';');
data.clear();
- foreach (QString keyframe, kfrs) {
+ foreach (const QString &keyframe, kfrs) {
if (keyframe.contains('=')) {
int pos = keyframe.section('=', 0, 0).toInt();
pos += offset;
- data.append(QString::number(pos) + "=" + keyframe.section('=', 1) + ";");
+ data.append(QString::number(pos) + '=' + keyframe.section('=', 1) + ";");
}
- else data.append(keyframe + ";");
+ else data.append(keyframe + ';');
}
}
Mlt::Geometry geometry(data.toUtf8().data(), oldInfo.cropDuration.frames(m_fps), width, height);
update();
}
+void ClipItem::setMainSelectedClip(bool selected)
+{
+ if (selected == m_isMainSelectedClip) return;
+ m_isMainSelectedClip = selected;
+ update();
+}
+
+bool ClipItem::isMainSelectedClip()
+{
+ return m_isMainSelectedClip;
+}
+
#include "clipitem.moc"