diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.5) add_definitions(${Qt5Gui_DEFINITIONS}) if(${Qt5Gui_OPENGL_IMPLEMENTATION} STREQUAL "GL") find_package(OpenGL REQUIRED) 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 @@ -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 @@ -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); 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/Opacity.qml b/src/monitor/view/Opacity.qml new file mode 100644 --- /dev/null +++ b/src/monitor/view/Opacity.qml @@ -0,0 +1,22 @@ +import QtQuick.Controls 1.3 +import QtQuick.Controls.Styles 1.3 +import QtQuick 2.0 + +Item { + id: opacity + objectName: "opacity" + + Row { + Slider { + id: opacitySlider + objectName: "opacitySlider" + orientation: Qt.Horizontal + maximumValue: 1.0 + stepSize: 0.01 + value: 0.5 + onValueChanged: { + opacitySlider.opacityChanged(value); + } + } + } +} diff --git a/src/monitor/view/Rotation.qml b/src/monitor/view/Rotation.qml new file mode 100644 --- /dev/null +++ b/src/monitor/view/Rotation.qml @@ -0,0 +1,22 @@ +import QtQuick.Controls 1.3 +import QtQuick.Controls.Styles 1.3 +import QtQuick 2.0 + +Item { + id: rotation + objectName: "rotation" + + Row { + Slider { + id: rotationSlider + objectName: "rotationSlider" + orientation: Qt.Horizontal + maximumValue: 359 + stepSize: 1 + value: 0 + onValueChanged: { + rotationSlider.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 @@ -1,34 +1,35 @@ - - kdenliveui.rc - - - monitor/view/kdenlivemonitor.qml - monitor/view/kdenliveclipmonitor.qml - monitor/view/kdenlivemonitoreffectscene.qml - monitor/view/kdenlivemonitorcornerscene.qml - monitor/view/kdenlivemonitorrotoscene.qml - monitor/view/kdenlivemonitorsplit.qml - monitor/view/kdenlivemonitorripple.qml - monitor/view/SceneToolBar.qml - monitor/view/EffectToolBar.qml - monitor/view/MonitorRuler.qml - timeline2/view/qml/timeline.qml - timeline2/view/qml/TrackHead.qml - timeline2/view/qml/Track.qml - timeline2/view/qml/Ruler.qml - timeline2/view/qml/Clip.qml - timeline2/view/qml/KeyframeView.qml - timeline2/view/qml/Composition.qml - timeline2/view/qml/PulsingAnimation.qml - timeline2/view/qml/CornerSelectionShadow.qml - timeline2/view/qml/Timeline.js - assets/assetlist/view/qml/assetList.qml - assets/view/qml/AssetView.qml - transitions/view/qml/transitionView.qml - timeline2/view/qml/AssetMenu.qml - effects/effectstack/view/qml/BuiltStack.qml - effects/effectstack/view/qml/EffectSlider.qml - effects/effectstack/view/qml/LiftGammaGain.qml - + + kdenliveui.rc + + + monitor/view/kdenlivemonitor.qml + monitor/view/kdenliveclipmonitor.qml + monitor/view/kdenlivemonitoreffectscene.qml + monitor/view/kdenlivemonitorcornerscene.qml + monitor/view/kdenlivemonitorrotoscene.qml + monitor/view/kdenlivemonitorsplit.qml + monitor/view/kdenlivemonitorripple.qml + monitor/view/SceneToolBar.qml + monitor/view/EffectToolBar.qml + monitor/view/MonitorRuler.qml + timeline2/view/qml/timeline.qml + timeline2/view/qml/TrackHead.qml + timeline2/view/qml/Track.qml + timeline2/view/qml/Ruler.qml + timeline2/view/qml/Clip.qml + timeline2/view/qml/KeyframeView.qml + timeline2/view/qml/Composition.qml + timeline2/view/qml/PulsingAnimation.qml + timeline2/view/qml/CornerSelectionShadow.qml + timeline2/view/qml/Timeline.js + assets/assetlist/view/qml/assetList.qml + assets/view/qml/AssetView.qml + transitions/view/qml/transitionView.qml + timeline2/view/qml/AssetMenu.qml + effects/effectstack/view/qml/BuiltStack.qml + effects/effectstack/view/qml/EffectSlider.qml + effects/effectstack/view/qml/LiftGammaGain.qml + Opacity.qml +