diff -r 8c5364450a46 -r 04f1ac8a931b src/RelpipeChartWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/RelpipeChartWidget.h Sun Nov 18 00:38:49 2018 +0100 @@ -0,0 +1,90 @@ +#pragma once + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include +#include +#include + +#include "RelpipeTableModel.h" + +using namespace relpipe::reader; +using namespace relpipe::reader::handlers; + +QT_CHARTS_USE_NAMESPACE + +class RelpipeChartWidget : public QWidget { + Q_OBJECT +private: + RelpipeTableModel* model; + + QGridLayout* layout; + QChart* chart; + QChartView* chartView; + QVBarModelMapper* mapper; + QStackedBarSeries* series; + QBarCategoryAxis* axis; + + boolean_t isNumeric(TypeId typeId) { + return typeId == TypeId::INTEGER; + } + + int firstValueColumn() { + int first = lastValueColumn(); + for (int i = first; i > 0; i--) if (isNumeric(model->attributeType(i))) first = i; else break; + return first; + } + + int lastValueColumn() { + return model->columnCount() - 1; + } + +public: + + RelpipeChartWidget(RelpipeTableModel* model, QWidget* parent = Q_NULLPTR) : model(model), QWidget(parent) { + layout = new QGridLayout(); + setLayout(layout); + } + + void endOfRelation() { + if (hasChartData()) { + chart = new QChart(); + chartView = new QChartView(chart, this); + mapper = new QVBarModelMapper(chartView); + series = new QStackedBarSeries(mapper); + mapper->setFirstBarSetColumn(firstValueColumn()); + mapper->setLastBarSetColumn(lastValueColumn()); + mapper->setSeries(series); + mapper->setModel(model); + + + axis = new QBarCategoryAxis(chartView); + for (int i = 0; i < model->rowCount(); i++) axis->append(model->data(model->index(i, 0)).toString()); + chart->addSeries(series); + chart->createDefaultAxes(); + chart->setAxisX(axis, series); + layout->addWidget(chartView); + } else { + layout->addWidget(new QLabel("This relation can't be displayed as a chart.", this)); + } + } + + /** + * @return whether drawing a chart makes sense for this relation + */ + boolean_t hasChartData() { + return model->columnCount() >= 2 // first = category, last = numeric value + && isNumeric(model->attributeType(lastValueColumn())); // at least the last attribute must be numeric + } +};