]> git.sesse.net Git - kdenlive/blobdiff - src/customruler.cpp
Optimize seek requests
[kdenlive] / src / customruler.cpp
index a5b448689efc42766e6737727073d542c8103bb4..0e5fb1048c9d306c53325f2adfbc1c4f834dfc39 100644 (file)
@@ -59,7 +59,8 @@ CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent) :
         m_lastSeekPosition(SEEK_INACTIVE),
         m_clickedGuide(-1),
         m_rate(-1),
-        m_mouseMove(NO_MOVE)
+        m_mouseMove(NO_MOVE),
+        m_cursorColor(palette().text())
 {
     setFont(KGlobalSettings::toolBarFont());
     QFontMetricsF fontMetrics(font());
@@ -189,15 +190,17 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event)
         if (m_moveCursor == RULER_CURSOR) {
             QPoint diff = event->pos() - m_clickPoint;
             if (m_mouseMove == NO_MOVE) {
-                if (!KdenliveSettings::verticalzoom() || qAbs(diff.x()) >= QApplication::startDragDistance()) {
+                if (qAbs(diff.x()) >= QApplication::startDragDistance()) {
                     m_mouseMove = HORIZONTAL_MOVE;
-                } else if (qAbs(diff.y()) >= QApplication::startDragDistance()) {
+                } else if (KdenliveSettings::verticalzoom() && qAbs(diff.y()) >= QApplication::startDragDistance()) {
                     m_mouseMove = VERTICAL_MOVE;
                 } else return;
             }
             if (m_mouseMove == HORIZONTAL_MOVE) {
-                m_view->seekCursorPos(pos);
-                m_view->slotCheckPositionScrolling();
+               if (pos != m_lastSeekPosition && pos != m_view->cursorPos()) {
+                   m_view->seekCursorPos(pos);
+                   m_view->slotCheckPositionScrolling();
+               }
             } else {
                 int verticalDiff = m_startRate - (diff.y()) / 7;
                 if (verticalDiff != m_rate) emit adjustZoom(verticalDiff);
@@ -216,7 +219,17 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event)
         update(min * m_factor - m_offset - 2, 0, (max - min) * m_factor + 4, height());
 
     } else {
-        int pos = (int)((event->x() + offset()));
+        int pos = (int)((event->x() + m_offset));
+       if (m_cursorColor == palette().text() && qAbs(pos - m_view->cursorPos() * m_factor) < 7) {
+           // Mouse is over cursor
+           m_cursorColor = palette().highlight();
+           update(m_view->cursorPos() * m_factor - m_offset - 10, 0, 20, height());
+       }
+       else if (m_cursorColor == palette().highlight() && qAbs(pos - m_view->cursorPos() * m_factor) >= 7) {
+           m_cursorColor = palette().text();
+           update(m_view->cursorPos() * m_factor - m_offset - 10, 0, 20, height());
+       }
+       
         if (event->y() <= 10) setCursor(Qt::ArrowCursor);
         else if (qAbs(pos - m_zoneStart * m_factor) < 4) {
             setCursor(KCursor("left_side", Qt::SizeHorCursor));
@@ -239,6 +252,16 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event)
 }
 
 
+// virtual
+void CustomRuler::leaveEvent(QEvent * event)
+{
+    QWidget::leaveEvent(event);
+    if (m_cursorColor == palette().highlight()) {
+       m_cursorColor = palette().text();
+       update();
+    }
+}
+
 // virtual
 void CustomRuler::wheelEvent(QWheelEvent * e)
 {
@@ -271,10 +294,18 @@ int CustomRuler::offset() const
 
 void CustomRuler::slotCursorMoved(int oldpos, int newpos)
 {
-    if (qAbs(oldpos - newpos) * m_factor > m_textSpacing) {
-        update(oldpos * m_factor - offset() - 6, BIG_MARK_X, 14, MAX_HEIGHT - BIG_MARK_X);
-        update(newpos * m_factor - offset() - 6, BIG_MARK_X, 14, MAX_HEIGHT - BIG_MARK_X);
-    } else update(qMin(oldpos, newpos) * m_factor - offset() - 6, BIG_MARK_X, qAbs(oldpos - newpos) * m_factor + 14, MAX_HEIGHT - BIG_MARK_X);
+    int min = qMin(oldpos, newpos);
+    int max = qMax(oldpos, newpos);
+    if (m_lastSeekPosition != SEEK_INACTIVE) {
+       if (m_lastSeekPosition == newpos) {
+           m_lastSeekPosition = SEEK_INACTIVE;
+       }
+       else {
+           min = qMin(min, m_lastSeekPosition);
+           max = qMax(max, m_lastSeekPosition);
+       }
+    }
+    update(min * m_factor - m_offset - 6, BIG_MARK_X, (max - min) * m_factor + 14, MAX_HEIGHT - BIG_MARK_X);
 }
 
 void CustomRuler::updateRuler()
@@ -453,7 +484,7 @@ void CustomRuler::paintEvent(QPaintEvent *e)
     const int value  =  m_view->cursorPos() * m_factor - m_offset;
     QPolygon pa(3);
     pa.setPoints(3, value - 6, BIG_MARK_X, value + 6, BIG_MARK_X, value, MAX_HEIGHT - 1);
-    p.setBrush(palette().text());
+    p.setBrush(m_cursorColor);
     p.setPen(Qt::NoPen);
     p.drawPolygon(pa);