From kde-commits Fri Sep 28 15:09:06 2018 From: Jean-Baptiste Mardelle Date: Fri, 28 Sep 2018 15:09:06 +0000 To: kde-commits Subject: [kdenlive/refactoring_timeline] src: Fix various issues with timeline zoom Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=153849306000838 Git commit 5cc1bf207320a18483d722f23b2238cdf03ad417 by Jean-Baptiste Mardel= le. Committed on 28/09/2018 at 15:08. Pushed by mardelle into branch 'refactoring_timeline'. Fix various issues with timeline zoom M +10 -16 src/mainwindow.cpp M +2 -0 src/mainwindow.h M +3 -2 src/timeline2/view/qml/timeline.qml M +3 -4 src/timeline2/view/timelinecontroller.cpp M +1 -0 src/timeline2/view/timelinecontroller.h M +3 -0 src/timeline2/view/timelinetabs.cpp M +3 -0 src/timeline2/view/timelinetabs.hpp M +10 -0 src/timeline2/view/timelinewidget.cpp M +2 -0 src/timeline2/view/timelinewidget.h https://commits.kde.org/kdenlive/5cc1bf207320a18483d722f23b2238cdf03ad417 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index da46fb8a5..4ddc0c321 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -311,6 +311,7 @@ void MainWindow::init() connect(m_assetPanel, &AssetPanel::changeSpeed, this, &MainWindow::slo= tChangeSpeed); connect(m_timelineTabs, &TimelineTabs::showTransitionModel, m_assetPan= el, &AssetPanel::showTransition); connect(m_timelineTabs, &TimelineTabs::showItemEffectStack, m_assetPan= el, &AssetPanel::showEffectStack); + connect(m_timelineTabs, &TimelineTabs::updateZoom, this, &MainWindow::= updateZoomSlider); connect(pCore->bin(), &Bin::requestShowEffectStack, m_assetPanel, &Ass= etPanel::showEffectStack); connect(this, &MainWindow::clearAssetPanel, m_assetPanel, &AssetPanel:= :clearAssetPanel); connect(m_assetPanel, &AssetPanel::seekToPos, [this](int pos) { @@ -1071,7 +1072,7 @@ void MainWindow::setupActions() m_zoomOut->setShortcut(Qt::CTRL + Qt::Key_Minus); = m_zoomSlider =3D new QSlider(Qt::Horizontal, this); - m_zoomSlider->setMaximum(14); + m_zoomSlider->setRange(0, 13); m_zoomSlider->setPageStep(1); m_zoomSlider->setInvertedAppearance(true); m_zoomSlider->setInvertedControls(true); @@ -1082,21 +1083,6 @@ void MainWindow::setupActions() m_zoomIn =3D new QAction(QIcon::fromTheme(QStringLiteral("zoom-in")), = i18n("Zoom In"), this); m_zoomIn->setShortcut(Qt::CTRL + Qt::Key_Plus); = - /*actionWidget =3D toolbar->widgetForAction(m_buttonFitZoom); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - actionWidget->setStyleSheet(styleBorderless); - - actionWidget =3D toolbar->widgetForAction(m_zoomIn); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - actionWidget->setStyleSheet(styleBorderless); - - actionWidget =3D toolbar->widgetForAction(m_zoomOut); - actionWidget->setMaximumWidth(max); - actionWidget->setMaximumHeight(max - 4); - actionWidget->setStyleSheet(styleBorderless);*/ - connect(m_zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetZoo= m(int))); connect(m_zoomSlider, &QAbstractSlider::sliderMoved, this, &MainWindow= ::slotShowZoomSliderToolTip); connect(m_buttonFitZoom, &QAction::triggered, this, &MainWindow::slotF= itZoom); @@ -2667,6 +2653,14 @@ void MainWindow::slotSetZoom(int value, bool zoomOnM= ouse) m_zoomSlider->blockSignals(false); } = +void MainWindow::updateZoomSlider(int value) +{ + slotUpdateZoomSliderToolTip(value); + m_zoomSlider->blockSignals(true); + m_zoomSlider->setValue(value); + m_zoomSlider->blockSignals(false); +} + void MainWindow::slotShowZoomSliderToolTip(int zoomlevel) { if (zoomlevel !=3D -1) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 6d158702d..f735cb052 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -298,6 +298,8 @@ private slots: void slotFitZoom(); /** @brief Updates the zoom slider tooltip to fit @param zoomlevel. */ void slotUpdateZoomSliderToolTip(int zoomlevel); + /** @brief Timeline was zoom, update slider to reflect that */ + void updateZoomSlider(int value); = /** @brief Displays the zoom slider tooltip. * @param zoomlevel (optional) The zoom level to show in the tooltip. diff --git a/src/timeline2/view/qml/timeline.qml b/src/timeline2/view/qml/t= imeline.qml index cccbf2cb6..0bd0981ce 100644 --- a/src/timeline2/view/qml/timeline.qml +++ b/src/timeline2/view/qml/timeline.qml @@ -51,7 +51,8 @@ Rectangle { timeline.triggerAction('monitor_seek_snap_forward') } } else if (wheel.modifiers & Qt.ControlModifier) { - timeline.setScaleFactor(timeline.scaleFactor + 0.2 * wheel.ang= leDelta.y / 120); + zoomOnMouse =3D getMousePos(); + timeline.setScaleFactor(Math.max(0.005, timeline.scaleFactor *= (1.0 + wheel.angleDelta.y / 600))); } else { var newScroll =3D Math.min(scrollView.flickableItem.contentX -= wheel.angleDelta.y, timeline.fullDuration * root.timeScale - (scrollView.w= idth - scrollView.__verticalScrollBar.width)) scrollView.flickableItem.contentX =3D Math.max(newScroll, 0) @@ -159,7 +160,7 @@ Rectangle { //onCurrentTrackChanged: timeline.selection =3D [] onTimeScaleChanged: { if (root.zoomOnMouse >=3D 0) { - var mouseFraction =3D scrollView.flickableItem.contentX =3D Ma= th.max(0, root.zoomOnMouse * timeline.scaleFactor - tracksArea.mouseX) + scrollView.flickableItem.contentX =3D Math.max(0, root.zoomOnM= ouse * timeline.scaleFactor - tracksArea.mouseX) root.zoomOnMouse =3D -1 } else { scrollView.flickableItem.contentX =3D Math.max(0, (timeline.se= ekPosition > -1 ? timeline.seekPosition : timeline.position) * timeline.sca= leFactor - (scrollView.width / 2)) diff --git a/src/timeline2/view/timelinecontroller.cpp b/src/timeline2/view= /timelinecontroller.cpp index 564eba154..c2d001ac7 100644 --- a/src/timeline2/view/timelinecontroller.cpp +++ b/src/timeline2/view/timelinecontroller.cpp @@ -222,11 +222,10 @@ void TimelineController::setScaleFactorOnMouse(double= scale, bool zoomOnMouse) = void TimelineController::setScaleFactor(double scale) { - /*if (m_duration * scale < width() - 160) { - // Don't allow scaling less than full project's width - scale =3D (width() - 160.0) / m_duration; - }*/ m_scale =3D scale; + // Update mainwindow's zoom slider + emit updateZoom(scale); + // inform qml emit scaleFactorChanged(); } = diff --git a/src/timeline2/view/timelinecontroller.h b/src/timeline2/view/t= imelinecontroller.h index 8f8077fe2..29f7b6084 100644 --- a/src/timeline2/view/timelinecontroller.h +++ b/src/timeline2/view/timelinecontroller.h @@ -479,6 +479,7 @@ signals: void renderedChunksChanged(); void workingPreviewChanged(); void useRulerChanged(); + void updateZoom(double); Q_INVOKABLE void ungrabHack(); }; = diff --git a/src/timeline2/view/timelinetabs.cpp b/src/timeline2/view/timel= inetabs.cpp index 1eaa6c2b1..5d19495aa 100644 --- a/src/timeline2/view/timelinetabs.cpp +++ b/src/timeline2/view/timelinetabs.cpp @@ -72,6 +72,9 @@ void TimelineTabs::connectTimeline(TimelineWidget *timeli= ne) connect(this, &TimelineTabs::showAudioThumbnailsChanged, timeline->con= troller(), &TimelineController::showAudioThumbnailsChanged); connect(this, &TimelineTabs::changeZoom, timeline, &TimelineWidget::sl= otChangeZoom); connect(timeline->controller(), &TimelineController::showTransitionMod= el, this, &TimelineTabs::showTransitionModel); + connect(timeline->controller(), &TimelineController::updateZoom, [&](d= ouble value) { + emit updateZoom(getCurrentTimeline()->zoomForScale(value)); + }); connect(timeline->controller(), &TimelineController::showItemEffectSta= ck, this, &TimelineTabs::showItemEffectStack); } = diff --git a/src/timeline2/view/timelinetabs.hpp b/src/timeline2/view/timel= inetabs.hpp index b455af1c3..41bc5943e 100644 --- a/src/timeline2/view/timelinetabs.hpp +++ b/src/timeline2/view/timelinetabs.hpp @@ -74,6 +74,9 @@ signals: void showTransitionModel(int tid, std::shared_ptr= ); /* @brief Requests that a given effectstack model is displayed in the = asset panel */ void showItemEffectStack(const QString &clipName, std::shared_ptr, QSize, bool); + /** @brief Zoom level changed in timeline, update slider + */ + void updateZoom(int); = private: TimelineWidget *m_mainTimeline; diff --git a/src/timeline2/view/timelinewidget.cpp b/src/timeline2/view/tim= elinewidget.cpp index 92a891c08..82f39739f 100644 --- a/src/timeline2/view/timelinewidget.cpp +++ b/src/timeline2/view/timelinewidget.cpp @@ -184,3 +184,13 @@ void TimelineWidget::slotUngrabHack() quickWindow()->mouseGrabberItem()->ungrabMouse(); } } + +int TimelineWidget::zoomForScale(double value) const +{ + int scale =3D 100.0 / value; + int ix =3D 13; + while(comboScale[ix] > scale && ix > 0) { + ix --; + } + return ix; +} diff --git a/src/timeline2/view/timelinewidget.h b/src/timeline2/view/timel= inewidget.h index 88363ebf5..dc22a8f2e 100644 --- a/src/timeline2/view/timelinewidget.h +++ b/src/timeline2/view/timelinewidget.h @@ -49,6 +49,8 @@ public: TimelineController *controller(); void setTool(ProjectTool tool); QPoint getTracksCount() const; + /* @brief calculate zoom level for a scale */ + int zoomForScale(double value) const; bool loading; = protected: