Git commit b753b3cfb55ce2eb3ad27a1c546d9b70fcd17265 by Jean-Baptiste Mardel= le. Committed on 04/12/2016 at 20:37. Pushed by mardelle into branch 'Applications/16.12'. Ctrl+Mouse Wheel now zooms on mouse position BUG: 369198 M +9 -10 src/mainwindow.cpp M +3 -3 src/mainwindow.h M +13 -5 src/timeline/customtrackview.cpp M +3 -3 src/timeline/customtrackview.h M +2 -2 src/timeline/timeline.cpp M +1 -1 src/timeline/timeline.h https://commits.kde.org/kdenlive/b753b3cfb55ce2eb3ad27a1c546d9b70fcd17265 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index da0c844..b602606 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1927,8 +1927,8 @@ void MainWindow::connectDocument() connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transi= tion*,int,QPoint,bool)), m_effectStack, SLOT(slotTransitionItemSelected(Tra= nsition*,int,QPoint,bool)), Qt::DirectConnection); = connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transi= tion*,int,QPoint,bool)), this, SLOT(slotActivateTransitionView(Transition*)= )); - connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoo= mIn())); - connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZo= omOut())); + connect(trackView->projectView(), SIGNAL(zoomIn(bool)), this, SLOT(slo= tZoomIn(bool))); + connect(trackView->projectView(), SIGNAL(zoomOut(bool)), this, SLOT(sl= otZoomOut(bool))); connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int))); connect(trackView, SIGNAL(displayMessage(QString,MessageType)), m_mess= ageLabel, SLOT(setMessage(QString,MessageType))); connect(trackView->projectView(), SIGNAL(displayMessage(QString,Messag= eType)), m_messageLabel, SLOT(setMessage(QString,MessageType))); @@ -2640,15 +2640,15 @@ void MainWindow::slotAddVideoEffect(QAction *result) } = = -void MainWindow::slotZoomIn() +void MainWindow::slotZoomIn(bool zoomOnMouse) { - m_zoomSlider->setValue(m_zoomSlider->value() - 1); + slotSetZoom(m_zoomSlider->value() - 1, zoomOnMouse); slotShowZoomSliderToolTip(); } = -void MainWindow::slotZoomOut() +void MainWindow::slotZoomOut(bool zoomOnMouse) { - m_zoomSlider->setValue(m_zoomSlider->value() + 1); + slotSetZoom(m_zoomSlider->value() + 1, zoomOnMouse); slotShowZoomSliderToolTip(); } = @@ -2661,13 +2661,12 @@ void MainWindow::slotFitZoom() } } = -void MainWindow::slotSetZoom(int value) +void MainWindow::slotSetZoom(int value, bool zoomOnMouse) { - value =3D qMax(m_zoomSlider->minimum(), value); - value =3D qMin(m_zoomSlider->maximum(), value); + value =3D qBound(m_zoomSlider->minimum(), value, m_zoomSlider->maximum= ()); = if (pCore->projectManager()->currentTimeline()) { - pCore->projectManager()->currentTimeline()->slotChangeZoom(value); + pCore->projectManager()->currentTimeline()->slotChangeZoom(value, = -1, zoomOnMouse); } = m_zoomOut->setEnabled(value < m_zoomSlider->maximum()); diff --git a/src/mainwindow.h b/src/mainwindow.h index 1fea110..014abf1 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -298,11 +298,11 @@ private slots: /** @brief Sets the timeline zoom slider to @param value. * * Also disables zoomIn and zoomOut actions if they cannot be used at t= he moment. */ - void slotSetZoom(int value); + void slotSetZoom(int value, bool zoomOnMouse =3D false); /** @brief Decreases the timeline zoom level by 1. */ - void slotZoomIn(); + void slotZoomIn(bool zoomOnMouse =3D false); /** @brief Increases the timeline zoom level by 1. */ - void slotZoomOut(); + void slotZoomOut(bool zoomOnMouse =3D false); /** @brief Makes the timeline zoom level fit the timeline content. */ void slotFitZoom(); /** @brief Updates the zoom slider tooltip to fit @param zoomlevel. */ diff --git a/src/timeline/customtrackview.cpp b/src/timeline/customtrackvie= w.cpp index 67b1052..4f66199 100644 --- a/src/timeline/customtrackview.cpp +++ b/src/timeline/customtrackview.cpp @@ -195,7 +195,7 @@ void CustomTrackView::initTools() m_toolManagers.insert(AbstractToolManager::TrimType, trim); m_toolManagers.insert(AbstractToolManager::SpacerType, new SpacerManag= er(this, m_commandStack)); m_toolManagers.insert(AbstractToolManager::ResizeType, new ResizeManag= er(this, m_commandStack)); - = + AbstractToolManager *razorManager =3D new RazorManager(this, m_command= Stack); m_toolManagers.insert(AbstractToolManager::RazorType, razorManager); connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), razorManager= , SLOT(updateTimelineItems())); @@ -410,8 +410,8 @@ void CustomTrackView::wheelEvent(QWheelEvent * e) { if (e->modifiers() =3D=3D Qt::ControlModifier) { if (m_moveOpMode =3D=3D None || m_moveOpMode =3D=3D WaitingForConf= irm || m_moveOpMode =3D=3D ZoomTimeline) { - if (e->delta() > 0) emit zoomIn(); - else emit zoomOut(); + if (e->delta() > 0) emit zoomIn(true); + else emit zoomOut(true); } } else if (e->modifiers() =3D=3D Qt::AltModifier) { if (m_moveOpMode =3D=3D None || m_moveOpMode =3D=3D WaitingForConf= irm || m_moveOpMode =3D=3D ZoomTimeline) { @@ -5854,10 +5854,11 @@ void CustomTrackView::setTool(ProjectTool tool) m_currentToolManager->initTool(m_tracksHeight * m_scene->scale().y()); } = -void CustomTrackView::setScale(double scaleFactor, double verticalScale) +void CustomTrackView::setScale(double scaleFactor, double verticalScale, b= ool zoomOnMouse) { = QMatrix newmatrix; + int lastMousePos =3D getMousePos(); newmatrix =3D newmatrix.scale(scaleFactor, verticalScale); m_scene->isZooming =3D true; m_scene->setScale(scaleFactor, verticalScale); @@ -5900,7 +5901,14 @@ void CustomTrackView::setScale(double scaleFactor, d= ouble verticalScale) setSceneRect(0, 0, (m_projectDuration + 300), sceneRect().heig= ht()); } double verticalPos =3D mapToScene(QPoint(0, viewport()->height() / 2))= .y(); - centerOn(QPointF(cursorPos(), verticalPos)); + if (zoomOnMouse) { + // Zoom on mouse position + centerOn(QPointF(lastMousePos, verticalPos)); + int diff =3D scaleFactor * (getMousePos() - lastMousePos); + horizontalScrollBar()->setValue(horizontalScrollBar()->value() - d= iff); + } else { + centerOn(QPointF(cursorPos(), verticalPos)); + } m_currentToolManager->updateTimelineItems(); m_scene->isZooming =3D false; } diff --git a/src/timeline/customtrackview.h b/src/timeline/customtrackview.h index fbd3461..7c68fb9 100644 --- a/src/timeline/customtrackview.h +++ b/src/timeline/customtrackview.h @@ -79,7 +79,7 @@ public: void deleteClip(ItemInfo info, bool refresh =3D true); void addMarker(const QString &id, const CommentedTime &marker); void addData(const QString &id, const QString &key, const QString &dat= a); - void setScale(double scaleFactor, double verticalScale); + void setScale(double scaleFactor, double verticalScale, bool zoomOnMou= se =3D false); void deleteClip(const QString &clipId, QUndoCommand *deleteCommand); /** @brief An effect was dropped on @param clip */ void slotDropEffect(ClipItem *clip, QDomElement effect, GenTime pos, i= nt track); @@ -586,8 +586,8 @@ private slots: = signals: void cursorMoved(int, int); - void zoomIn(); - void zoomOut(); + void zoomIn(bool zoomOnMouse); + void zoomOut(bool zoomOnMouse); void mousePosition(int); /** @brief A clip was selected in timeline, update the effect stack * @param clip The clip diff --git a/src/timeline/timeline.cpp b/src/timeline/timeline.cpp index 827e3b1..3fdccc5 100644 --- a/src/timeline/timeline.cpp +++ b/src/timeline/timeline.cpp @@ -568,7 +568,7 @@ void Timeline::moveCursorPos(int pos) m_trackview->setCursorPos(pos); } = -void Timeline::slotChangeZoom(int horizontal, int vertical) +void Timeline::slotChangeZoom(int horizontal, int vertical, bool zoomOnMou= se) { m_ruler->setPixelPerMark(horizontal); m_scale =3D (double) m_trackview->getFrameWidth() / m_ruler->comboScal= e[horizontal]; @@ -576,7 +576,7 @@ void Timeline::slotChangeZoom(int horizontal, int verti= cal) if (vertical =3D=3D -1) { // user called zoom m_doc->setZoom(horizontal, m_verticalZoom); - m_trackview->setScale(m_scale, m_scene->scale().y()); + m_trackview->setScale(m_scale, m_scene->scale().y(), zoomOnMouse); } else { m_verticalZoom =3D vertical; if (m_verticalZoom =3D=3D 0) diff --git a/src/timeline/timeline.h b/src/timeline/timeline.h index 5e317a6..ac340ce 100644 --- a/src/timeline/timeline.h +++ b/src/timeline/timeline.h @@ -191,7 +191,7 @@ public: = public slots: void slotDeleteClip(const QString &clipId, QUndoCommand *deleteCommand= ); - void slotChangeZoom(int horizontal, int vertical =3D -1); + void slotChangeZoom(int horizontal, int vertical =3D -1, bool zoomOnMo= use =3D false); void setDuration(int dur); void slotSetZone(const QPoint &p, bool updateDocumentProperties =3D tr= ue); /** @brief Save a snapshot image of current timeline view */