diff --git a/Canvas.cpp b/Canvas.cpp index dc3205c..c853cf3 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -49,6 +49,26 @@ void Canvas::changeMode(Mode _mode) mode = _mode; } +void Canvas::zoomIn() +{ + scaleFactor += ZOOM_STEP; + update(); +} + +void Canvas::zoomOut() +{ + scaleFactor -= ZOOM_STEP; + if (scaleFactor < 0.1) // Минимальный масштаб 10% + scaleFactor = 0.1; + update(); +} + +void Canvas::zoomReset() +{ + scaleFactor = 1.0; + update(); +} + // =================================================================== // Методы поиска и проверки // =================================================================== @@ -567,7 +587,7 @@ void Canvas::paintEvent(QPaintEvent* event) QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); p.translate(width() / 2.0, height() / 2.0); - p.scale(1.0, -1.0); + p.scale(scaleFactor, -scaleFactor); p.setPen(Qt::red); p.drawLine(-5, 0, 5, 0); @@ -680,7 +700,14 @@ void Canvas::keyPressEvent(QKeyEvent* event) } break; } + + case Qt::Key_Plus: + zoomIn(); + break; + case Qt::Key_Minus: + zoomOut(); + break; default: QWidget::keyPressEvent(event); } @@ -717,7 +744,8 @@ QPointF Canvas::screenToLogical(const QPointF& screenPos) const logical.rx() -= width() / 2.0; logical.ry() -= height() / 2.0; - logical.ry() = -logical.ry(); + logical.rx() /= scaleFactor; + logical.ry() /= -scaleFactor; return logical; } diff --git a/Canvas.h b/Canvas.h index 323bf49..f7859e2 100644 --- a/Canvas.h +++ b/Canvas.h @@ -1,5 +1,6 @@ #pragma once constexpr auto EPS = 1e-9; +constexpr auto ZOOM_STEP = 0.05; #include #include @@ -54,6 +55,15 @@ public: /// Изменить текущий режим работы void changeMode(Mode newMode); + /// Увеличить масштаб + void zoomIn(); + + /// Уменьшить масштаб + void zoomOut(); + + /// Сбросить масштаб к 100% + void zoomReset(); + protected: // Обработчики событий Qt void mousePressEvent(QMouseEvent* event) override; @@ -132,6 +142,7 @@ private: // ====================== Флаги состояния ====================== bool after_constraint{ false }; ///< Флаг, что только что добавлено ограничение + double scaleFactor { 1.0 }; // ====================== Счётчики ======================