#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_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(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)
return;
QTableWidgetItem *keyframe, *keyframeOld;
- keyframe = keyframe_list->item(0, 0);
+ keyframe = keyframeOld = keyframe_list->item(0, 0);
for (int row = 0; row < keyframe_list->rowCount(); ++row) {
keyframeOld = keyframe;
keyframe = keyframe_list->item(row, 0);
m_item->setPolygon(QPolygonF() << points.at(0) << points.at(1) << points.at(2) << points.at(3));
m_scene->blockSignals(false);
- m_item->setEnabled(getPos(keyframe->row()) == m_pos || keyframe_list->rowCount() == 1);
+ bool enable = getPos(keyframe->row()) == m_pos || keyframe_list->rowCount() == 1;
+ m_item->setEnabled(enable);
+ m_scene->setEnabled(enable);
}
void CornersWidget::slotUpdateProperties()
}
}
+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"