mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-14 08:38:45 +00:00
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.
125 lines
3.3 KiB
C++
125 lines
3.3 KiB
C++
#include <stdlib.h>
|
|
#include <qpen.h>
|
|
#include <qwt_plot_layout.h>
|
|
#include <qwt_legend.h>
|
|
#include <qwt_legend_item.h>
|
|
#include <qwt_plot_grid.h>
|
|
#include <qwt_plot_histogram.h>
|
|
#include <qwt_column_symbol.h>
|
|
#include <qwt_series_data.h>
|
|
#include "tvplot.h"
|
|
|
|
class Histogram: public QwtPlotHistogram
|
|
{
|
|
public:
|
|
Histogram(const QString &, const QColor &);
|
|
|
|
void setColor(const QColor &);
|
|
void setValues(uint numValues, const double *);
|
|
};
|
|
|
|
Histogram::Histogram(const QString &title, const QColor &symbolColor):
|
|
QwtPlotHistogram(title)
|
|
{
|
|
setStyle(QwtPlotHistogram::Columns);
|
|
|
|
setColor(symbolColor);
|
|
}
|
|
|
|
void Histogram::setColor(const QColor &symbolColor)
|
|
{
|
|
QColor color = symbolColor;
|
|
color.setAlpha(180);
|
|
|
|
setPen(QPen(Qt::black));
|
|
setBrush(QBrush(color));
|
|
|
|
QwtColumnSymbol *symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
|
|
symbol->setFrameStyle(QwtColumnSymbol::Raised);
|
|
symbol->setLineWidth(2);
|
|
symbol->setPalette(QPalette(color));
|
|
setSymbol(symbol);
|
|
}
|
|
|
|
void Histogram::setValues(uint numValues, const double *values)
|
|
{
|
|
QVector<QwtIntervalSample> samples(numValues);
|
|
for ( uint i = 0; i < numValues; i++ )
|
|
{
|
|
QwtInterval interval(double(i), i + 1.0);
|
|
interval.setBorderFlags(QwtInterval::ExcludeMaximum);
|
|
|
|
samples[i] = QwtIntervalSample(values[i], interval);
|
|
}
|
|
|
|
setData(new QwtIntervalSeriesData(samples));
|
|
}
|
|
|
|
TVPlot::TVPlot(QWidget *parent):
|
|
QwtPlot(parent)
|
|
{
|
|
setTitle("Watching TV during a weekend");
|
|
|
|
setCanvasBackground(QColor(Qt::gray));
|
|
plotLayout()->setAlignCanvasToScales(true);
|
|
|
|
setAxisTitle(QwtPlot::yLeft, "Number of People");
|
|
setAxisTitle(QwtPlot::xBottom, "Number of Hours");
|
|
|
|
QwtLegend *legend = new QwtLegend;
|
|
legend->setItemMode(QwtLegend::CheckableItem);
|
|
insertLegend(legend, QwtPlot::RightLegend);
|
|
|
|
populate();
|
|
|
|
connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)),
|
|
SLOT(showItem(QwtPlotItem *, bool)));
|
|
|
|
replot(); // creating the legend items
|
|
|
|
QwtPlotItemList items = itemList(QwtPlotItem::Rtti_PlotHistogram);
|
|
for ( int i = 0; i < items.size(); i++ )
|
|
{
|
|
if ( i == 0 )
|
|
{
|
|
QwtLegendItem *legendItem = (QwtLegendItem *)legend->find(items[i]);
|
|
if ( legendItem )
|
|
legendItem->setChecked(true);
|
|
items[i]->setVisible(true);
|
|
}
|
|
else
|
|
items[i]->setVisible(false);
|
|
}
|
|
|
|
setAutoReplot(true);
|
|
}
|
|
|
|
void TVPlot::populate()
|
|
{
|
|
QwtPlotGrid *grid = new QwtPlotGrid;
|
|
grid->enableX(false);
|
|
grid->enableY(true);
|
|
grid->enableXMin(false);
|
|
grid->enableYMin(false);
|
|
grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine));
|
|
grid->attach(this);
|
|
|
|
const double juneValues[] = { 7, 19, 24, 32, 10, 5, 3 };
|
|
const double novemberValues[] = { 4, 15, 22, 34, 13, 8, 4 };
|
|
|
|
Histogram *histogramJune = new Histogram("Summer", Qt::red);
|
|
histogramJune->setValues(
|
|
sizeof(juneValues) / sizeof(double), juneValues);
|
|
histogramJune->attach(this);
|
|
|
|
Histogram *histogramNovember = new Histogram("Winter", Qt::blue);
|
|
histogramNovember->setValues(
|
|
sizeof(novemberValues) / sizeof(double), novemberValues);
|
|
histogramNovember->attach(this);
|
|
}
|
|
|
|
void TVPlot::showItem(QwtPlotItem *item, bool on)
|
|
{
|
|
item->setVisible(on);
|
|
}
|