+void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF /*exposedRect*/)
+{
+ if (m_keyframes.count() < 1)
+ return;
+ QRectF br = rect();
+ double maxw = br.width() / cropDuration().frames(m_fps);
+ double maxh = br.height() / 100.0 * m_keyframeFactor;
+ double x1;
+ double y1;
+ double x2;
+ double y2;
+
+ // draw line showing default value
+ bool active = isSelected() || (parentItem() && parentItem()->isSelected());
+ if (active) {
+ x1 = br.x();
+ x2 = br.right();
+ y1 = br.bottom() - m_keyframeDefault * maxh;
+ QLineF l(x1, y1, x2, y1);
+ QLineF l2 = painter->matrix().map(l);
+ painter->setPen(QColor(168, 168, 168, 180));
+ painter->drawLine(l2);
+ painter->setPen(QColor(108, 108, 108, 180));
+ painter->drawLine(l2.translated(0, 1));
+ painter->setPen(QColor(Qt::white));
+ }
+
+ // draw keyframes
+ QMap<int, int>::const_iterator i = m_keyframes.constBegin();
+ QColor color(Qt::blue);
+ x1 = br.x() + maxw * (i.key() - cropStart().frames(m_fps));
+ y1 = br.bottom() - i.value() * maxh;
+ QLineF l2;
+ while (i != m_keyframes.constEnd()) {
+ if (i.key() == m_editedKeyframe)
+ color = QColor(Qt::red);
+ else
+ color = QColor(Qt::blue);
+ ++i;
+ if (i == m_keyframes.constEnd() && m_keyframes.count() != 1)
+ break;
+
+ if (m_keyframes.count() == 1) {
+ x2 = br.right();
+ y2 = y1;
+ } else {
+ x2 = br.x() + maxw * (i.key() - cropStart().frames(m_fps));
+ y2 = br.bottom() - i.value() * maxh;
+ }
+ QLineF l(x1, y1, x2, y2);
+ l2 = painter->matrix().map(l);
+ painter->drawLine(l2);
+ if (active) {
+ const QRectF frame(l2.x1() - 3, l2.y1() - 3, 6, 6);
+ painter->fillRect(frame, color);
+ }
+ x1 = x2;
+ y1 = y2;
+ }
+ if (active) {
+ const QRectF frame(l2.x2() - 3, l2.y2() - 3, 6, 6);
+ painter->fillRect(frame, color);
+ }