From 50f593828ee4b83d1694207476c77135045b314b Mon Sep 17 00:00:00 2001 From: Till Theato Date: Sat, 1 Jan 2011 22:41:35 +0000 Subject: [PATCH] Bezier Spline Widget: Make it possible to zoom out (because handles can have values out of the range 0-1 (0-255)) svn path=/trunk/kdenlive/; revision=5235 --- src/beziercurve/beziersplineeditor.cpp | 62 +++++++++++++++++++------- src/beziercurve/beziersplineeditor.h | 5 +++ src/beziercurve/beziersplinewidget.cpp | 5 +++ src/widgets/bezierspline_ui.ui | 39 ++++++++++++++-- 4 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/beziercurve/beziersplineeditor.cpp b/src/beziercurve/beziersplineeditor.cpp index 94cbbdaf..9846ee1f 100644 --- a/src/beziercurve/beziersplineeditor.cpp +++ b/src/beziercurve/beziersplineeditor.cpp @@ -25,6 +25,7 @@ BezierSplineEditor::BezierSplineEditor(QWidget* parent) : QWidget(parent), + m_zoomLevel(0), m_mode(ModeNormal), m_currentPointIndex(-1) { @@ -64,6 +65,18 @@ void BezierSplineEditor::updateCurrentPoint(const BPoint& p) } } +void BezierSplineEditor::slotZoomIn() +{ + m_zoomLevel = qMax(m_zoomLevel-1, 0); + update(); +} + +void BezierSplineEditor::slotZoomOut() +{ + m_zoomLevel = qMin(m_zoomLevel+1, 3); + update(); +} + void BezierSplineEditor::paintEvent(QPaintEvent* event) { Q_UNUSED(event); @@ -72,8 +85,11 @@ void BezierSplineEditor::paintEvent(QPaintEvent* event) p.fillRect(rect(), palette().background()); - int wWidth = width() - 1; - int wHeight = height() - 1; + int wWidth = width() - 1; + int wHeight = height() - 1; + int offset = 1/8. * m_zoomLevel * (wWidth > wHeight ? wWidth : wHeight); + wWidth -= 2 * offset; + wHeight -= 2 * offset; /* * Standard line @@ -94,19 +110,19 @@ void BezierSplineEditor::paintEvent(QPaintEvent* event) for (x = 0 ; x < wWidth ; ++x) { normalizedX = x / (double)wWidth; curY = wHeight - m_spline.value(normalizedX, true) * wHeight; - + /* * Keep in mind that QLineF rounds doubles * to ints mathematically, not just rounds down * like in C */ p.drawLine(QLineF(prevX, prevY, - x, curY)); + x, curY).translated(offset, offset)); prevX = x; prevY = curY; } p.drawLine(QLineF(prevX, prevY , - x, wHeight - m_spline.value(1.0, true) * wHeight)); + x, wHeight - m_spline.value(1.0, true) * wHeight).translated(offset, offset)); /* * Points + Handles @@ -123,14 +139,14 @@ void BezierSplineEditor::paintEvent(QPaintEvent* event) point = m_spline.points().at(i); if (i == m_currentPointIndex) { p.setBrush(QBrush(QColor(Qt::red), Qt::SolidPattern)); - p.drawLine(QLineF(point.h1.x() * wWidth, wHeight - point.h1.y() * wHeight, point.p.x() * wWidth, wHeight - point.p.y() * wHeight)); - p.drawLine(QLineF(point.p.x() * wWidth, wHeight - point.p.y() * wHeight, point.h2.x() * wWidth, wHeight - point.h2.y() * wHeight)); + p.drawLine(QLineF(point.h1.x() * wWidth, wHeight - point.h1.y() * wHeight, point.p.x() * wWidth, wHeight - point.p.y() * wHeight).translated(offset, offset)); + p.drawLine(QLineF(point.p.x() * wWidth, wHeight - point.p.y() * wHeight, point.h2.x() * wWidth, wHeight - point.h2.y() * wHeight).translated(offset, offset)); } p.drawEllipse(QRectF(point.p.x() * wWidth - 3, - wHeight - 3 - point.p.y() * wHeight, 6, 6)); - p.drawConvexPolygon(handle.translated(point.h1.x() * wWidth, wHeight - point.h1.y() * wHeight)); - p.drawConvexPolygon(handle.translated(point.h2.x() * wWidth, wHeight - point.h2.y() * wHeight)); + wHeight - 3 - point.p.y() * wHeight, 6, 6).translated(offset, offset)); + p.drawConvexPolygon(handle.translated(point.h1.x() * wWidth, wHeight - point.h1.y() * wHeight).translated(offset, offset)); + p.drawConvexPolygon(handle.translated(point.h2.x() * wWidth, wHeight - point.h2.y() * wHeight).translated(offset, offset)); if ( i == m_currentPointIndex) p.setBrush(QBrush(Qt::NoBrush)); @@ -145,11 +161,17 @@ void BezierSplineEditor::resizeEvent(QResizeEvent* event) void BezierSplineEditor::mousePressEvent(QMouseEvent* event) { - double x = event->pos().x() / (double)(width() - 1); - double y = 1.0 - event->pos().y() / (double)(height() - 1); + int wWidth = width() - 1; + int wHeight = height() - 1; + int offset = 1/8. * m_zoomLevel * (wWidth > wHeight ? wWidth : wHeight); + wWidth -= 2 * offset; + wHeight -= 2 * offset; + + double x = (event->pos().x() - offset) / (double)(wWidth); + double y = 1.0 - (event->pos().y() - offset) / (double)(wHeight); point_types selectedPoint; - int closestPointIndex = nearestPointInRange(QPointF(x, y), width(), height(), &selectedPoint); + int closestPointIndex = nearestPointInRange(QPointF(x, y), wWidth, wHeight, &selectedPoint); if (event->button() == Qt::RightButton && closestPointIndex > 0 && closestPointIndex < m_spline.points().count() - 1 && selectedPoint == PTypeP) { m_spline.removePoint(closestPointIndex); @@ -232,12 +254,18 @@ void BezierSplineEditor::mouseReleaseEvent(QMouseEvent* event) void BezierSplineEditor::mouseMoveEvent(QMouseEvent* event) { - double x = event->pos().x() / (double)(width() - 1); - double y = 1.0 - event->pos().y() / (double)(height() - 1); + int wWidth = width() - 1; + int wHeight = height() - 1; + int offset = 1/8. * m_zoomLevel * (wWidth > wHeight ? wWidth : wHeight); + wWidth -= 2 * offset; + wHeight -= 2 * offset; + + double x = (event->pos().x() - offset) / (double)(wWidth); + double y = 1.0 - (event->pos().y() - offset) / (double)(wHeight); if (m_mode == ModeNormal) { // If no point is selected set the the cursor shape if on top point_types type; - int nearestPointIndex = nearestPointInRange(QPointF(x, y), width(), height(), &type); + int nearestPointIndex = nearestPointInRange(QPointF(x, y), wWidth, wHeight, &type); if (nearestPointIndex < 0) setCursor(Qt::ArrowCursor); @@ -378,7 +406,7 @@ int BezierSplineEditor::nearestPointInRange(QPointF p, int wWidth, int wHeight, case PTypeH2: p2 = point.h2; } - if (qAbs(p.x() - p2.x()) * (wWidth - 1) < 5 && qAbs(p.y() - p2.y()) * (wHeight - 1) < 5) { + if (qAbs(p.x() - p2.x()) * wWidth < 5 && qAbs(p.y() - p2.y()) * wHeight < 5) { *sel = selectedPoint; return nearestIndex; } diff --git a/src/beziercurve/beziersplineeditor.h b/src/beziercurve/beziersplineeditor.h index 1c8229d0..68fb7b6e 100644 --- a/src/beziercurve/beziersplineeditor.h +++ b/src/beziercurve/beziersplineeditor.h @@ -37,6 +37,10 @@ public: BPoint getCurrentPoint(); void updateCurrentPoint(const BPoint &p); +public slots: + void slotZoomIn(); + void slotZoomOut(); + protected: //void keyPressEvent(QKeyEvent *event); void paintEvent(QPaintEvent *event); @@ -51,6 +55,7 @@ private: enum modes { ModeDrag, ModeNormal }; enum point_types { PTypeH1, PTypeP, PTypeH2 }; modes m_mode; + int m_zoomLevel; int m_currentPointIndex; point_types m_currentPointType; double m_grabOffsetX; diff --git a/src/beziercurve/beziersplinewidget.cpp b/src/beziercurve/beziersplinewidget.cpp index e784e044..b2491c75 100644 --- a/src/beziercurve/beziersplinewidget.cpp +++ b/src/beziercurve/beziersplinewidget.cpp @@ -33,6 +33,8 @@ BezierSplineWidget::BezierSplineWidget(const QString& spline, QWidget* parent) : m_ui.buttonLinkHandles->setIcon(KIcon("insert-link")); m_ui.buttonLinkHandles->setEnabled(false); + m_ui.buttonZoomIn->setIcon(KIcon("zoom-in")); + m_ui.buttonZoomOut->setIcon(KIcon("zoom-out")); m_ui.widgetPoint->setEnabled(false); CubicBezierSpline s; @@ -48,6 +50,9 @@ BezierSplineWidget::BezierSplineWidget(const QString& spline, QWidget* parent) : connect(m_ui.spinH1Y, SIGNAL(editingFinished()), this, SLOT(slotUpdateSpline())); connect(m_ui.spinH2X, SIGNAL(editingFinished()), this, SLOT(slotUpdateSpline())); connect(m_ui.spinH2Y, SIGNAL(editingFinished()), this, SLOT(slotUpdateSpline())); + + connect(m_ui.buttonZoomIn, SIGNAL(clicked()), &m_edit, SLOT(slotZoomIn())); + connect(m_ui.buttonZoomOut, SIGNAL(clicked()), &m_edit, SLOT(slotZoomOut())); } QString BezierSplineWidget::spline() diff --git a/src/widgets/bezierspline_ui.ui b/src/widgets/bezierspline_ui.ui index 6e9f4cb8..e0cbb66a 100644 --- a/src/widgets/bezierspline_ui.ui +++ b/src/widgets/bezierspline_ui.ui @@ -6,15 +6,15 @@ 0 0 - 471 - 84 + 336 + 94 Form - + @@ -199,6 +199,39 @@ + + + + ... + + + true + + + + + + + ... + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + -- 2.39.2