--- /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 <iostream>
+
+#include <QWidget>
+#include <QGridLayout>
+#include <QLabel>
+
+#include <QChart>
+#include <QChartView>
+#include <QStackedBarSeries>
+#include <QBarCategoryAxis>
+#include <QVBarModelMapper>
+
+
+#include <relpipe/reader/typedefs.h>
+#include <relpipe/reader/TypeId.h>
+#include <relpipe/reader/handlers/AttributeMetadata.h>
+
+#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
+ }
+};