X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcornerswidget.cpp;h=20546a7900ee994918473e6834d351af69574634;hb=b6d6c25f1bd07f11a0ceaf32a3a5bcaeab367336;hp=f252b2c8ddf99df71546b14844192c22a19aaa1d;hpb=551a8d38219bd1ccd96636b87df49264fa330c8c;p=kdenlive diff --git a/src/cornerswidget.cpp b/src/cornerswidget.cpp index f252b2c8..20546a79 100644 --- a/src/cornerswidget.cpp +++ b/src/cornerswidget.cpp @@ -20,86 +20,103 @@ #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 #include +#include #include -CornersWidget::CornersWidget(Monitor *monitor, QDomElement e, int minFrame, int maxFrame, Timecode tc, int activeKeyframe, QWidget* parent) : +inline int lerp( const int a, const int b, double t ) +{ + return a + (b - a) * t; +} + +CornersWidget::CornersWidget(Monitor *monitor, const QDomElement& e, int minFrame, int maxFrame, const 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(); + m_scene = edit->getScene(); + m_scene->cleanup(); - m_item = new OnMonitorCornersItem(m_scene); + m_item = new OnMonitorCornersItem(); m_scene->addItem(m_item); - m_config = new MonitorSceneControlWidget(m_scene, this); - QGridLayout *l = static_cast(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); - buttonShowControls->setIcon(KIcon("transform-move")); - buttonShowControls->setToolTip(i18n("Show additional controls")); - buttonShowControls->setCheckable(true); - buttonShowControls->setChecked(KdenliveSettings::onmonitoreffects_cornersshowcontrols()); - connect(buttonShowControls, SIGNAL(toggled(bool)), this, SLOT(slotShowControls(bool))); - m_config->addWidget(buttonShowControls, 0, 3); - - 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())); + edit->removeCustomControls(); + edit->addCustomButton(KIcon("transform-move"), i18n("Show additional controls"), this, SLOT(slotShowControls(bool)), + true, KdenliveSettings::onmonitoreffects_cornersshowcontrols()); + edit->addCustomButton(KIcon("insert-horizontal-rule"), i18n("Show/Hide the lines connecting the corners"), this, SLOT(slotShowLines(bool)), + true, KdenliveSettings::onmonitoreffects_cornersshowlines()); + + connect(m_item, SIGNAL(changed()), this, SLOT(slotUpdateProperties())); + connect(m_scene, SIGNAL(addKeyframe()), this, SLOT(slotInsertKeyframe())); + + connect(keyframe_list, SIGNAL(cellChanged(int,int)), this, SLOT(slotUpdateItem())); + m_scene->centerView(); } CornersWidget::~CornersWidget() { - delete m_config; m_scene->removeItem(m_item); delete m_item; - if (m_monitor) - m_monitor->slotEffectScene(false); + if (m_monitor) { + MonitorEditWidget *edit = m_monitor->getEffectEdit(); + edit->removeCustomControls(); + } +} + +void CornersWidget::addParameter(const 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 = 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 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); 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() @@ -124,26 +141,29 @@ void CornersWidget::slotUpdateProperties() } slotAdjustKeyframeInfo(false); - - if (changed) - emit parameterChanged(); } -void CornersWidget::slotCheckMonitorPosition(int renderPos) +QList CornersWidget::getPoints(QTableWidgetItem* keyframe) { - if (m_showScene) - emit checkMonitorPosition(renderPos); -} + QList points; -void CornersWidget::slotShowScene(bool show) -{ - m_showScene = show; - if (!m_showScene) - m_monitor->slotEffectScene(false); - else - slotCheckMonitorPosition(m_monitor->render->seekFramePosition()); + 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::slotShowLines(bool show) { KdenliveSettings::setOnmonitoreffects_cornersshowlines(show); @@ -156,4 +176,75 @@ 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_min) { + m_pos = relTimelinePos + m_min; + 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"