///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017- Statoil ASA // // ResInsight 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. // // ResInsight 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 at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RiuQwtPlotWheelZoomer.h" #include "qwt_plot.h" #include #include #define RIU_SCROLLWHEEL_ZOOMFACTOR 1.1 #define RIU_SCROLLWHEEL_PANFACTOR 0.1 //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiuQwtPlotWheelZoomer::RiuQwtPlotWheelZoomer(QwtPlot* plot): QObject(plot), m_plot(plot) { plot->canvas()->installEventFilter(this); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void zoomOnAxis(QwtPlot* plot, QwtPlot::Axis axis, double zoomFactor, int eventPos) { QwtScaleMap scaleMap = plot->canvasMap(axis); double zoomCenter = scaleMap.invTransform(eventPos); double newMin = zoomCenter - zoomFactor * (zoomCenter - scaleMap.s1()); double newMax = zoomCenter + zoomFactor * (-zoomCenter + scaleMap.s2()); plot->setAxisScale(axis, newMin, newMax); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RiuQwtPlotWheelZoomer::eventFilter(QObject * watched, QEvent * event) { QWheelEvent* wheelEvent = dynamic_cast(event); if ( wheelEvent ) { double zoomFactor = 1.0/RIU_SCROLLWHEEL_ZOOMFACTOR; if ( wheelEvent->delta() > 0 ) { zoomFactor = RIU_SCROLLWHEEL_ZOOMFACTOR; } zoomOnAxis(m_plot, QwtPlot::xBottom, zoomFactor, wheelEvent->pos().x()); zoomOnAxis(m_plot, QwtPlot::xTop, zoomFactor, wheelEvent->pos().x()); zoomOnAxis(m_plot, QwtPlot::yLeft, zoomFactor, wheelEvent->pos().y()); zoomOnAxis(m_plot, QwtPlot::yRight, zoomFactor, wheelEvent->pos().y()); m_plot->replot(); emit zoomUpdated(); } return false; }