src/RelpipeChartWidget.h
branchv_0
changeset 28 04f1ac8a931b
child 29 0f9f7d6564cd
--- /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
+	}
+};