#include "cornerswidget.h"
#include "monitor.h"
#include "monitorscene.h"
-#include "monitorscenecontrolwidget.h"
+#include "monitoreditwidget.h"
#include "onmonitoritems/onmonitorcornersitem.h"
#include "renderer.h"
#include "kdenlivesettings.h"
#include <QGraphicsView>
#include <QGridLayout>
+#include <QToolButton>
#include <KIcon>
+inline int lerp( const int a, const int b, double t )
+{
+ return a + (b - a) * t;
+}
+
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();
+ MonitorEditWidget *edit = monitor->getEffectEdit();
+ edit->showVisibilityButton(true);
+ m_scene = edit->getScene();
m_item = new OnMonitorCornersItem(m_scene);
m_scene->addItem(m_item);
- m_config = new MonitorSceneControlWidget(m_scene, this);
- QGridLayout *l = static_cast<QGridLayout *>(layout());
- l->addWidget(m_config->getShowHideButton(), 1, 1);
- l->addWidget(m_config, 1, 2);
-
- QToolButton *buttonShowLines = new QToolButton(m_config);
// TODO: Better Icons
- buttonShowLines->setIcon(KIcon("insert-horizontal-rule"));
- buttonShowLines->setToolTip(i18n("Show/Hide the lines connecting the corners"));
- buttonShowLines->setCheckable(true);
- buttonShowLines->setChecked(KdenliveSettings::onmonitoreffects_cornersshowlines());
- connect(buttonShowLines, SIGNAL(toggled(bool)), this, SLOT(slotShowLines(bool)));
- m_config->addWidget(buttonShowLines, 0, 2);
- QToolButton *buttonShowControls = new QToolButton(m_config);
+ QToolButton *buttonShowControls = new QToolButton();
buttonShowControls->setIcon(KIcon("transform-move"));
buttonShowControls->setToolTip(i18n("Show additional controls"));
buttonShowControls->setCheckable(true);
+ buttonShowControls->setAutoRaise(true);
buttonShowControls->setChecked(KdenliveSettings::onmonitoreffects_cornersshowcontrols());
connect(buttonShowControls, SIGNAL(toggled(bool)), this, SLOT(slotShowControls(bool)));
- m_config->addWidget(buttonShowControls, 0, 3);
+ edit->addCustomControl(buttonShowControls);
+
+ QToolButton *buttonShowLines = new QToolButton();
+ buttonShowLines->setIcon(KIcon("insert-horizontal-rule"));
+ buttonShowLines->setToolTip(i18n("Show/Hide the lines connecting the corners"));
+ buttonShowLines->setCheckable(true);
+ buttonShowControls->setAutoRaise(true);
+ buttonShowLines->setChecked(KdenliveSettings::onmonitoreffects_cornersshowlines());
+ connect(buttonShowLines, SIGNAL(toggled(bool)), this, SLOT(slotShowLines(bool)));
+ edit->addCustomControl(buttonShowLines);
- connect(m_config, SIGNAL(showScene(bool)), this, SLOT(slotShowScene(bool)));
+ connect(edit, SIGNAL(showEdit(bool)), this, SLOT(slotShowScene(bool)));
connect(m_monitor, SIGNAL(renderPosition(int)), this, SLOT(slotCheckMonitorPosition(int)));
connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateProperties()));
+ connect(m_scene, SIGNAL(addKeyframe()), this, SLOT(slotInsertKeyframe()));
- connect(keyframe_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateItem()));
connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotUpdateItem()));
}
CornersWidget::~CornersWidget()
{
- delete m_config;
m_scene->removeItem(m_item);
delete m_item;
- if (m_monitor)
+ if (m_monitor) {
+ MonitorEditWidget *edit = m_monitor->getEffectEdit();
+ edit->showVisibilityButton(false);
+ edit->removeCustomControls();
m_monitor->slotEffectScene(false);
+ }
}
void CornersWidget::addParameter(QDomElement e, int activeKeyframe)
if (keyframe_list->columnCount() < 8)
return;
- QTableWidgetItem *item = keyframe_list->currentItem();
- if (!item)
+ QTableWidgetItem *keyframe, *keyframeOld;
+ keyframe = keyframeOld = 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);
m_item->setPolygon(QPolygonF() << points.at(0) << points.at(1) << points.at(2) << points.at(3));
m_scene->blockSignals(false);
+
+ bool enable = getPos(keyframe->row()) == m_pos || keyframe_list->rowCount() == 1;
+ m_item->setEnabled(enable);
+ m_scene->setEnabled(enable);
}
void CornersWidget::slotUpdateProperties()
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();
+ }
+ }
+}
+
+void CornersWidget::slotInsertKeyframe()
+{
+ keyframe_list->blockSignals(true);
+
+ int row;
+ QTableWidgetItem *keyframe, *keyframeOld;
+ keyframe = keyframeOld = keyframe_list->item(0, 0);
+ for (row = 0; row < keyframe_list->rowCount(); ++row) {
+ keyframeOld = keyframe;
+ keyframe = keyframe_list->item(row, 0);
+ if (getPos(row) >= m_pos)
+ break;
+ }
+
+
+ int pos2;
+ if (row == keyframe_list->rowCount()) {
+ pos2 = m_max;
+ } else {
+ pos2 = getPos(row);
+ if (pos2 == m_pos)
+ return;
+ }
+
+ int pos1 = 0;
+ if (row > 0)
+ pos1 = getPos(row - 1);
+
+ int col = keyframe_list->currentColumn();
+ double pos = (m_pos - pos1) / (double)(pos2 - pos1 + 1);
+
+ keyframe_list->insertRow(row);
+ keyframe_list->setVerticalHeaderItem(row, new QTableWidgetItem(getPosString(m_pos)));
+
+ QPolygonF pol = m_item->polygon();
+ double val;
+ for (int i = 0; i < keyframe_list->columnCount(); i++) {
+ if (i < 8) {
+ if (i % 2 == 0)
+ val = pol.at(i / 2).x() / (double)m_monitor->render->frameRenderWidth();
+ else
+ val = pol.at(i / 2).y() / (double)m_monitor->render->renderHeight();
+ val *= 2000;
+ val += 2000;
+ keyframe_list->setItem(row, i, new QTableWidgetItem(QString::number((int)val)));
+ } else {
+ keyframe_list->setItem(row, i, new QTableWidgetItem(QString::number(lerp(keyframe_list->item(keyframeOld->row(), i)->text().toInt(), keyframe_list->item(keyframe->row(), i)->text().toInt(), pos))));
+ }
+ }
+
+ keyframe_list->resizeRowsToContents();
+ slotAdjustKeyframeInfo();
+ keyframe_list->blockSignals(false);
+ generateAllParams();
+ button_delete->setEnabled(true);
+ keyframe_list->setCurrentCell(row, col);
+ keyframe_list->selectRow(row);
+}
+
#include "cornerswidget.moc"