m_position(0),
m_currentKeyframe(-1),
m_currentKeyframeOriginal(-1),
+ m_hoverKeyframe(-1),
m_lineHeight(10),
m_scale(1)
{
m_colKeyframeBg = scheme.shade(KColorScheme::MidShade);
}
-void SimpleTimelineWidget::setKeyframes(QList <int> keyframes)
+void SimpleTimelineWidget::setKeyframes(const QList<int> &keyframes)
{
m_keyframes = keyframes;
qSort(m_keyframes);
m_currentKeyframe = m_currentKeyframeOriginal = -1;
+ emit atKeyframe(m_keyframes.contains(m_position));
update();
}
void SimpleTimelineWidget::slotSetPosition(int pos)
{
- m_position = pos;
- update();
+ if (pos != m_position) {
+ m_position = pos;
+ emit atKeyframe(m_keyframes.contains(m_position));
+ update();
+ }
}
void SimpleTimelineWidget::slotAddKeyframe(int pos, int select)
update();
emit keyframeAdded(pos);
+ if (pos == m_position)
+ emit atKeyframe(true);
}
void SimpleTimelineWidget::slotAddRemove()
m_currentKeyframe = m_currentKeyframeOriginal = -1;
update();
emit keyframeRemoved(pos);
+ if (pos == m_position)
+ emit atKeyframe(false);
}
void SimpleTimelineWidget::setDuration(int dur)
void SimpleTimelineWidget::slotGoToNext()
{
+ if (m_position == m_duration)
+ return;
+
foreach (const int &keyframe, m_keyframes) {
if (keyframe > m_position) {
slotSetPosition(keyframe);
emit positionChanged(keyframe);
+ emit atKeyframe(true);
return;
}
}
// no keyframe after current position
slotSetPosition(m_duration);
emit positionChanged(m_duration);
+ emit atKeyframe(false);
}
void SimpleTimelineWidget::slotGoToPrev()
{
+ if (m_position == 0)
+ return;
+
for (int i = m_keyframes.count() - 1; i >= 0; --i) {
if (m_keyframes.at(i) < m_position) {
slotSetPosition(m_keyframes.at(i));
emit positionChanged(m_keyframes.at(i));
+ emit atKeyframe(true);
return;
}
}
// no keyframe before current position
slotSetPosition(0);
emit positionChanged(0);
+ emit atKeyframe(false);
}
void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event)
m_currentKeyframe = m_currentKeyframeOriginal = -1;
m_position = pos;
emit positionChanged(pos);
+ emit atKeyframe(m_keyframes.contains(pos));
update();
}
void SimpleTimelineWidget::mouseMoveEvent(QMouseEvent* event)
{
+ int pos = qBound(0, (int)(event->x() / m_scale), m_duration);
if (event->buttons() & Qt::LeftButton) {
- int pos = qBound(0, (int)(event->x() / m_scale), m_duration);
if (m_currentKeyframe >= 0) {
- // should we maybe sort here?
- m_keyframes[m_keyframes.indexOf(m_currentKeyframe)] = pos;
- m_currentKeyframe = pos;
- emit keyframeMoving(m_currentKeyframeOriginal, m_currentKeyframe);
+ if (!m_keyframes.contains(pos)) {
+ // snap to position cursor
+ if (KdenliveSettings::snaptopoints() && qAbs(pos - m_position) < 5 && !m_keyframes.contains(m_position))
+ pos = m_position;
+ // should we maybe sort here?
+ m_keyframes[m_keyframes.indexOf(m_currentKeyframe)] = pos;
+ m_currentKeyframe = pos;
+ emit keyframeMoving(m_currentKeyframeOriginal, m_currentKeyframe);
+ emit atKeyframe(m_keyframes.contains(m_position));
+ }
} else {
m_position = pos;
emit positionChanged(pos);
+ emit atKeyframe(m_keyframes.contains(pos));
}
update();
return;
- }
+ } else {
+ if (event->y() < m_lineHeight) {
+ foreach(const int &keyframe, m_keyframes) {
+ if (qAbs(keyframe - pos) < 5) {
+ m_hoverKeyframe = keyframe;
+ setCursor(Qt::PointingHandCursor);
+ update();
+ return;
+ }
+ }
+ }
- // cursor
+ if (m_hoverKeyframe != -1) {
+ m_hoverKeyframe = -1;
+ setCursor(Qt::ArrowCursor);
+ update();
+ }
+ }
}
void SimpleTimelineWidget::mouseReleaseEvent(QMouseEvent* event)
}
}
+void SimpleTimelineWidget::mouseDoubleClickEvent(QMouseEvent* event)
+{
+ if (event->button() == Qt::LeftButton && event->y() < m_lineHeight) {
+ int pos = qBound(0, (int)(event->x() / m_scale), m_duration);
+ foreach(const int &keyframe, m_keyframes) {
+ if (qAbs(keyframe - pos) < 5) {
+ m_keyframes.removeAll(keyframe);
+ if (keyframe == m_currentKeyframe)
+ m_currentKeyframe = m_currentKeyframeOriginal = -1;
+ emit keyframeRemoved(keyframe);
+ if (keyframe == m_position)
+ emit atKeyframe(false);
+ return;
+ }
+ }
+
+ // add new keyframe
+ m_keyframes.append(pos);
+ qSort(m_keyframes);
+ emit keyframeAdded(pos);
+ if (pos == m_position)
+ emit atKeyframe(true);
+ } else {
+ QWidget::mouseDoubleClickEvent(event);
+ }
+}
+
void SimpleTimelineWidget::wheelEvent(QWheelEvent* event)
{
int change = event->delta() < 0 ? -1 : 1;
- if (m_currentKeyframe > 0) {
+ /*if (m_currentKeyframe > 0) {
m_currentKeyframe = qBound(0, m_currentKeyframe + change, m_duration);
emit keyframeMoved(m_currentKeyframeOriginal, m_currentKeyframe);
- } else {
+ } else { */
m_position = qBound(0, m_position + change, m_duration);
emit positionChanged(m_position);
- }
+// }
+ emit atKeyframe(m_keyframes.contains(m_position));
update();
}
foreach (const int &pos, m_keyframes) {
tmp = keyframe;
tmp.translate(pos * m_scale, 0);
- if (pos == m_currentKeyframe)
+ if (pos == m_currentKeyframe || pos == m_hoverKeyframe)
p.setBrush(m_colSelected);
p.drawConvexPolygon(tmp);
p.drawLine(QLineF(0, -1, 0, 5).translated(pos * m_scale, 0));
- if (pos == m_currentKeyframe)
+ if (pos == m_currentKeyframe || pos == m_hoverKeyframe)
p.setBrush(m_colKeyframeBg);
}