Files
GoldenCheetah/qwt/examples/navigation/plot.cpp
Damien c44758c5ad Qwt 6.0.1 Support
Upgrade to QWT 6.0.1, but still uses a locally patched copy
since support for 8 axes has not been included, despite it
being a relatively simple patch.

Fixes #634.
Fixes #567.
2012-02-12 10:43:15 +00:00

147 lines
3.5 KiB
C++

#include "plot.h"
#include <qglobal.h>
#include <qpainter.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_layout.h>
#include <qwt_interval.h>
#include <qwt_painter.h>
#include <qwt_plot_item.h>
class RectItem: public QwtPlotItem
{
public:
enum Type
{
Rect,
Ellipse
};
RectItem(Type type):
d_type(type)
{
}
void setPen(const QPen &pen)
{
if ( pen != d_pen )
{
d_pen = pen;
itemChanged();
}
}
void setBrush(const QBrush &brush)
{
if ( brush != d_brush )
{
d_brush = brush;
itemChanged();
}
}
void setRect(const QRectF &rect)
{
if ( d_rect != rect )
{
d_rect = rect;
itemChanged();
}
}
virtual QRectF boundingRect() const
{
return d_rect;
}
virtual void draw(QPainter *painter,
const QwtScaleMap &xMap, const QwtScaleMap &yMap,
const QRectF &) const
{
if ( d_rect.isValid() )
{
const QRectF rect = QwtScaleMap::transform(
xMap, yMap, d_rect);
painter->setPen(d_pen);
painter->setBrush(d_brush);
if ( d_type == Ellipse )
QwtPainter::drawEllipse(painter, rect);
else
QwtPainter::drawRect(painter, rect);
}
}
private:
QPen d_pen;
QBrush d_brush;
QRectF d_rect;
Type d_type;
};
Plot::Plot(QWidget *parent, const QwtInterval &interval):
QwtPlot(parent)
{
for ( int axis = 0; axis < QwtPlot::axisCnt; axis ++ )
setAxisScale(axis, interval.minValue(), interval.maxValue());
setCanvasBackground(QColor(Qt::darkBlue));
plotLayout()->setAlignCanvasToScales(true);
// grid
QwtPlotGrid *grid = new QwtPlotGrid;
//grid->enableXMin(true);
grid->setMajPen(QPen(Qt::white, 0, Qt::DotLine));
grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine));
grid->attach(this);
const int numEllipses = 10;
for ( int i = 0; i < numEllipses; i++ )
{
const double x = interval.minValue() +
qrand() % qRound(interval.width());
const double y = interval.minValue() +
qrand() % qRound(interval.width());
const double r = interval.minValue() +
qrand() % qRound(interval.width() / 6);
const QRectF area(x - r, y - r , 2 * r, 2 * r);
RectItem *item = new RectItem(RectItem::Ellipse);
item->setRenderHint(QwtPlotItem::RenderAntialiased, true);
item->setRect(area);
item->setPen(QPen(Qt::yellow));
item->attach(this);
}
d_rectOfInterest = new RectItem(RectItem::Rect);
d_rectOfInterest->setPen(Qt::NoPen);
QColor c = Qt::gray;
c.setAlpha(100);
d_rectOfInterest->setBrush(QBrush(c));
d_rectOfInterest->attach(this);
}
void Plot::updateLayout()
{
QwtPlot::updateLayout();
const QwtScaleMap xMap = canvasMap(QwtPlot::xBottom);
const QwtScaleMap yMap = canvasMap(QwtPlot::yLeft);
const QRect cr = canvas()->contentsRect();
const double x1 = xMap.invTransform(cr.left());
const double x2 = xMap.invTransform(cr.right());
const double y1 = yMap.invTransform(cr.bottom());
const double y2 = yMap.invTransform(cr.top());
const double xRatio = (x2 - x1) / cr.width();
const double yRatio = (y2 - y1) / cr.height();
Q_EMIT resized(xRatio, yRatio);
}
void Plot::setRectOfInterest(const QRectF &rect)
{
d_rectOfInterest->setRect(rect);
}