X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fgeometrywidget.cpp;h=65d042595b9cfa7962feaaafad181cb692944293;hb=f43e6d014193d7a7cf44461a128d3f0876a9fa03;hp=4fb694849de529f1572b21136e1e10d658808433;hpb=9f60e7e5262a47694d8fcb238f9d11a3ba90d3a6;p=kdenlive diff --git a/src/geometrywidget.cpp b/src/geometrywidget.cpp index 4fb69484..65d04259 100644 --- a/src/geometrywidget.cpp +++ b/src/geometrywidget.cpp @@ -24,31 +24,40 @@ #include "keyframehelper.h" #include "timecodedisplay.h" #include "monitorscene.h" -#include "monitorscenecontrolwidget.h" +#include "monitoreditwidget.h" #include "onmonitoritems/onmonitorrectitem.h" #include "kdenlivesettings.h" +#include "dragvalue.h" #include #include #include #include - - - -GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, bool isEffect, QWidget* parent): - QWidget(parent), - m_monitor(monitor), - m_timePos(new TimecodeDisplay(timecode)), - m_clipPos(clipPos), - m_inPoint(0), - m_outPoint(1), - m_isEffect(isEffect), - m_rect(NULL), - m_geometry(NULL), - m_showScene(true) +#include + + + +GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, bool isEffect, bool showRotation, QWidget* parent): + QWidget(parent), + m_monitor(monitor), + m_timePos(new TimecodeDisplay(timecode)), + m_clipPos(clipPos), + m_inPoint(0), + m_outPoint(1), + m_isEffect(isEffect), + m_rect(NULL), + m_previous(NULL), + m_geometry(NULL), + m_showScene(true), + m_showRotation(showRotation) { m_ui.setupUi(this); - m_scene = monitor->getEffectScene(); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); + MonitorEditWidget *edit = monitor->getEffectEdit(); + edit->removeCustomControls(); + edit->addCustomButton(KIcon("transform-crop"), i18n("Show previous keyframe"), this, SLOT(slotShowPreviousKeyFrame(bool)), true, KdenliveSettings::onmonitoreffects_geometryshowprevious()); + edit->showVisibilityButton(true); + m_scene = edit->getScene(); /* @@ -83,56 +92,134 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, connect(m_ui.buttonAddDelete, SIGNAL(clicked()), this, SLOT(slotAddDeleteKeyframe())); connect(m_ui.buttonSync, SIGNAL(toggled(bool)), this, SLOT(slotSetSynchronize(bool))); - + m_spinX = new DragValue(i18nc("x axis position", "X"), 0, 0, -99000, 99000, -1, QString(), false, this); + m_ui.horizontalLayout->addWidget(m_spinX); + + m_spinY = new DragValue(i18nc("y axis position", "Y"), 0, 0, -99000, 99000, -1, QString(), false, this); + m_ui.horizontalLayout->addWidget(m_spinY); + + m_spinWidth = new DragValue(i18nc("Frame width", "W"), m_monitor->render->frameRenderWidth(), 0, 1, 99000, -1, QString(), false, this); + m_ui.horizontalLayout->addWidget(m_spinWidth); + + m_spinHeight = new DragValue(i18nc("Frame height", "H"), m_monitor->render->renderHeight(), 0, 1, 99000, -1, QString(), false, this); + m_ui.horizontalLayout->addWidget(m_spinHeight); + + QMenu *menu = new QMenu(this); + QAction *adjustSize = new QAction(i18n("Adjust to original size"), this); + connect(adjustSize, SIGNAL(triggered()), this, SLOT(slotAdjustToFrameSize())); + menu->addAction(adjustSize); + QAction *fitToWidth = new QAction(i18n("Fit to width"), this); + connect(fitToWidth, SIGNAL(triggered()), this, SLOT(slotFitToWidth())); + menu->addAction(fitToWidth); + QAction *fitToHeight = new QAction(i18n("Fit to height"), this); + connect(fitToHeight, SIGNAL(triggered()), this, SLOT(slotFitToHeight())); + menu->addAction(fitToHeight); + menu->addSeparator(); + + QAction *alignleft = new QAction(KIcon("kdenlive-align-left"), i18n("Align left"), this); + connect(alignleft, SIGNAL(triggered()), this, SLOT(slotMoveLeft())); + menu->addAction(alignleft); + QAction *alignhcenter = new QAction(KIcon("kdenlive-align-hor"), i18n("Center horizontally"), this); + connect(alignhcenter, SIGNAL(triggered()), this, SLOT(slotCenterH())); + menu->addAction(alignhcenter); + QAction *alignright = new QAction(KIcon("kdenlive-align-right"), i18n("Align right"), this); + connect(alignright, SIGNAL(triggered()), this, SLOT(slotMoveRight())); + menu->addAction(alignright); + QAction *aligntop = new QAction(KIcon("kdenlive-align-top"), i18n("Align top"), this); + connect(aligntop, SIGNAL(triggered()), this, SLOT(slotMoveTop())); + menu->addAction(aligntop); + QAction *alignvcenter = new QAction(KIcon("kdenlive-align-vert"), i18n("Center vertically"), this); + connect(alignvcenter, SIGNAL(triggered()), this, SLOT(slotCenterV())); + menu->addAction(alignvcenter); + QAction *alignbottom = new QAction(KIcon("kdenlive-align-bottom"), i18n("Align bottom"), this); + connect(alignbottom, SIGNAL(triggered()), this, SLOT(slotMoveBottom())); + menu->addAction(alignbottom); + m_ui.buttonOptions->setMenu(menu); + + QHBoxLayout *alignLayout = new QHBoxLayout; + alignLayout->setSpacing(0); + QToolButton *alignButton = new QToolButton; + alignButton->setDefaultAction(alignleft); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + alignButton = new QToolButton; + alignButton->setDefaultAction(alignhcenter); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + alignButton = new QToolButton; + alignButton->setDefaultAction(alignright); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + alignButton = new QToolButton; + alignButton->setDefaultAction(aligntop); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + alignButton = new QToolButton; + alignButton->setDefaultAction(alignvcenter); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + alignButton = new QToolButton; + alignButton->setDefaultAction(alignbottom); + alignButton->setAutoRaise(true); + alignLayout->addWidget(alignButton); + + m_ui.horizontalLayout->addLayout(alignLayout); + m_ui.horizontalLayout->addStretch(10); + + m_spinSize = new DragValue(i18n("Size"), 100, 2, 1, 99000, -1, i18n("%"), false, this); + m_ui.horizontalLayout2->addWidget(m_spinSize); + + m_opacity = new DragValue(i18n("Opacity"), 100, 0, 0, 100, -1, i18n("%"), true, this); + m_ui.horizontalLayout2->addWidget(m_opacity); + + + if (showRotation) { + m_rotateX = new DragValue(i18n("Rotate X"), 0, 0, -1800, 1800, -1, QString(), true, this); + m_rotateX->setObjectName("rotate_x"); + m_ui.horizontalLayout3->addWidget(m_rotateX); + m_rotateY = new DragValue(i18n("Rotate Y"), 0, 0, -1800, 1800, -1, QString(), true, this); + m_rotateY->setObjectName("rotate_y"); + m_ui.horizontalLayout3->addWidget(m_rotateY); + m_rotateZ = new DragValue(i18n("Rotate Z"), 0, 0, -1800, 1800, -1, QString(), true, this); + m_rotateZ->setObjectName("rotate_z"); + m_ui.horizontalLayout3->addWidget(m_rotateZ); + connect(m_rotateX, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateGeometry())); + connect(m_rotateY, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateGeometry())); + connect(m_rotateZ, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateGeometry())); + } + /* Setup of geometry controls */ - m_ui.buttonMoveLeft->setIcon(KIcon("kdenlive-align-left")); - m_ui.buttonMoveLeft->setToolTip(i18n("Move to left")); - m_ui.buttonCenterH->setIcon(KIcon("kdenlive-align-hor")); - m_ui.buttonCenterH->setToolTip(i18n("Center horizontally")); - m_ui.buttonMoveRight->setIcon(KIcon("kdenlive-align-right")); - m_ui.buttonMoveRight->setToolTip(i18n("Move to right")); - m_ui.buttonMoveTop->setIcon(KIcon("kdenlive-align-top")); - m_ui.buttonMoveTop->setToolTip(i18n("Move to top")); - m_ui.buttonCenterV->setIcon(KIcon("kdenlive-align-vert")); - m_ui.buttonCenterV->setToolTip(i18n("Center vertically")); - m_ui.buttonMoveBottom->setIcon(KIcon("kdenlive-align-bottom")); - m_ui.buttonMoveBottom->setToolTip(i18n("Move to bottom")); - - connect(m_ui.spinX, SIGNAL(valueChanged(int)), this, SLOT(slotSetX(int))); - connect(m_ui.spinY, SIGNAL(valueChanged(int)), this, SLOT(slotSetY(int))); - connect(m_ui.spinWidth, SIGNAL(valueChanged(int)), this, SLOT(slotSetWidth(int))); - connect(m_ui.spinHeight, SIGNAL(valueChanged(int)), this, SLOT(slotSetHeight(int))); - - connect(m_ui.spinSize, SIGNAL(valueChanged(int)), this, SLOT(slotResize(int))); - - connect(m_ui.spinOpacity, SIGNAL(valueChanged(int)), this, SLOT(slotSetOpacity(int))); - connect(m_ui.sliderOpacity, SIGNAL(valueChanged(int)), m_ui.spinOpacity, SLOT(setValue(int))); - - connect(m_ui.buttonMoveLeft, SIGNAL(clicked()), this, SLOT(slotMoveLeft())); + connect(m_spinX, SIGNAL(valueChanged(double)), this, SLOT(slotSetX(double))); + connect(m_spinY, SIGNAL(valueChanged(double)), this, SLOT(slotSetY(double))); + connect(m_spinWidth, SIGNAL(valueChanged(double)), this, SLOT(slotSetWidth(double))); + connect(m_spinHeight, SIGNAL(valueChanged(double)), this, SLOT(slotSetHeight(double))); + + connect(m_spinSize, SIGNAL(valueChanged(double)), this, SLOT(slotResize(double))); + + connect(m_opacity, SIGNAL(valueChanged(double)), this, SLOT(slotSetOpacity(double))); + + /*connect(m_ui.buttonMoveLeft, SIGNAL(clicked()), this, SLOT(slotMoveLeft())); connect(m_ui.buttonCenterH, SIGNAL(clicked()), this, SLOT(slotCenterH())); connect(m_ui.buttonMoveRight, SIGNAL(clicked()), this, SLOT(slotMoveRight())); connect(m_ui.buttonMoveTop, SIGNAL(clicked()), this, SLOT(slotMoveTop())); connect(m_ui.buttonCenterV, SIGNAL(clicked()), this, SLOT(slotCenterV())); - connect(m_ui.buttonMoveBottom, SIGNAL(clicked()), this, SLOT(slotMoveBottom())); + connect(m_ui.buttonMoveBottom, SIGNAL(clicked()), this, SLOT(slotMoveBottom()));*/ /* Setup of configuration controls */ - m_config = new MonitorSceneControlWidget(m_scene, m_ui.frameSettings); - QHBoxLayout *settingsLayout = new QHBoxLayout(m_ui.frameSettings); - settingsLayout->addWidget(m_config); - settingsLayout->setContentsMargins(0, 0, 0, 0); - ((QGridLayout *)m_ui.widgetFirstColumn->layout())->addWidget(m_config->getShowHideButton(), 1, 2); - connect(m_config, SIGNAL(showScene(bool)), this, SLOT(slotShowScene(bool))); - + connect(edit, SIGNAL(showEdit(bool)), this, SLOT(slotShowScene(bool))); - - connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateGeometry())); connect(m_scene, SIGNAL(addKeyframe()), this, SLOT(slotAddKeyframe())); connect(m_monitor, SIGNAL(renderPosition(int)), this, SLOT(slotCheckMonitorPosition(int))); connect(this, SIGNAL(parameterChanged()), this, SLOT(slotUpdateProperties())); @@ -143,11 +230,31 @@ GeometryWidget::~GeometryWidget() m_scene->setEnabled(true); delete m_timePos; delete m_timeline; + delete m_spinX; + delete m_spinY; + delete m_spinWidth; + delete m_spinHeight; + delete m_opacity; m_scene->removeItem(m_rect); + if (m_rect) delete m_rect; + if (m_previous) delete m_previous; delete m_geometry; - delete m_config; - if (m_monitor) + m_extraGeometryNames.clear(); + m_extraFactors.clear(); + while (!m_extraGeometries.isEmpty()) { + Mlt::Geometry *g = m_extraGeometries.takeFirst(); + delete g; + } + if (m_monitor) { + m_monitor->getEffectEdit()->showVisibilityButton(false); m_monitor->slotEffectScene(false); + } +} + +void GeometryWidget::slotShowPreviousKeyFrame(bool show) +{ + KdenliveSettings::setOnmonitoreffects_geometryshowprevious(show); + slotPositionChanged(-1, false); } void GeometryWidget::updateTimecodeFormat() @@ -160,6 +267,21 @@ QString GeometryWidget::getValue() const return m_geometry->serialise(); } +QString GeometryWidget::getExtraValue(const QString &name) const +{ + int ix = m_extraGeometryNames.indexOf(name); + QString val = m_extraGeometries.at(ix)->serialise(); + if (!val.contains("=")) val = val.section(',', 0, 0); + else { + QStringList list = val.split(';'); + val.clear(); + foreach (const QString value, list) { + val.append(value.section(',', 0, 0) + ';'); + } + } + return val; +} + void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxframe) { m_inPoint = minframe; @@ -175,34 +297,46 @@ void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxfra m_ui.widgetTimeWrapper->setHidden(true); } else { m_ui.widgetTimeWrapper->setHidden(false); - m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint - 1); + m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint); m_timeline->update(); - m_timePos->setRange(0, m_outPoint - m_inPoint - 1); + m_timePos->setRange(0, m_outPoint - m_inPoint); } // no opacity - if (elem.attribute("opacity") == "false") - m_ui.widgetOpacity->setHidden(true); + if (elem.attribute("opacity") == "false") { + m_opacity->setHidden(true); + m_ui.horizontalLayout2->addStretch(2); + } Mlt::GeometryItem item; m_geometry->fetch(&item, 0); delete m_rect; - m_rect = new OnMonitorRectItem(QRectF(0, 0, item.w(), item.h()), m_scene); + m_rect = new OnMonitorRectItem(QRectF(0, 0, item.w(), item.h()), m_monitor->render->dar()); m_rect->setPos(item.x(), item.y()); m_rect->setZValue(0); m_scene->addItem(m_rect); + connect(m_rect, SIGNAL(changed()), this, SLOT(slotUpdateGeometry())); slotPositionChanged(0, false); slotCheckMonitorPosition(m_monitor->render->seekFramePosition()); } +void GeometryWidget::addParameter(const QDomElement elem) +{ + Mlt::Geometry *geometry = new Mlt::Geometry(elem.attribute("value").toUtf8().data(), m_outPoint - m_inPoint, m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight()); + m_extraGeometries.append(geometry); + m_timeline->addGeometry(geometry); + m_extraFactors.append(elem.attribute("factor", "1")); + m_extraGeometryNames.append(elem.attribute("name")); + //kDebug()<<"ADDED PARAM: "<maximum() > 0 && KdenliveSettings::transitionfollowcursor()) { - relTimelinePos = qMax(0, relTimelinePos); - relTimelinePos = qMin(relTimelinePos, m_timePos->maximum()); + relTimelinePos = qBound(0, relTimelinePos, m_timePos->maximum()); if (relTimelinePos != m_timePos->getValue()) slotPositionChanged(relTimelinePos, false); } @@ -221,6 +355,7 @@ void GeometryWidget::slotPositionChanged(int pos, bool seek) m_timeline->blockSignals(false); Mlt::GeometryItem item; + Mlt::GeometryItem previousItem; if (m_geometry->fetch(&item, pos) || item.key() == false) { // no keyframe m_rect->setEnabled(false); @@ -236,16 +371,51 @@ void GeometryWidget::slotPositionChanged(int pos, bool seek) m_ui.buttonAddDelete->setIcon(KIcon("edit-delete")); m_ui.buttonAddDelete->setToolTip(i18n("Delete keyframe")); } + + if (KdenliveSettings::onmonitoreffects_geometryshowprevious() == false || m_geometry->prev_key(&previousItem, pos - 1) || previousItem.frame() == item.frame()) { + if (m_previous) { + m_scene->removeItem(m_previous); + } + } + else if (m_previous && m_previous->scene() && m_previous->data(Qt::UserRole).toInt() == previousItem.frame()) { + // previous frame already here, do nothing + } + else { + if (m_previous == NULL) { + m_previous = new QGraphicsRectItem(0, 0, previousItem.w(), previousItem.h()); + m_previous->setBrush(QColor(200, 200, 0, 20)); + m_previous->setPen(QPen(Qt::white, 0, Qt::DotLine)); + m_previous->setPos(previousItem.x(), previousItem.y()); + m_previous->setZValue(-1); + m_previous->setEnabled(false); + } + else { + m_previous->setPos(previousItem.x(), previousItem.y()); + m_previous->setRect(0, 0, previousItem.w(), previousItem.h()); + } + m_previous->setData(Qt::UserRole, previousItem.frame()); + if (m_previous->scene() == 0) m_scene->addItem(m_previous); + } m_rect->setPos(item.x(), item.y()); m_rect->setRect(0, 0, item.w(), item.h()); - m_ui.spinOpacity->blockSignals(true); - m_ui.sliderOpacity->blockSignals(true); - m_ui.spinOpacity->setValue(item.mix()); - m_ui.sliderOpacity->setValue(item.mix()); - m_ui.spinOpacity->blockSignals(false); - m_ui.sliderOpacity->blockSignals(false); + m_opacity->blockSignals(true); + m_opacity->setValue(item.mix()); + m_opacity->blockSignals(false); + + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + QString name = m_extraGeometryNames.at(i); + if (!geom->fetch(&item, pos)) { + DragValue *widget = findChild(name); + if (widget) { + widget->blockSignals(true); + widget->setValue(item.x() * m_extraFactors.at(i).toInt()); + widget->blockSignals(false); + } + } + } slotUpdateProperties(); @@ -272,9 +442,21 @@ void GeometryWidget::slotAddKeyframe(int pos) item.y(rectpos.y()); item.w(r.width()); item.h(r.height()); - item.mix(m_ui.spinOpacity->value()); + item.mix(m_opacity->value()); m_geometry->insert(item); + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + QString name = m_extraGeometryNames.at(i); + DragValue *widget = findChild(name); + if (widget) { + Mlt::GeometryItem item2; + item2.frame(pos); + item2.x((double) widget->value() / m_extraFactors.at(i).toInt()); + geom->insert(item2); + } + } + m_timeline->update(); slotPositionChanged(pos, false); emit parameterChanged(); @@ -292,6 +474,11 @@ void GeometryWidget::slotDeleteKeyframe(int pos) } m_geometry->remove(pos); + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + geom->remove(pos); + } + m_timeline->update(); slotPositionChanged(pos, false); emit parameterChanged(); @@ -367,6 +554,18 @@ void GeometryWidget::slotUpdateGeometry() item.w(rectSize.width()); item.h(rectSize.height()); m_geometry->insert(item); + + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + QString name = m_extraGeometryNames.at(i); + Mlt::GeometryItem item2; + DragValue *widget = findChild(name); + if (widget && !geom->next_key(&item2, pos) && item2.frame() == pos) { + item2.x((double) widget->value() / m_extraFactors.at(i).toInt()); + geom->insert(item2); + } + } + emit parameterChanged(); } @@ -374,58 +573,64 @@ void GeometryWidget::slotUpdateProperties() { QRectF rectSize = m_rect->rect().normalized(); QPointF rectPos = m_rect->pos(); - int size; - if (rectSize.width() / m_monitor->render->dar() < rectSize.height()) - size = (int)((rectSize.width() * 100.0 / m_monitor->render->frameRenderWidth()) + 0.5); + double size; + if (rectSize.width() / m_monitor->render->dar() > rectSize.height()) + size = rectSize.width() * 100.0 / m_monitor->render->frameRenderWidth(); else - size = (int)((rectSize.height() * 100.0 / m_monitor->render->renderHeight()) + 0.5); - - m_ui.spinX->blockSignals(true); - m_ui.spinY->blockSignals(true); - m_ui.spinWidth->blockSignals(true); - m_ui.spinHeight->blockSignals(true); - m_ui.spinSize->blockSignals(true); + size = rectSize.height() * 100.0 / m_monitor->render->renderHeight(); + + m_spinX->blockSignals(true); + m_spinY->blockSignals(true); + m_spinWidth->blockSignals(true); + m_spinHeight->blockSignals(true); + m_spinSize->blockSignals(true); + + m_spinX->setValue(rectPos.x()); + m_spinY->setValue(rectPos.y()); + m_spinWidth->setValue(rectSize.width()); + m_spinHeight->setValue(rectSize.height()); + m_spinSize->setValue(size); + + m_spinX->blockSignals(false); + m_spinY->blockSignals(false); + m_spinWidth->blockSignals(false); + m_spinHeight->blockSignals(false); + m_spinSize->blockSignals(false); +} - m_ui.spinX->setValue(rectPos.x()); - m_ui.spinY->setValue(rectPos.y()); - m_ui.spinWidth->setValue(rectSize.width()); - m_ui.spinHeight->setValue(rectSize.height()); - m_ui.spinSize->setValue(size); - m_ui.spinX->blockSignals(false); - m_ui.spinY->blockSignals(false); - m_ui.spinWidth->blockSignals(false); - m_ui.spinHeight->blockSignals(false); - m_ui.spinSize->blockSignals(false); +void GeometryWidget::slotSetX(double value) +{ + m_rect->setPos(value, m_spinY->value()); + slotUpdateGeometry(); } - -void GeometryWidget::slotSetX(int value) +void GeometryWidget::slotSetY(double value) { - m_rect->setPos(value, m_ui.spinY->value()); + m_rect->setPos(m_spinX->value(), value); slotUpdateGeometry(); } -void GeometryWidget::slotSetY(int value) +void GeometryWidget::slotSetWidth(double value) { - m_rect->setPos(m_ui.spinX->value(), value); + m_rect->setRect(0, 0, value, m_spinHeight->value()); slotUpdateGeometry(); } -void GeometryWidget::slotSetWidth(int value) +void GeometryWidget::slotSetHeight(double value) { - m_rect->setRect(0, 0, value, m_ui.spinHeight->value()); + m_rect->setRect(0, 0, m_spinWidth->value(), value); slotUpdateGeometry(); } -void GeometryWidget::slotSetHeight(int value) +void GeometryWidget::updateMonitorGeometry() { - m_rect->setRect(0, 0, m_ui.spinWidth->value(), value); + m_rect->setRect(0, 0, m_spinWidth->value(), m_spinHeight->value()); slotUpdateGeometry(); } -void GeometryWidget::slotResize(int value) +void GeometryWidget::slotResize(double value) { m_rect->setRect(0, 0, (int)((m_monitor->render->frameRenderWidth() * value / 100.0) + 0.5), @@ -434,19 +639,14 @@ void GeometryWidget::slotResize(int value) } -void GeometryWidget::slotSetOpacity(int value) +void GeometryWidget::slotSetOpacity(double value) { - m_ui.sliderOpacity->blockSignals(true); - m_ui.sliderOpacity->setValue(value); - m_ui.sliderOpacity->blockSignals(false); - int pos = m_timePos->getValue(); Mlt::GeometryItem item; if (m_geometry->fetch(&item, pos) || item.key() == false) return; item.mix(value); m_geometry->insert(item); - emit parameterChanged(); } @@ -504,4 +704,53 @@ void GeometryWidget::slotShowScene(bool show) slotCheckMonitorPosition(m_monitor->render->seekFramePosition()); } +void GeometryWidget::setFrameSize(QPoint size) +{ + m_frameSize = size; +} + +void GeometryWidget::slotAdjustToFrameSize() +{ + if (m_frameSize == QPoint() || m_frameSize.x() == 0 || m_frameSize.y() == 0) { + m_frameSize = QPoint(m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight()); + } + m_spinWidth->blockSignals(true); + m_spinHeight->blockSignals(true); + m_spinWidth->setValue((int) (m_frameSize.x() / m_monitor->render->sar() + 0.5)); + m_spinHeight->setValue(m_frameSize.y()); + m_spinWidth->blockSignals(false); + m_spinHeight->blockSignals(false); + updateMonitorGeometry(); +} + +void GeometryWidget::slotFitToWidth() +{ + if (m_frameSize == QPoint() || m_frameSize.x() == 0 || m_frameSize.y() == 0) { + m_frameSize = QPoint(m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight()); + } + double factor = (double) m_monitor->render->frameRenderWidth() / m_frameSize.x() * m_monitor->render->sar(); + m_spinWidth->blockSignals(true); + m_spinHeight->blockSignals(true); + m_spinHeight->setValue((int) (m_frameSize.y() * factor + 0.5)); + m_spinWidth->setValue(m_monitor->render->frameRenderWidth()); + m_spinWidth->blockSignals(false); + m_spinHeight->blockSignals(false); + updateMonitorGeometry(); +} + +void GeometryWidget::slotFitToHeight() +{ + if (m_frameSize == QPoint() || m_frameSize.x() == 0 || m_frameSize.y() == 0) { + m_frameSize = QPoint(m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight()); + } + double factor = (double) m_monitor->render->renderHeight() / m_frameSize.y(); + m_spinWidth->blockSignals(true); + m_spinHeight->blockSignals(true); + m_spinHeight->setValue(m_monitor->render->renderHeight()); + m_spinWidth->setValue((int) (m_frameSize.x() / m_monitor->render->sar() * factor + 0.5)); + m_spinWidth->blockSignals(false); + m_spinHeight->blockSignals(false); + updateMonitorGeometry(); +} + #include "geometrywidget.moc"