Changeset - 07202c91eec0
[Not reviewed]
scalezoomer
0 4 0
Hasan Yavuz Ă–ZDERYA - 10 years ago 2015-08-27 08:46:48
hy@ozderya.net
use QwtWidgetOverlay for drawing picker overlay
4 files changed with 58 insertions and 41 deletions:
0 comments (0 inline, 0 general)
scalepicker.cpp
Show inline comments
 
@@ -16,27 +16,51 @@
 
  You should have received a copy of the GNU General Public License
 
  along with serialplot.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#include <QEvent>
 
#include <QMouseEvent>
 
#include <QPainter>
 
#include <qwt_scale_widget.h>
 
#include <qwt_scale_map.h>
 
#include <QtDebug>
 
#include <math.h>
 

	
 
#include "scalepicker.h"
 

	
 
// minimum size for pick (in pixels)
 
#define MIN_PICK_SIZE (2)
 

	
 
ScalePicker::ScalePicker(QwtScaleWidget* scaleWidget) :
 
class ScalePickerOverlay : public QwtWidgetOverlay
 
{
 
public:
 
    ScalePickerOverlay(QWidget* widget, ScalePicker* picker);
 

	
 
protected:
 
    virtual void drawOverlay(QPainter*) const;
 

	
 
private:
 
    ScalePicker* _picker;
 
};
 

	
 
ScalePickerOverlay::ScalePickerOverlay(QWidget* widget, ScalePicker* picker) :
 
    QwtWidgetOverlay(widget)
 
{
 
    _picker = picker;
 
}
 

	
 
void ScalePickerOverlay::drawOverlay(QPainter* painter) const
 
{
 
    _picker->drawOverlay(painter);
 
}
 

	
 
ScalePicker::ScalePicker(QwtScaleWidget* scaleWidget, QWidget* canvas) :
 
    QObject(scaleWidget)
 
{
 
    scaleWidget->installEventFilter(this);
 
    _scaleWidget = scaleWidget;
 
    pickerOverlay = new ScalePickerOverlay(canvas, this);
 
    started = false;
 
    pressed = false;
 
}
 

	
 
bool ScalePicker::eventFilter(QObject* object, QEvent* event)
 
{
 
@@ -44,12 +68,13 @@ bool ScalePicker::eventFilter(QObject* o
 
        event->type() == QEvent::MouseButtonRelease ||
 
        event->type() == QEvent::MouseMove)
 
    {
 
        QMouseEvent* mouseEvent = (QMouseEvent*) event;
 
        double pos = this->position(mouseEvent);
 
        double posPx = this->positionPx(mouseEvent);
 
        currentPosPx = posPx;
 

	
 
        if (event->type() == QEvent::MouseButtonPress &&
 
            mouseEvent->button() == Qt::LeftButton)
 
        {
 
            pressed = true; // not yet started
 
            firstPos = pos;
 
@@ -59,39 +84,59 @@ bool ScalePicker::eventFilter(QObject* o
 
        {
 
            // make sure pick size is big enough, so that just
 
            // clicking won't trigger pick
 
            if (!started && pressed && (fabs(posPx-firstPosPx) > MIN_PICK_SIZE))
 
            {
 
                started = true;
 
                qDebug() << "Pick started:" << firstPos;
 
                // pickerOverlay->updateOverlay();
 
                emit pickStarted(pos);
 
            }
 
            else if (started)
 
            {
 
                pickerOverlay->updateOverlay();
 
                emit picking(firstPos, pos);
 
            }
 
        }
 
        else // event->type() == QEvent::MouseButtonRelease
 
        {
 
            if (started)
 
            {
 
                // finalize
 
                started = false;
 
                pressed = false;
 
                qDebug() << "Picked:" << firstPos << pos;
 
                emit picked(firstPos, pos);
 
            }
 
        }
 
        return true;
 
    }
 
    else
 
    {
 
        return QObject::eventFilter(object, event);
 
    }
 
}
 

	
 
void ScalePicker::drawOverlay(QPainter* painter)
 
{
 
    if (started)
 
    {
 
        QRect rect;
 
        if (_scaleWidget->alignment() == QwtScaleDraw::BottomScale ||
 
            _scaleWidget->alignment() == QwtScaleDraw::TopScale)
 
        {
 
            int height = painter->device()->height();
 
            rect = QRect(firstPosPx, 0, (currentPosPx-firstPosPx), height);
 
        }
 
        else // vertical
 
        {
 
            int width = painter->device()->width();
 
            rect = QRect(0, firstPosPx, width, (currentPosPx-firstPosPx));
 
        }
 
        painter->drawRect(rect);
 
    }
 
}
 

	
 
double ScalePicker::position(QMouseEvent* mouseEvent)
 
{
 
    double pos;
 
    pos = positionPx(mouseEvent);
 
    // convert the position of the click to the plot coordinates
 
    pos = _scaleWidget->scaleDraw()->scaleMap().invTransform(pos);
scalepicker.h
Show inline comments
 
@@ -19,34 +19,38 @@
 

	
 
#ifndef SCALEPICKER_H
 
#define SCALEPICKER_H
 

	
 
#include <QObject>
 
#include <QMouseEvent>
 
#include <QPointF>
 
#include <qwt_scale_widget.h>
 
#include <qwt_widget_overlay.h>
 

	
 
class ScalePicker : public QObject
 
{
 
    Q_OBJECT
 

	
 
public:
 
    ScalePicker(QwtScaleWidget* scaleWidget);
 
    ScalePicker(QwtScaleWidget* scaleWidget, QWidget* canvas);
 
    virtual bool eventFilter(QObject*, QEvent*);
 

	
 
    void drawOverlay(QPainter*); // called from ScalePickerOverlay
 

	
 
signals:
 
    void pickStarted(double pos);
 
    void picking(double firstPos, double lastPos);
 
    void picked(double firstPos, double lastPos);
 

	
 
private:
 
    QwtScaleWidget* _scaleWidget;
 
    QwtWidgetOverlay* pickerOverlay; // ScalePickerOverlay
 
    double position(QMouseEvent*); // returns the axis mouse position relative to plot coordinates
 
    double positionPx(QMouseEvent*); // returns the axis mouse position in pixels
 

	
 
    bool pressed;
 
    bool started;
 
    double firstPos; // converted to plot coordinates
 
    double firstPosPx; // pixel coordinates
 
    double currentPosPx; // current position in pixel coordinates
 
};
 

	
 
#endif // SCALEPICKER_H
scalezoomer.cpp
Show inline comments
 
@@ -15,51 +15,26 @@
 

	
 
  You should have received a copy of the GNU General Public License
 
  along with serialplot.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#include <QRectF>
 
#include <QtDebug>
 

	
 
#include "scalezoomer.h"
 

	
 
ScaleZoomer::ScaleZoomer(QwtPlot* plot, QwtPlotZoomer* zoomer) :
 
    QObject(plot),
 
    bottomPicker(plot->axisWidget(QwtPlot::xBottom)),
 
    leftPicker(plot->axisWidget(QwtPlot::yLeft))
 
    bottomPicker(plot->axisWidget(QwtPlot::xBottom), plot->canvas()),
 
    leftPicker(plot->axisWidget(QwtPlot::yLeft), plot->canvas())
 
{
 
    _plot = plot;
 
    _zoomer = zoomer;
 
    connect(&bottomPicker, &ScalePicker::pickStarted, this, &ScaleZoomer::bottomPickStarted);
 
    connect(&bottomPicker, &ScalePicker::picking, this, &ScaleZoomer::bottomPicking);
 
    connect(&bottomPicker, &ScalePicker::picked, this, &ScaleZoomer::bottomPicked);
 
    connect(&leftPicker, &ScalePicker::picked, this, &ScaleZoomer::leftPicked);
 
}
 

	
 
void ScaleZoomer::bottomPickStarted(double firstPos)
 
{
 
    double yMin = _plot->axisScaleDiv(QwtPlot::yLeft).lowerBound();
 
    double yMax = _plot->axisScaleDiv(QwtPlot::yLeft).upperBound();
 
    rectShape.setRect(QRectF(firstPos, yMin, 2, yMax-yMin));
 
    rectShape.attach(_plot);
 
    _plot->replot();
 
}
 

	
 
void ScaleZoomer::bottomPicking(double firstPos, double lastPos)
 
{
 
    double yMin = _plot->axisScaleDiv(QwtPlot::yLeft).lowerBound();
 
    double yMax = _plot->axisScaleDiv(QwtPlot::yLeft).upperBound();
 
    if (lastPos > firstPos) {
 
        rectShape.setRect(QRectF(firstPos, yMin, lastPos-firstPos, yMax-yMin));
 
    }
 
    else
 
    {
 
        rectShape.setRect(QRectF(lastPos, yMin, firstPos-lastPos, yMax-yMin));
 
    }
 
    _plot->replot();
 
}
 

	
 
void ScaleZoomer::bottomPicked(double firstPos, double lastPos)
 
{
 
    QRectF zRect;
 
    if (lastPos > firstPos)
 
    {
 
        zRect.setLeft(firstPos);
 
@@ -71,14 +46,12 @@ void ScaleZoomer::bottomPicked(double fi
 
        zRect.setRight(firstPos);
 
    }
 

	
 
    zRect.setBottom(_plot->axisScaleDiv(QwtPlot::yLeft).lowerBound());
 
    zRect.setTop(_plot->axisScaleDiv(QwtPlot::yLeft).upperBound());
 
    _zoomer->zoom(zRect);
 
    rectShape.detach();
 
    _plot->replot();
 
}
 

	
 
void ScaleZoomer::leftPicked(double firstPos, double lastPos)
 
{
 
    QRectF zRect;
 
    if (lastPos > firstPos)
scalezoomer.h
Show inline comments
 
@@ -20,13 +20,12 @@
 
#ifndef SCALEZOOMER_H
 
#define SCALEZOOMER_H
 

	
 
#include <QObject>
 
#include <qwt_plot.h>
 
#include <qwt_plot_zoomer.h>
 
#include <qwt_plot_shapeitem.h>
 

	
 
#include "scalepicker.h"
 

	
 
class ScaleZoomer : public QObject
 
{
 
    Q_OBJECT
 
@@ -37,16 +36,12 @@ public:
 
private:
 
    QwtPlot* _plot;
 
    QwtPlotZoomer* _zoomer;
 
    ScalePicker bottomPicker;
 
    ScalePicker leftPicker;
 

	
 
    QwtPlotShapeItem rectShape;
 

	
 
private slots:
 
    void bottomPickStarted(double firstPos);
 
    void bottomPicked(double firstPos, double lastPos);
 
    void bottomPicking(double firstPos, double lastPos);
 
    void leftPicked(double firstPos, double lastPos);
 
};
 

	
 
#endif /* SCALEZOOMER_H */
0 comments (0 inline, 0 general)