mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
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.
This commit is contained in:
146
qwt/examples/navigation/plot.cpp
Normal file
146
qwt/examples/navigation/plot.cpp
Normal file
@@ -0,0 +1,146 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user