X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcornerswidget.cpp;h=a560f030b9911ed99dc286989c43f6525e79f813;hb=f313ace5a34c48ecda307ff37ffb9a5db50f1c06;hp=f252b2c8ddf99df71546b14844192c22a19aaa1d;hpb=551a8d38219bd1ccd96636b87df49264fa330c8c;p=kdenlive diff --git a/src/cornerswidget.cpp b/src/cornerswidget.cpp index f252b2c8..a560f030 100644 --- a/src/cornerswidget.cpp +++ b/src/cornerswidget.cpp @@ -33,7 +33,8 @@ CornersWidget::CornersWidget(Monitor *monitor, QDomElement e, int minFrame, int maxFrame, Timecode tc, int activeKeyframe, QWidget* parent) : KeyframeEdit(e, minFrame, maxFrame, tc, activeKeyframe, parent), m_monitor(monitor), - m_showScene(true) + m_showScene(true), + m_pos(0) { m_scene = monitor->getEffectScene(); @@ -64,9 +65,6 @@ CornersWidget::CornersWidget(Monitor *monitor, QDomElement e, int minFrame, int connect(m_config, SIGNAL(showScene(bool)), this, SLOT(slotShowScene(bool))); connect(m_monitor, SIGNAL(renderPosition(int)), this, SLOT(slotCheckMonitorPosition(int))); connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateProperties())); - - connect(keyframe_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateItem())); - connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotUpdateItem())); } CornersWidget::~CornersWidget() @@ -78,23 +76,41 @@ CornersWidget::~CornersWidget() m_monitor->slotEffectScene(false); } +void CornersWidget::addParameter(QDomElement e, int activeKeyframe) +{ + KeyframeEdit::addParameter(e, activeKeyframe); + + if (!m_item->polygon().count()) + slotUpdateItem(); +} + void CornersWidget::slotUpdateItem() { - QList points; + if (keyframe_list->columnCount() < 8) + return; - QTableWidgetItem *item = keyframe_list->currentItem(); - if (!item || keyframe_list->columnCount() < 8) + QTableWidgetItem *keyframe, *keyframeOld; + keyframe = keyframe_list->item(0, 0); + for (int row = 0; row < keyframe_list->rowCount(); ++row) { + keyframeOld = keyframe; + keyframe = keyframe_list->item(row, 0); + if (getPos(row) >= m_pos) + break; + } + + QList points, pointsPrev, pointsNext; + pointsPrev = getPoints(keyframeOld); + pointsNext = getPoints(keyframe); + if (pointsPrev.count() != 4 || pointsNext.count() != 4) return; - double val; - for (int col = 0; col < 8; col++) { - if (!keyframe_list->item(item->row(), col)) - return; - val = (keyframe_list->item(item->row(), col)->text().toInt() - 2000) / 2000.; - if (col % 2 == 0) - points << QPointF(val * m_monitor->render->frameRenderWidth(), 0); - else - points[col / 2].setY(val * m_monitor->render->renderHeight()); + qreal position = (m_pos - getPos(keyframeOld->row())) / (qreal)( getPos(keyframe->row()) - getPos(keyframeOld->row()) + 1 ); + + if (keyframeOld == keyframe) { + points = pointsNext; + } else { + for (int i = 0; i < 4; ++i) + points.append(QLineF(pointsPrev.at(i), pointsNext.at(i)).pointAt(position)); } m_scene->blockSignals(true); @@ -124,9 +140,26 @@ void CornersWidget::slotUpdateProperties() } slotAdjustKeyframeInfo(false); +} + +QList CornersWidget::getPoints(QTableWidgetItem* keyframe) +{ + QList points; - if (changed) - emit parameterChanged(); + if (!keyframe) + return points; + + double val; + for (int col = 0; col < 8; col++) { + if (!keyframe_list->item(keyframe->row(), col)) + return QList(); + val = (keyframe_list->item(keyframe->row(), col)->text().toInt() - 2000) / 2000.; + if (col % 2 == 0) + points << QPointF(val * m_monitor->render->frameRenderWidth(), 0); + else + points[col / 2].setY(val * m_monitor->render->renderHeight()); + } + return points; } void CornersWidget::slotCheckMonitorPosition(int renderPos) @@ -156,4 +189,15 @@ void CornersWidget::slotShowControls(bool show) m_item->update(); } +void CornersWidget::slotSyncPosition(int relTimelinePos) +{ + if (keyframe_list->rowCount()) { + relTimelinePos = qBound(0, relTimelinePos, m_max); + if (relTimelinePos != m_pos) { + m_pos = relTimelinePos; + slotUpdateItem(); + } + } +} + #include "cornerswidget.moc"