]> git.sesse.net Git - kdenlive/commitdiff
Zoom through vertical move in timeline ruler:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 22 Sep 2009 17:26:31 +0000 (17:26 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 22 Sep 2009 17:26:31 +0000 (17:26 +0000)
http://kdenlive.org/mantis/view.php?id=1149

svn path=/trunk/kdenlive/; revision=3923

src/customruler.cpp
src/customruler.h
src/mainwindow.cpp
src/mainwindow.h
src/trackview.cpp
src/trackview.h

index 6897335549b2ab4bb6b985f152350c018f65057a..0d4eef4ebc849fad63ffc893c7b271b46b12623d 100644 (file)
@@ -24,6 +24,7 @@
 #include <KCursor>
 #include <KGlobalSettings>
 
+#include <QApplication>
 #include <QMouseEvent>
 #include <QStylePainter>
 
@@ -58,7 +59,8 @@ CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent) :
         m_view(parent),
         m_duration(0),
         m_offset(0),
-        m_clickedGuide(-1)
+        m_clickedGuide(-1),
+        m_mouseMove(NO_MOVE)
 {
     setFont(KGlobalSettings::toolBarFont());
     QFontMetricsF fontMetrics(font());
@@ -110,6 +112,11 @@ void CustomRuler::setZone(QPoint p)
     update(min * m_factor - 2, 0, (max - min) * m_factor + 4, height());
 }
 
+void CustomRuler::mouseReleaseEvent(QMouseEvent * event)
+{
+    m_mouseMove = NO_MOVE;
+}
+
 // virtual
 void CustomRuler::mousePressEvent(QMouseEvent * event)
 {
@@ -129,8 +136,11 @@ void CustomRuler::mousePressEvent(QMouseEvent * event)
         else if (qAbs(pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2) * m_factor) < 4) m_moveCursor = RULER_MIDDLE;
         else if (qAbs(pos - m_zoneEnd * m_factor) < 4) m_moveCursor = RULER_END;
     }
-    if (m_moveCursor == RULER_CURSOR)
+    if (m_moveCursor == RULER_CURSOR) {
         m_view->setCursorPos((int) pos / m_factor);
+        m_clickPoint = event->pos();
+        m_startRate = m_rate;
+    }
 }
 
 // virtual
@@ -142,8 +152,21 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event)
         int zoneEnd = m_zoneEnd;
         if (pos < 0) pos = 0;
         if (m_moveCursor == RULER_CURSOR) {
-            m_view->setCursorPos(pos);
-            m_view->slotCheckPositionScrolling();
+            QPoint diff = event->pos() - m_clickPoint;
+            if (m_mouseMove == NO_MOVE) {
+                if (qAbs(diff.x()) >= QApplication::startDragDistance()) {
+                    m_mouseMove = HORIZONTAL_MOVE;
+                } else if (qAbs(diff.y()) >= QApplication::startDragDistance()) {
+                    m_mouseMove = VERTICAL_MOVE;
+                } else return;
+            }
+            if (m_mouseMove == HORIZONTAL_MOVE) {
+                m_view->setCursorPos(pos);
+                m_view->slotCheckPositionScrolling();
+            } else {
+                int verticalDiff = m_startRate - (diff.y()) / 7;
+                if (verticalDiff != m_rate) emit adjustZoom(verticalDiff);
+            }
             return;
         } else if (m_moveCursor == RULER_START) m_zoneStart = pos;
         else if (m_moveCursor == RULER_END) m_zoneEnd = pos;
@@ -218,9 +241,10 @@ void CustomRuler::slotCursorMoved(int oldpos, int newpos)
     } else update(qMin(oldpos, newpos) * m_factor - offset() - 6, 0, qAbs(oldpos - newpos) * m_factor + 17, height());
 }
 
-void CustomRuler::setPixelPerMark(double rate)
+void CustomRuler::setPixelPerMark(int rate)
 {
-    int scale = comboScale[(int) rate];
+    int scale = comboScale[rate];
+    m_rate = rate;
     m_factor = 1.0 / (double) scale * FRAME_SIZE;
     m_scale = 1.0 / (double) scale;
     double fend = m_scale * littleMarkDistance;
@@ -237,7 +261,7 @@ void CustomRuler::setPixelPerMark(double rate)
         mediumMarkDistance = (double) FRAME_SIZE * m_timecode.fps();
         bigMarkDistance = (double) FRAME_SIZE * m_timecode.fps() * 60;
     }
-    switch ((int) rate) {
+    switch (rate) {
     case 0:
         m_textSpacing = fend;
         break;
index b7ac39782f7b61913efa6d47ec278dc256708f10..ffd6860e44b131cf711a051dc4f48634e356d3d2 100644 (file)
@@ -26,6 +26,7 @@
 #include "timecode.h"
 
 enum RULER_MOVE { RULER_CURSOR = 0, RULER_START = 1, RULER_MIDDLE = 2, RULER_END = 3 };
+enum MOUSE_MOVE { NO_MOVE = 0, HORIZONTAL_MOVE = 1, VERTICAL_MOVE = 2 };
 
 class CustomRuler : public QWidget
 {
@@ -33,7 +34,7 @@ class CustomRuler : public QWidget
 
 public:
     CustomRuler(Timecode tc, CustomTrackView *parent);
-    void setPixelPerMark(double rate);
+    void setPixelPerMark(int rate);
     static const int comboScale[];
     int outPoint() const;
     int inPoint() const;
@@ -46,6 +47,7 @@ protected:
     virtual void paintEvent(QPaintEvent * /*e*/);
     virtual void wheelEvent(QWheelEvent * e);
     virtual void mousePressEvent(QMouseEvent * event);
+    virtual void mouseReleaseEvent(QMouseEvent * event);
     virtual void mouseMoveEvent(QMouseEvent * event);
 
 private:
@@ -66,6 +68,12 @@ private:
     QAction *m_editGuide;
     QAction *m_deleteGuide;
     int m_clickedGuide;
+    /** Used for zooming through vertical move */
+    QPoint m_clickPoint;
+    int m_rate;
+    int m_startRate;
+    MOUSE_MOVE m_mouseMove;
+
 
 public slots:
     void slotMoveRuler(int newPos);
@@ -77,6 +85,7 @@ private slots:
 
 signals:
     void zoneMoved(int, int);
+    void adjustZoom(int);
 };
 
 #endif
index 669999422812694e0755741bb7778f1610695eb6..e362cf6c4626d7f793fb5fbbd3f7f784763e08df 100644 (file)
@@ -1827,6 +1827,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int)));
     connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
     connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
+    connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int)));
     connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
 
     connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int)));
@@ -2250,6 +2251,11 @@ void MainWindow::slotFitZoom()
     }
 }
 
+void MainWindow::slotSetZoom(int value)
+{
+    m_zoomSlider->setValue(value);
+}
+
 void MainWindow::slotGotProgressInfo(const QString &message, int progress)
 {
     m_statusProgressBar->setValue(progress);
index b1aa4a766c3816aae355c0e0f4d37626e4d4f627..3a46fad6acc8f60cdebc1cd308a2fb8c458e72ba 100644 (file)
@@ -313,6 +313,7 @@ private slots:
     /** Removes the focus of anything */
     void slotRemoveFocus();
     void slotCleanProject();
+    void slotSetZoom(int value);
 
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 0821bcb77aefe7c7b921bc113f839a48158999f6..6dd3824161e86fbb1368137bc5471560941ecfe6 100644 (file)
@@ -57,6 +57,7 @@ TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) :
 
     m_ruler = new CustomRuler(doc->timecode(), m_trackview);
     connect(m_ruler, SIGNAL(zoneMoved(int, int)), this, SIGNAL(zoneMoved(int, int)));
+    connect(m_ruler, SIGNAL(adjustZoom(int)), this, SIGNAL(setZoom(int)));
     QHBoxLayout *layout = new QHBoxLayout;
     layout->setContentsMargins(m_trackview->frameWidth(), 0, 0, 0);
     layout->setSpacing(0);
@@ -346,6 +347,7 @@ void TrackView::parseDocument(QDomDocument doc)
             transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps());
             transitionInfo.endPos = GenTime(e.attribute("out").toInt() + 1, m_doc->fps());
             transitionInfo.track = m_projectTracks - 1 - b_track;
+
             //kDebug() << "///////////////   +++++++++++  ADDING TRANSITION ON TRACK: " << b_track << ", TOTAL TRKA: " << m_projectTracks;
             if (transitionInfo.startPos >= transitionInfo.endPos) {
                 // invalid transition, remove it.
@@ -408,7 +410,7 @@ void TrackView::moveCursorPos(int pos)
 void TrackView::slotChangeZoom(int horizontal, int vertical)
 {
     m_ruler->setPixelPerMark(horizontal);
-    m_scale = (double) FRAME_SIZE / m_ruler->comboScale[horizontal]; // m_ruler->comboScale[m_currentZoom] /
+    m_scale = (double) FRAME_SIZE / m_ruler->comboScale[horizontal];
 
     if (vertical == -1) {
         // user called zoom
@@ -826,6 +828,7 @@ void TrackView::slotChangeTrackLock(int ix, bool lock)
     widgets.at(ix)->setLock(lock);
 }
 
+
 void TrackView::slotVerticalZoomDown()
 {
     if (m_verticalZoom == 0) return;
index d44b20cd99f864e1d2cb585fd3ebc2de8fa956f0..48d5c9ba33c951e9769a95ec83cc52dc60fe5822 100644 (file)
@@ -99,6 +99,7 @@ signals:
     void deleteTrack(int);
     void changeTrack(int);
     void renameTrack(int);
+    void setZoom(int);
 };
 
 #endif