[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive/Applications/16.12] src: Ctrl+Mouse Wheel now zooms on mouse position
From:       Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date:       2016-12-04 20:37:28
Message-ID: E1cDdXM-0001ve-6N () code ! kde ! org
[Download RAW message or body]

Git commit b753b3cfb55ce2eb3ad27a1c546d9b70fcd17265 by Jean-Baptiste Mardelle.
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(Transition*,int,QPoint,bool)), m_effectStack, \
SLOT(slotTransitionItemSelected(Transition*,int,QPoint,bool)), Qt::DirectConnection); \
                
     connect(trackView->projectView(), \
SIGNAL(transitionItemSelected(Transition*,int,QPoint,bool)), this, \
                SLOT(slotActivateTransitionView(Transition*)));
-    connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
-    connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
+    connect(trackView->projectView(), SIGNAL(zoomIn(bool)), this, \
SLOT(slotZoomIn(bool))); +    connect(trackView->projectView(), \
                SIGNAL(zoomOut(bool)), this, SLOT(slotZoomOut(bool)));
     connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int)));
     connect(trackView, SIGNAL(displayMessage(QString,MessageType)), m_messageLabel, \
                SLOT(setMessage(QString,MessageType)));
     connect(trackView->projectView(), SIGNAL(displayMessage(QString,MessageType)), \
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 = qMax(m_zoomSlider->minimum(), value);
-    value = qMin(m_zoomSlider->maximum(), value);
+    value = 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 the moment. \
                */
-    void slotSetZoom(int value);
+    void slotSetZoom(int value, bool zoomOnMouse = false);
     /** @brief Decreases the timeline zoom level by 1. */
-    void slotZoomIn();
+    void slotZoomIn(bool zoomOnMouse = false);
     /** @brief Increases the timeline zoom level by 1. */
-    void slotZoomOut();
+    void slotZoomOut(bool zoomOnMouse = 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/customtrackview.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 SpacerManager(this, \
                m_commandStack));
     m_toolManagers.insert(AbstractToolManager::ResizeType, new ResizeManager(this, \
                m_commandStack));
-    
+
     AbstractToolManager *razorManager = new RazorManager(this, m_commandStack);
     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() == Qt::ControlModifier) {
         if (m_moveOpMode == None || m_moveOpMode == WaitingForConfirm || \
                m_moveOpMode == 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() == Qt::AltModifier) {
         if (m_moveOpMode == None || m_moveOpMode == WaitingForConfirm || \
m_moveOpMode == 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, bool \
zoomOnMouse)  {
 
     QMatrix newmatrix;
+    int lastMousePos = getMousePos();
     newmatrix = newmatrix.scale(scaleFactor, verticalScale);
     m_scene->isZooming = true;
     m_scene->setScale(scaleFactor, verticalScale);
@@ -5900,7 +5901,14 @@ void CustomTrackView::setScale(double scaleFactor, double \
                verticalScale)
             setSceneRect(0, 0, (m_projectDuration + 300), sceneRect().height());
     }
     double verticalPos = mapToScene(QPoint(0, viewport()->height() / 2)).y();
-    centerOn(QPointF(cursorPos(), verticalPos));
+    if (zoomOnMouse) {
+        // Zoom on mouse position
+        centerOn(QPointF(lastMousePos, verticalPos));
+        int diff = scaleFactor * (getMousePos() - lastMousePos);
+        horizontalScrollBar()->setValue(horizontalScrollBar()->value() - diff);
+    } else {
+        centerOn(QPointF(cursorPos(), verticalPos));
+    }
     m_currentToolManager->updateTimelineItems();
     m_scene->isZooming = 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 = true);
     void addMarker(const QString &id, const CommentedTime &marker);
     void addData(const QString &id, const QString &key, const QString &data);
-    void setScale(double scaleFactor, double verticalScale);
+    void setScale(double scaleFactor, double verticalScale, bool zoomOnMouse = \
false);  void deleteClip(const QString &clipId, QUndoCommand *deleteCommand);
     /** @brief An effect was dropped on @param clip */
     void slotDropEffect(ClipItem *clip, QDomElement effect, GenTime pos, int 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 zoomOnMouse)
 {
     m_ruler->setPixelPerMark(horizontal);
     m_scale = (double) m_trackview->getFrameWidth() / \
m_ruler->comboScale[horizontal]; @@ -576,7 +576,7 @@ void \
Timeline::slotChangeZoom(int horizontal, int vertical)  if (vertical == -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 = vertical;
         if (m_verticalZoom == 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 = -1);
+    void slotChangeZoom(int horizontal, int vertical = -1, bool zoomOnMouse = \
false);  void setDuration(int dur);
     void slotSetZone(const QPoint &p, bool updateDocumentProperties = true);
     /** @brief Save a snapshot image of current timeline view */


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic