From c282041a6e3e087bdbba1c26b37f30c582c23db8 Mon Sep 17 00:00:00 2001 From: Till Theato Date: Fri, 18 Feb 2011 20:08:06 +0000 Subject: [PATCH] rotoscoping: Fix keyframes with crop from start > 0 svn path=/trunk/kdenlive/; revision=5424 --- src/rotoscoping/rotowidget.cpp | 18 ++++++------ src/simplekeyframes/simplekeyframewidget.cpp | 6 ++-- src/simplekeyframes/simplekeyframewidget.h | 2 +- src/simplekeyframes/simpletimelinewidget.cpp | 30 +++++++++----------- src/simplekeyframes/simpletimelinewidget.h | 5 ++-- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/rotoscoping/rotowidget.cpp b/src/rotoscoping/rotowidget.cpp index 3d557007..44cbfe60 100644 --- a/src/rotoscoping/rotowidget.cpp +++ b/src/rotoscoping/rotowidget.cpp @@ -43,7 +43,7 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode m_pos(0) { QVBoxLayout *l = new QVBoxLayout(this); - m_keyframeWidget = new SimpleKeyframeWidget(t, in, out, this); + m_keyframeWidget = new SimpleKeyframeWidget(t, m_out - m_in - 1, this); l->addWidget(m_keyframeWidget); MonitorEditWidget *edit = monitor->getEffectEdit(); @@ -63,16 +63,16 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode QMap map = m_data.toMap(); QMap ::const_iterator i = map.constBegin(); while (i != map.constEnd()) { - keyframes.append(i.key().toInt()); + keyframes.append(i.key().toInt() - m_in); ++i; } m_keyframeWidget->setKeyframes(keyframes); for (int j = 0; j < keyframes.count(); ++j) { // key might already be justified - if (map.contains(QString::number(keyframes.at(j)))) { - QVariant value = map.take(QString::number(keyframes.at(j))); - map[QString::number(keyframes.at(j)).rightJustified(qRound(log10((double)m_out)), '0')] = value; + if (map.contains(QString::number(keyframes.at(j) + m_in))) { + QVariant value = map.take(QString::number(keyframes.at(j) + m_in)); + map[QString::number(keyframes.at(j) + m_in).rightJustified(qRound(log10((double)m_out)), '0')] = value; } } m_data = QVariant(map); @@ -148,7 +148,7 @@ void RotoWidget::slotUpdateData(int pos, bool editing) if (m_data.canConvert(QVariant::Map)) { QMap map = m_data.toMap(); - map[QString::number(pos < 0 ? m_keyframeWidget->getPosition() : pos).rightJustified(qRound(log10((double)m_out)), '0')] = QVariant(vlist); + map[QString::number((pos < 0 ? m_keyframeWidget->getPosition() : pos) + m_in).rightJustified(qRound(log10((double)m_out)), '0')] = QVariant(vlist); m_data = QVariant(map); } else { m_data = QVariant(vlist); @@ -175,6 +175,8 @@ void RotoWidget::slotPositionChanged(int pos, bool seek) m_keyframeWidget->slotSetPosition(pos, false); + pos += m_in; + if (m_data.canConvert(QVariant::Map)) { QMap map = m_data.toMap(); QMap ::const_iterator i = map.constBegin(); @@ -217,7 +219,7 @@ void RotoWidget::slotPositionChanged(int pos, bool seek) } if (seek) - emit seekToPos(pos); + emit seekToPos(pos - m_in); } QList RotoWidget::getPoints(int keyframe) @@ -266,7 +268,7 @@ void RotoWidget::slotRemoveKeyframe(int pos) if (!m_data.canConvert(QVariant::Map) || m_data.toMap().count() < 2) return; - m_data.toMap().remove(QString::number(pos).rightJustified(qRound(log10((double)m_out)), '0')); + m_data.toMap().remove(QString::number(pos - m_in).rightJustified(qRound(log10((double)m_out)), '0')); if (m_data.toMap().count() == 1) m_data = m_data.toMap().begin().value(); diff --git a/src/simplekeyframes/simplekeyframewidget.cpp b/src/simplekeyframes/simplekeyframewidget.cpp index 47ad20e8..9221549a 100644 --- a/src/simplekeyframes/simplekeyframewidget.cpp +++ b/src/simplekeyframes/simplekeyframewidget.cpp @@ -26,7 +26,7 @@ #include #include -SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget *parent) : +SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int duration, QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -34,7 +34,7 @@ SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget QGridLayout *l = new QGridLayout(this); m_timeline = new SimpleTimelineWidget(this); - m_timeline->setRange(in ,out); + m_timeline->setDuration(duration); m_buttonAddDelete = new QToolButton(this); m_buttonAddDelete->setAutoRaise(true); @@ -52,7 +52,7 @@ SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget m_buttonNext->setToolTip(i18n("Go to next keyframe")); m_time = new TimecodeDisplay(t, this); - m_time->setRange(in, out); + m_time->setRange(0, duration); l->addWidget(m_timeline, 0, 0, 1, -1); l->addWidget(m_buttonPrevious, 1, 0); diff --git a/src/simplekeyframes/simplekeyframewidget.h b/src/simplekeyframes/simplekeyframewidget.h index f4c45bb8..fb1d500d 100644 --- a/src/simplekeyframes/simplekeyframewidget.h +++ b/src/simplekeyframes/simplekeyframewidget.h @@ -34,7 +34,7 @@ class SimpleKeyframeWidget : public QWidget Q_OBJECT public: - SimpleKeyframeWidget(Timecode t, int in, int out, QWidget* parent = 0); + SimpleKeyframeWidget(Timecode t, int duration, QWidget* parent = 0); virtual ~SimpleKeyframeWidget(); int getPosition(); diff --git a/src/simplekeyframes/simpletimelinewidget.cpp b/src/simplekeyframes/simpletimelinewidget.cpp index 9838005a..fd8b85f3 100644 --- a/src/simplekeyframes/simpletimelinewidget.cpp +++ b/src/simplekeyframes/simpletimelinewidget.cpp @@ -24,8 +24,7 @@ SimpleTimelineWidget::SimpleTimelineWidget(QWidget* parent) : QWidget(parent), - m_min(0), - m_max(1), + m_duration(1), m_position(0), m_currentKeyframe(-1), m_currentKeyframeOriginal(-1), @@ -82,10 +81,9 @@ void SimpleTimelineWidget::slotRemoveKeyframe(int pos) emit keyframeRemoved(pos); } -void SimpleTimelineWidget::setRange(int min, int max) +void SimpleTimelineWidget::setDuration(int dur) { - m_min = min; - m_max = max; + m_duration = dur; } void SimpleTimelineWidget::slotGoToNext() @@ -99,8 +97,8 @@ void SimpleTimelineWidget::slotGoToNext() } // no keyframe after current position - slotSetPosition(m_max); - emit positionChanged(m_max); + slotSetPosition(m_duration); + emit positionChanged(m_duration); } void SimpleTimelineWidget::slotGoToPrev() @@ -114,14 +112,14 @@ void SimpleTimelineWidget::slotGoToPrev() } // no keyframe before current position - slotSetPosition(m_min); - emit positionChanged(m_min); + slotSetPosition(0); + emit positionChanged(0); } void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event) { + int pos = (event->x() - 5) / m_scale; if (qAbs(event->y() - m_lineHeight) < m_lineHeight / 5. && event->button() == Qt::LeftButton) { - int pos = (event->x() - 5) / m_scale; foreach(const int &keyframe, m_keyframes) { if (qAbs(keyframe - pos) < 5) { m_currentKeyframeOriginal = keyframe; @@ -134,15 +132,15 @@ void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event) // no keyframe next to mouse m_currentKeyframe = m_currentKeyframeOriginal = -1; - m_position = (event->x() - 5) / m_scale; - emit positionChanged(m_position); + m_position = pos; + emit positionChanged(pos); update(); } void SimpleTimelineWidget::mouseMoveEvent(QMouseEvent* event) { if (event->buttons() & Qt::LeftButton) { - int pos = qBound(m_min, (int)((event->x() - 5) / m_scale), m_max); + int pos = qBound(0, (int)((event->x() - 5) / m_scale), m_duration); if (m_currentKeyframe >= 0) { m_currentKeyframe = pos; emit keyframeMoving(m_currentKeyframeOriginal, m_currentKeyframe); @@ -168,10 +166,10 @@ void SimpleTimelineWidget::wheelEvent(QWheelEvent* event) { int change = event->delta() < 0 ? -1 : 1; if (m_currentKeyframe > 0) { - m_currentKeyframe = qBound(m_min, m_currentKeyframe + change, m_max); + m_currentKeyframe = qBound(0, m_currentKeyframe + change, m_duration); emit keyframeMoved(m_currentKeyframeOriginal, m_currentKeyframe); } else { - m_position = qBound(m_min, m_position + change, m_max); + m_position = qBound(0, m_position + change, m_duration); emit positionChanged(m_position); } update(); @@ -182,7 +180,7 @@ void SimpleTimelineWidget::paintEvent(QPaintEvent* event) QPainter p(this); int min = 5; int max = width() - 6; - m_scale = (max - min) / (double)(m_max - m_min); + m_scale = (max - min) / (double)(m_duration); p.translate(min, m_lineHeight); p.setPen(QPen(palette().foreground().color(), 1, Qt::SolidLine)); diff --git a/src/simplekeyframes/simpletimelinewidget.h b/src/simplekeyframes/simpletimelinewidget.h index 864b0283..d13641e2 100644 --- a/src/simplekeyframes/simpletimelinewidget.h +++ b/src/simplekeyframes/simpletimelinewidget.h @@ -29,7 +29,7 @@ class SimpleTimelineWidget : public QWidget public: SimpleTimelineWidget(QWidget* parent = 0); void setKeyframes(QList keyframes); - void setRange(int min, int max); + void setDuration(int dur); public slots: void slotSetPosition(int pos); @@ -47,8 +47,7 @@ protected: void wheelEvent(QWheelEvent *event); private: - int m_min; - int m_max; + int m_duration; int m_position; int m_currentKeyframe; int m_currentKeyframeOriginal; -- 2.39.2