/* Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. serialplot is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. serialplot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with serialplot. If not, see . */ #include "zoomer.h" #include #include #include Zoomer::Zoomer(QWidget* widget, bool doReplot) : ScrollZoomer(widget) { is_panning = false; setTrackerMode(AlwaysOn); // set corner widget between the scrollbars with default background color auto cornerWidget = new QWidget(); auto bgColor = cornerWidget->palette().color(QPalette::Window).name(); auto styleSheet = QString("background-color:%1;").arg(bgColor); cornerWidget->setStyleSheet(styleSheet); ScrollZoomer::setCornerWidget(cornerWidget); } void Zoomer::zoom(int up) { ScrollZoomer::zoom(up); if(zoomRectIndex() == 0) { emit unzoomed(); } } void Zoomer::zoom( const QRectF & rect) { // set the zoom base when user zooms in to first level if (zoomRectIndex() == 0) { this->setZoomBase(false); } ScrollZoomer::zoom(rect); } QwtText Zoomer::trackerTextF(const QPointF& pos) const { QwtText b = ScrollZoomer::trackerTextF(pos); const QPolygon pa = selection(); if (!isActive() || pa.count() < 2) { return b; } const QRectF rect = invTransform(QRect(pa.first(), pa.last()).normalized()); QString sizeText = QString(" [%1, %2]").\ arg(rect.width(), 0, 'g', 4).\ arg(rect.height(), 0, 'g', 4); b.setText(b.text() + sizeText); return b; } void Zoomer::drawRubberBand(QPainter* painter) const { const double FILL_ALPHA = 0.2; QColor color = painter->pen().color(); color.setAlphaF(FILL_ALPHA); painter->setBrush(color); ScrollZoomer::drawRubberBand(painter); } QRegion Zoomer::rubberBandMask() const { const QPolygon pa = selection(); if (pa.count() < 2) { return QRegion(); } const QRect r = QRect(pa.first(), pa.last()).normalized().adjusted(0, 0, 1, 1); return QRegion(r); } void Zoomer::widgetMousePressEvent(QMouseEvent* mouseEvent) { if (mouseEvent->modifiers() & Qt::ControlModifier) { is_panning = true; parentWidget()->setCursor(Qt::ClosedHandCursor); pan_point = invTransform(mouseEvent->pos()); } else { ScrollZoomer::widgetMousePressEvent(mouseEvent); } } void Zoomer::widgetMouseMoveEvent(QMouseEvent* mouseEvent) { if (is_panning) { auto cur_point = invTransform(mouseEvent->pos()); auto delta = cur_point - pan_point; moveBy(-delta.x(), -delta.y()); pan_point = invTransform(mouseEvent->pos()); } else { ScrollZoomer::widgetMouseMoveEvent(mouseEvent); } } void Zoomer::widgetMouseReleaseEvent(QMouseEvent* mouseEvent) { if (is_panning) { is_panning = false; parentWidget()->setCursor(Qt::CrossCursor); } else { ScrollZoomer::widgetMouseReleaseEvent(mouseEvent); } }