diff --git a/src/assets/view/widgets/animationwidget.h b/src/assets/view/widgets/animationwidget.h --- a/src/assets/view/widgets/animationwidget.h +++ b/src/assets/view/widgets/animationwidget.h @@ -138,6 +138,10 @@ */ void slotSetRange(QPair) override; + void slotUpdateOpacity(qreal); + + void slotUpdateRotation(); + private slots: void slotPrevious(); void slotNext(); @@ -191,6 +195,8 @@ signals: /** @brief keyframes dropped / pasted on widget, import them. */ void setKeyframes(const QString &); + void opacityChanged(qreal opacity); + void rotationChanged(); }; #endif diff --git a/src/assets/view/widgets/animationwidget.cpp b/src/assets/view/widgets/animationwidget.cpp --- a/src/assets/view/widgets/animationwidget.cpp +++ b/src/assets/view/widgets/animationwidget.cpp @@ -804,6 +804,8 @@ connect(doubleparam, &DoubleWidget::valueChanged, this, &AnimationWidget::slotAdjustKeyframeValue); layout()->addWidget(doubleparam); + m_monitor->setEffectSceneProperty(QStringLiteral("showRotation"), true); + m_rotationWidget = DoubleWidget *doubleparam; // TODO: in timeline /*if ((!e.hasAttribute(QStringLiteral("intimeline")) || e.attribute(QStringLiteral("intimeline")) == QLatin1String("1")) && !e.hasAttribute(QStringLiteral("notintimeline"))) {*/ @@ -859,7 +861,7 @@ connect(m_spinOpacity, &DragValue::valueChanged, this, &AnimationWidget::slotAdjustRectKeyframeValue); horLayout2->addWidget(m_spinOpacity); } - + m_monitor->setEffectSceneProperty(QStringLiteral("showOpacity"),m_spinOpacity!=nullptr); // Build buttons m_originalSize = new QAction(KoIconUtils::themedIcon(QStringLiteral("zoom-original")), i18n("Adjust to original size"), this); connect(m_originalSize, &QAction::triggered, this, &AnimationWidget::slotAdjustToSource); @@ -1342,6 +1344,8 @@ if (activate) { connect(m_monitor, &Monitor::effectChanged, this, &AnimationWidget::slotUpdateGeometryRect, Qt::UniqueConnection); connect(m_monitor, &Monitor::effectPointsChanged, this, &AnimationWidget::slotUpdateCenters, Qt::UniqueConnection); + connect(m_monitor, &Monitor::opacityChanged, this, &AnimationWidget::slotUpdateOpacity, Qt::UniqueConnection); + connect(m_monitor, &Monitor::rotationChanged, this, &AnimationWidget::slotUpdateRotation, Qt::UniqueConnection); connect(m_monitor, &Monitor::seekToKeyframe, this, &AnimationWidget::slotSeekToKeyframe, Qt::UniqueConnection); connect(m_monitor, &Monitor::seekToNextKeyframe, this, &AnimationWidget::slotNext, Qt::UniqueConnection); connect(m_monitor, &Monitor::seekToPreviousKeyframe, this, &AnimationWidget::slotPrevious, Qt::UniqueConnection); @@ -1363,6 +1367,8 @@ } else { disconnect(m_monitor, &Monitor::effectChanged, this, &AnimationWidget::slotUpdateGeometryRect); disconnect(m_monitor, &Monitor::effectPointsChanged, this, &AnimationWidget::slotUpdateCenters); + disconnect(m_monitor, &Monitor::opacityChanged, this, &AnimationWidget::slotUpdateOpacity, Qt::UniqueConnection); + disconnect(m_monitor, &Monitor::rotationChanged, this, &AnimationWidget::slotUpdateRotation, Qt::UniqueConnection); disconnect(m_monitor, SIGNAL(addKeyframe()), this, SLOT(slotAddKeyframe())); disconnect(m_monitor, SIGNAL(deleteKeyframe()), this, SLOT(slotDeleteKeyframe())); disconnect(m_monitor, &Monitor::seekToNextKeyframe, this, &AnimationWidget::slotNext); @@ -1692,3 +1698,13 @@ m_ruler->setRange(0, m_outPoint - m_inPoint); m_timePos->setRange(0, m_outPoint - m_inPoint - 1); } + +void AnimationWidget::slotUpdateOpacity(qreal value) +{ + m_spinOpacity->setValue(value); +} + +void AnimationWidget::slotUpdateRotation(qreal value) +{ + m_rotationWidget->setValue(value); +} diff --git a/src/monitor/monitor.h b/src/monitor/monitor.h --- a/src/monitor/monitor.h +++ b/src/monitor/monitor.h @@ -316,7 +316,7 @@ bool effectSceneDisplayed(MonitorSceneType effectType); /** @brief split screen to compare clip with and without effect */ void slotSwitchCompare(bool enable); - void slotMouseSeek(int eventDelta, uint modifiers); + void slotMouseSeek(int eventDelta, int modifiers) override; void slotSwitchFullScreen(bool minimizeOnly = false) override; /** @brief Display or hide the record toolbar */ void slotSwitchRec(bool enable); @@ -345,6 +345,8 @@ void extractZone(const QString &id); void effectChanged(const QRect &); void effectPointsChanged(const QVariantList &); + void opacityChanged(qreal); + void rotationChanged(); void addKeyframe(); void deleteKeyframe(); void seekToNextKeyframe(); diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp --- a/src/monitor/monitor.cpp +++ b/src/monitor/monitor.cpp @@ -133,7 +133,6 @@ : AbstractMonitor(id, manager, parent) , m_controller(nullptr) , m_glMonitor(nullptr) - , m_snaps(new SnapModel()) , m_splitEffect(nullptr) , m_splitProducer(nullptr) , m_length(2) @@ -147,6 +146,7 @@ , m_editMarker(nullptr) , m_forceSizeFactor(0) , m_lastMonitorSceneType(MonitorSceneDefault) + , m_snaps(new SnapModel()) { auto *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); @@ -172,6 +172,8 @@ m_qmlManager = new QmlManager(m_glMonitor); connect(m_qmlManager, &QmlManager::effectChanged, this, &Monitor::effectChanged); connect(m_qmlManager, &QmlManager::effectPointsChanged, this, &Monitor::effectPointsChanged); + connect(m_qmlManager, &QmlManager::opacityChanged, this, &Monitor::opacityChanged); + connect(m_qmlManager, &QmlManager::rotationChanged, this, &Monitor::rotationChanged); auto *monitorEventEater = new QuickMonitorEventEater(this); m_glWidget->installEventFilter(monitorEventEater); @@ -187,7 +189,7 @@ connect(m_horizontalScroll, &QAbstractSlider::valueChanged, this, &Monitor::setOffsetX); connect(m_verticalScroll, &QAbstractSlider::valueChanged, this, &Monitor::setOffsetY); connect(m_glMonitor, &GLWidget::frameDisplayed, this, &Monitor::onFrameDisplayed); - connect(m_glMonitor, SIGNAL(mouseSeek(int, int)), this, SLOT(slotMouseSeek(int, uint))); + connect(m_glMonitor, SIGNAL(mouseSeek(int, int)), this, SLOT(slotMouseSeek(int, int))); connect(m_glMonitor, SIGNAL(monitorPlay()), this, SLOT(slotPlay())); connect(m_glMonitor, &GLWidget::startDrag, this, &Monitor::slotStartDrag); connect(m_glMonitor, SIGNAL(switchFullScreen(bool)), this, SLOT(slotSwitchFullScreen(bool))); @@ -702,8 +704,8 @@ { Q_UNUSED(event) if (m_glMonitor->zoom() > 0.0f) { - float horizontal = float(m_horizontalScroll->value()) / float(m_horizontalScroll->maximum()); - float vertical = float(m_verticalScroll->value()) / float(m_verticalScroll->maximum()); + float horizontal = float(m_horizontalScroll->value()) / m_horizontalScroll->maximum(); + float vertical = float(m_verticalScroll->value()) / m_verticalScroll->maximum(); adjustScrollBars(horizontal, vertical); } else { m_horizontalScroll->hide(); @@ -715,32 +717,32 @@ { if (m_glMonitor->zoom() > 1.0f) { m_horizontalScroll->setPageStep(m_glWidget->width()); - m_horizontalScroll->setMaximum((int)((float)m_glMonitor->profileSize().width() * m_glMonitor->zoom()) - m_horizontalScroll->pageStep()); + m_horizontalScroll->setMaximum(m_glMonitor->profileSize().width() * m_glMonitor->zoom() - m_horizontalScroll->pageStep()); m_horizontalScroll->setValue(qRound(horizontal * m_horizontalScroll->maximum())); emit m_horizontalScroll->valueChanged(m_horizontalScroll->value()); m_horizontalScroll->show(); } else { - int max = (int)((float)m_glMonitor->profileSize().width() * m_glMonitor->zoom()) - m_glWidget->width(); + int max = m_glMonitor->profileSize().width() * m_glMonitor->zoom() - m_glWidget->width(); emit m_horizontalScroll->valueChanged(qRound(0.5 * max)); m_horizontalScroll->hide(); } if (m_glMonitor->zoom() > 1.0f) { m_verticalScroll->setPageStep(m_glWidget->height()); - m_verticalScroll->setMaximum((int)((float)m_glMonitor->profileSize().height() * m_glMonitor->zoom()) - m_verticalScroll->pageStep()); - m_verticalScroll->setValue((int)((float)m_verticalScroll->maximum()*vertical)); + m_verticalScroll->setMaximum(m_glMonitor->profileSize().height() * m_glMonitor->zoom() - m_verticalScroll->pageStep()); + m_verticalScroll->setValue(qRound(vertical * m_verticalScroll->maximum())); emit m_verticalScroll->valueChanged(m_verticalScroll->value()); m_verticalScroll->show(); } else { - int max = (int)((float)m_glMonitor->profileSize().height() * m_glMonitor->zoom()) - m_glWidget->height(); + int max = m_glMonitor->profileSize().height() * m_glMonitor->zoom() - m_glWidget->height(); emit m_verticalScroll->valueChanged(qRound(0.5 * max)); m_verticalScroll->hide(); } } void Monitor::setZoom() { - if (qFuzzyCompare(m_glMonitor->zoom(), 1.0f)) { + if (m_glMonitor->zoom() == 1.0f) { m_horizontalScroll->hide(); m_verticalScroll->hide(); m_glMonitor->setOffsetX(m_horizontalScroll->value(), m_horizontalScroll->maximum()); @@ -823,9 +825,9 @@ QPoint p = m_glMonitor->getControllerProxy()->zone(); list.append(QString::number(p.x())); list.append(QString::number(p.y())); - QByteArray prodData; - prodData.append(list.join(QLatin1Char('#')).toUtf8()); - mimeData->setData(QStringLiteral("kdenlive/producerslist"), prodData); + QByteArray data; + data.append(list.join(QLatin1Char('#')).toUtf8()); + mimeData->setData(QStringLiteral("kdenlive/producerslist"), data); drag->setMimeData(mimeData); /*QPixmap pix = m_currentClip->thumbnail(); drag->setPixmap(pix); @@ -865,9 +867,9 @@ QPoint p = m_glMonitor->getControllerProxy()->zone(); list.append(QString::number(p.x())); list.append(QString::number(p.y())); - QByteArray clipData; - clipData.append(list.join(QLatin1Char(';')).toUtf8()); - mimeData->setData(QStringLiteral("kdenlive/clip"), clipData); + QByteArray data; + data.append(list.join(QLatin1Char(';')).toUtf8()); + mimeData->setData(QStringLiteral("kdenlive/clip"), data); drag->setMimeData(mimeData); drag->start(Qt::MoveAction); } @@ -898,7 +900,7 @@ // virtual void Monitor::wheelEvent(QWheelEvent *event) { - slotMouseSeek(event->delta(), event->modifiers()); + slotMouseSeek(event->delta(), (int)event->modifiers()); event->accept(); } @@ -923,7 +925,7 @@ QWidget::keyPressEvent(event); } -void Monitor::slotMouseSeek(int eventDelta, uint modifiers) +void Monitor::slotMouseSeek(int eventDelta, int modifiers) { if ((modifiers & Qt::ControlModifier) != 0u) { int delta = m_monitorManager->timecode().fps(); @@ -1130,7 +1132,7 @@ void Monitor::slotRewind(double speed) { slotActivateMonitor(); - if (qFuzzyIsNull(speed)) { + if (speed == 0) { double currentspeed = m_glMonitor->playSpeed(); if (currentspeed >= 0) { speed = -1; @@ -1156,7 +1158,7 @@ void Monitor::slotForward(double speed) { slotActivateMonitor(); - if (qFuzzyIsNull(speed)) { + if (speed == 0) { double currentspeed = m_glMonitor->playSpeed(); if (currentspeed <= 0) { speed = 1; @@ -1193,7 +1195,6 @@ void Monitor::seekCursor(int pos) { - Q_UNUSED(pos) // Deprecated shoud not be used, instead requestSeek /*if (m_ruler->slotNewValue(pos)) { m_timePos->setValue(pos); @@ -1207,6 +1208,7 @@ void Monitor::adjustRulerSize(int length, std::shared_ptr markerModel) { if (m_controller != nullptr) { + QPoint zone = m_controller->zone(); m_glMonitor->setRulerInfo(length); } else { m_glMonitor->setRulerInfo(length, markerModel); @@ -1326,16 +1328,14 @@ void Monitor::updateClipProducer(const QString &playlist) { - Q_UNUSED(playlist) // TODO - // Mlt::Producer *prod = new Mlt::Producer(*m_glMonitor->profile(), playlist.toUtf8().constData()); + Mlt::Producer *prod = new Mlt::Producer(*m_glMonitor->profile(), playlist.toUtf8().constData()); // m_glMonitor->setProducer(prod, isActive(), render->seekFramePosition()); m_glMonitor->switchPlay(true); } void Monitor::slotOpenClip(std::shared_ptr controller, int in, int out) { - Q_UNUSED(out) if (m_controller) { disconnect(m_controller->getMarkerModel().get(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector &)), this, SLOT(checkOverlay())); @@ -1385,7 +1385,6 @@ void Monitor::slotOpenDvdFile(const QString &file) { // TODO - Q_UNUSED(file) m_glMonitor->initializeGL(); // render->loadUrl(file); } @@ -1399,7 +1398,6 @@ void Monitor::setCustomProfile(const QString &profile, const Timecode &tc) { // TODO or deprecate - Q_UNUSED(profile) m_timePos->updateTimeCode(tc); if (true) { return; diff --git a/src/monitor/qmlmanager.h b/src/monitor/qmlmanager.h --- a/src/monitor/qmlmanager.h +++ b/src/monitor/qmlmanager.h @@ -56,10 +56,14 @@ void effectRectChanged(); void effectPolygonChanged(); void effectRotoChanged(); + void effectOpacityChanged(); + void effectRotationChanged(); signals: void effectChanged(const QRect &); void effectPointsChanged(const QVariantList &); + void opacityChanged(); + void angleChanged(); }; #endif diff --git a/src/monitor/qmlmanager.cpp b/src/monitor/qmlmanager.cpp --- a/src/monitor/qmlmanager.cpp +++ b/src/monitor/qmlmanager.cpp @@ -66,6 +66,8 @@ root = m_view->rootObject(); QObject::connect(root, SIGNAL(effectChanged()), this, SLOT(effectRectChanged()), Qt::UniqueConnection); QObject::connect(root, SIGNAL(centersChanged()), this, SLOT(effectPolygonChanged()), Qt::UniqueConnection); + QObject::connect(root, SIGNAL(opacityChanged(qreal)), this, SIGNAL(opacityChanged(qreal)), Qt::UniqueConnection); + QObject::connect(root, SIGNAL(rotationChanged()), this, SIGNAL(rotationChanged()), Qt:UniqueConnection); root->setProperty("profile", QPoint(profile.width(), profile.height())); root->setProperty("framesize", QRect(0, 0, profile.width(), profile.height())); root->setProperty("scalex", (double)displayRect.width() / profile.width() * zoom); @@ -151,3 +153,20 @@ } emit effectPointsChanged(mix); } + +void QmlManager::effectOpacityChanged() +{ + if (!m_view->rootObject()) { + return; + } + const qreal opacityValue = m_view->rootObject()->property("opacity").toReal(); + emit opacityChanged(opacityValue); +} + +void QmlManager::effectRotationChanged() +{ + if (!m_view->rootObject()) { + return; + } + emit angleChanged(); +} diff --git a/src/monitor/view/kdenlivemonitoreffectscene.qml b/src/monitor/view/kdenlivemonitoreffectscene.qml --- a/src/monitor/view/kdenlivemonitoreffectscene.qml +++ b/src/monitor/view/kdenlivemonitoreffectscene.qml @@ -28,6 +28,8 @@ property var centerPointsTypes: [] onCenterPointsChanged: canvas.requestPaint() property bool showToolbar: false + property bool showOpacity: false + property bool showRotation: false signal effectChanged() signal centersChanged() signal addKeyframe() @@ -138,6 +140,8 @@ return Qt.point(x,y); } } + + Rectangle { id: frame objectName: "referenceframe" @@ -216,6 +220,7 @@ } visible: root.showToolbar } + Rectangle { id: framerect property color hoverColor: "#ffffff" @@ -242,7 +247,7 @@ anchors.centerIn: parent hoverEnabled: true cursorShape: Qt.SizeFDiagCursor - onEntered: { + onEntered: { if (!pressed) { tlhandle.color = '#ffff00' } @@ -510,4 +515,30 @@ color: framerect.hoverColor } } + + Opacity { + id: opacity + signal opacityChanged(real value) + anchors { + left: parent.left + top: parent.top + topMargin: 20 + leftMargin: 10 + } + visible: root.showOpacity + root.opacityChanged(value) + } + + Rotation { + id: rotation + signal angleChanged() + anchors { + left: parent.left + top: parent.top + topMargin: 30 + leftMargin: 10 + } + visible: root.showRotation + root.angleChanged() + } } diff --git a/src/uiresources.qrc b/src/uiresources.qrc --- a/src/uiresources.qrc +++ b/src/uiresources.qrc @@ -32,5 +32,7 @@ effects/effectstack/view/qml/BuiltStack.qml effects/effectstack/view/qml/EffectSlider.qml effects/effectstack/view/qml/LiftGammaGain.qml + monitor/view/Opacity.qml + monitor/view/Rotation.qml