# HG changeset patch # User František Kučera # Date 1542497929 -3600 # Node ID 04f1ac8a931b5e3aa5bb6d9d0295229a3bdb4573 # Parent 8c5364450a46f5fb92df4d92ee5e991363c1538c Qt Charts: first working version diff -r 8c5364450a46 -r 04f1ac8a931b nbproject/configurations.xml --- a/nbproject/configurations.xml Tue Oct 30 23:52:55 2018 +0100 +++ b/nbproject/configurations.xml Sun Nov 18 00:38:49 2018 +0100 @@ -103,9 +103,9 @@ false - + - @@ -126,8 +126,6 @@ ex="false" tool="1" flavor2="11"> - - - + + build/Debug/src + src + build/Debug/src/relpipe-out-gui_autogen/include + ../relpipe-lib-reader.cpp/include + ../relpipe-lib-cli.cpp/include + /usr/include/x86_64-linux-gnu/qt5 + /usr/include/x86_64-linux-gnu/qt5/QtWidgets + /usr/include/x86_64-linux-gnu/qt5/QtGui /usr/include/x86_64-linux-gnu/qt5/QtCore + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ + /usr/include/x86_64-linux-gnu/qt5/QtCharts QT_CHARTS_LIB @@ -176,24 +184,6 @@ - - - - ../relpipe-lib-reader.cpp/include/relpipe/reader/handlers - src - build/Debug/src/relpipe-out-gui_autogen/EWIEGA46WW - ../relpipe-lib-reader.cpp/include/relpipe/reader - /usr/include/x86_64-linux-gnu/qt5/QtGui - /usr/include/x86_64-linux-gnu/qt5/QtWidgets - build/Debug/src/relpipe-out-gui_autogen/include - /usr/include/x86_64-linux-gnu/qt5/QtCharts - build/Debug/src/relpipe-out-gui_autogen - /usr/include/x86_64-linux-gnu/qt5 - ../relpipe-lib-reader.cpp/include - build/Debug/src - - - @@ -239,36 +229,10 @@ - - /usr/include/x86_64-linux-gnu/qt5/QtWidgets - build/Debug/src/relpipe-out-gui_autogen/include - ../relpipe-lib-reader.cpp/include/relpipe/reader/handlers - src - /usr/include/x86_64-linux-gnu/qt5/QtGui - ../relpipe-lib-reader.cpp/include/relpipe/reader - /usr/include/x86_64-linux-gnu/qt5/QtCharts - /usr/include/x86_64-linux-gnu/qt5 - ../relpipe-lib-reader.cpp/include - build/Debug/src - - - ../relpipe-lib-cli.cpp/include/relpipe/cli - ../relpipe-lib-reader.cpp/include/relpipe/reader/handlers - ../relpipe-lib-reader.cpp/include/relpipe/reader - src - /usr/include/x86_64-linux-gnu/qt5/QtGui - /usr/include/x86_64-linux-gnu/qt5/QtWidgets - build/Debug/src/relpipe-out-gui_autogen/include - /usr/include/x86_64-linux-gnu/qt5/QtCharts - ../relpipe-lib-cli.cpp/include - ../relpipe-lib-reader.cpp/include - /usr/include/x86_64-linux-gnu/qt5 - build/Debug/src - diff -r 8c5364450a46 -r 04f1ac8a931b src/CMakeLists.txt --- a/src/CMakeLists.txt Tue Oct 30 23:52:55 2018 +0100 +++ b/src/CMakeLists.txt Sun Nov 18 00:38:49 2018 +0100 @@ -22,7 +22,7 @@ add_executable( ${EXECUTABLE_FILE} QtRelationalReaderStringHadler.h # QObjects must be listed here (including them from other files is not enough) - #RelpipeChartWidget.h + RelpipeChartWidget.h RelpipeTableModel.h RelpipeChartMainWindow.ui RelpipeChartMainWindow.cpp diff -r 8c5364450a46 -r 04f1ac8a931b src/RelpipeChartMainWindow.cpp --- a/src/RelpipeChartMainWindow.cpp Tue Oct 30 23:52:55 2018 +0100 +++ b/src/RelpipeChartMainWindow.cpp Sun Nov 18 00:38:49 2018 +0100 @@ -1,22 +1,13 @@ #include #include -#include #include -#include -#include -#include -#include -#include - #include "RelpipeChartMainWindow.h" using namespace relpipe::reader; using namespace relpipe::reader::handlers; -QT_CHARTS_USE_NAMESPACE - RelpipeChartMainWindow::RelpipeChartMainWindow() { widget.setupUi(this); @@ -31,16 +22,18 @@ void RelpipeChartMainWindow::startRelation(const string_t name, std::vector attributes) { setStatusMessage(L"Reading relation: " + name); - QSplitter* splitter = new QSplitter(Qt::Orientation::Vertical, tabs); currentModel = new RelpipeTableModel(attributes, this); QTableView* tableView = new QTableView(this); tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeMode::ResizeToContents); tableView->setModel(currentModel); - - // TODO: chart - splitter->addWidget(new QPushButton("here will be the chart", splitter)); + + if (currentChartWidget) currentChartWidget->endOfRelation(); + currentChartWidget = new RelpipeChartWidget(currentModel, splitter); + splitter->addWidget(currentChartWidget); splitter->addWidget(tableView); + splitter->setSizes({currentChartWidget->hasChartData() ? 1 : 0, 1}); + // splitter->setStretchFactor(currentChartWidget->hasChartData() ? 1 : 0, 1); // FIXME: 50:50 if chart is present int index = tabs->addTab(splitter, QString::fromWCharArray(name.c_str())); if (tabs->count() == 2) tabs->setCurrentIndex(index); // switch to the first relation (first tab is Options tab) tabs->setTabIcon(index, QIcon::fromTheme("application-vnd.oasis.opendocument.spreadsheet")); @@ -55,5 +48,6 @@ } void RelpipeChartMainWindow::endOfPipe() { + if (currentChartWidget) currentChartWidget->endOfRelation(); setStatusMessage(L"Reading successfully finished."); } diff -r 8c5364450a46 -r 04f1ac8a931b src/RelpipeChartMainWindow.h --- a/src/RelpipeChartMainWindow.h Tue Oct 30 23:52:55 2018 +0100 +++ b/src/RelpipeChartMainWindow.h Sun Nov 18 00:38:49 2018 +0100 @@ -2,6 +2,7 @@ #include #include +#include #include "ui_RelpipeChartMainWindow.h" @@ -11,6 +12,7 @@ #include #include "RelpipeTableModel.h" +#include "RelpipeChartWidget.h" using namespace relpipe::reader; using namespace relpipe::reader::handlers; @@ -28,6 +30,8 @@ private: Ui::RelpipeChartMainWindow widget; QTabWidget* tabs = new QTabWidget(this); + QSplitter* splitter = new QSplitter(Qt::Orientation::Vertical, tabs); RelpipeTableModel* currentModel; + RelpipeChartWidget* currentChartWidget; QLabel* status = new QLabel(); }; 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 + } +}; diff -r 8c5364450a46 -r 04f1ac8a931b src/RelpipeTableModel.h --- a/src/RelpipeTableModel.h Tue Oct 30 23:52:55 2018 +0100 +++ b/src/RelpipeTableModel.h Sun Nov 18 00:38:49 2018 +0100 @@ -91,6 +91,10 @@ if (column == 0) emit layoutChanged(); // FIXME: emit other signal ~ begin..., end..., rowsInserted(??? index(0,0), row, row); attributeCounter++; } + + TypeId attributeType(int section) { + return attributes[section].getTypeId(); + } Qt::ItemFlags flags(const QModelIndex &index) const { if (isFilled(index)) { diff -r 8c5364450a46 -r 04f1ac8a931b src/relpipe-out-chart.cpp --- a/src/relpipe-out-chart.cpp Tue Oct 30 23:52:55 2018 +0100 +++ b/src/relpipe-out-chart.cpp Sun Nov 18 00:38:49 2018 +0100 @@ -1,3 +1,6 @@ +#include +#include +#include #include #include