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();
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()
if (keyframe_list->columnCount() < 8)
return;
- QTableWidgetItem *item = keyframe_list->currentItem();
- if (!item)
+ 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<QPointF> points, pointsPrev, pointsNext;
+ pointsPrev = getPoints(keyframeOld);
+ pointsNext = getPoints(keyframe);
+ if (pointsPrev.count() != 4 || pointsNext.count() != 4)
return;
- QList<QPointF> points;
- 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);
slotAdjustKeyframeInfo(false);
}
+QList<QPointF> CornersWidget::getPoints(QTableWidgetItem* keyframe)
+{
+ QList<QPointF> points;
+
+ if (!keyframe)
+ return points;
+
+ double val;
+ for (int col = 0; col < 8; col++) {
+ if (!keyframe_list->item(keyframe->row(), col))
+ return QList<QPointF>();
+ 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)
{
if (m_showScene)
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"
public slots:
/** @brief Switches from normal monitor to monitor scene according to @param show. */
void slotShowScene(bool show = true);
+ /** @brief Updates the on-monitor item. */
+ void slotSyncPosition(int relTimelinePos);
private:
Monitor *m_monitor;
OnMonitorCornersItem *m_item;
bool m_showScene;
MonitorSceneControlWidget *m_config;
+ int m_pos;
+
+ /** @brief Returns the corner positions set in the row of @param keyframe. */
+ QList <QPointF> getPoints(QTableWidgetItem *keyframe);
private slots:
/** @brief Makes sure the monitor effect scene is only visible if the clip this geometry belongs to is visible.
* @param renderPos Postion of the Monitor / Timeline cursor */
void slotCheckMonitorPosition(int renderPos);
- /** @brief Updates the on-monitor item according current values in the keyframe editor. */
+ /** @brief Updates the on-monitor item according to the current timeline position. */
void slotUpdateItem();
/** @brief Updates the keyframe editor according to the on-monitor item. */
void slotUpdateProperties();