File indexing completed on 2024-05-19 04:21:57

0001 /**
0002  * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
0003  *
0004  * This file is part of the KD Chart library.
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include "mainwindow.h"
0010 
0011 #include "ModelParamVsParam.h"
0012 #include "ModelParamVsParamPlot.h"
0013 
0014 #include <QLabel>
0015 #include <QLineEdit>
0016 
0017 
0018 #include <KChartChart>
0019 #include <KChartDataValueAttributes>
0020 #include <KChartGridAttributes>
0021 #include <KChartLineDiagram>
0022 
0023 
0024 using namespace KChart;
0025 
0026 
0027 MainWindow::MainWindow(
0028     QWidget                 *p_parent)
0029 :
0030     QWidget(p_parent),
0031     m_sourceModel(new ModelParamVsParam),
0032     m_timeoutLineEdit(new QLineEdit("1")),
0033     m_nrOfParametersLineEdit(new QLineEdit("4")),
0034     m_nrOfSamplesLineEdit(new QLineEdit("4")),
0035     m_paramVsParamGridLayout(new QGridLayout)
0036 {
0037     connect(m_timeoutLineEdit, SIGNAL(editingFinished()), SLOT(timeoutEditingFinished()));
0038     connect(m_nrOfParametersLineEdit, SIGNAL(editingFinished()), SLOT(editingFinished()));
0039     connect(m_nrOfSamplesLineEdit, SIGNAL(editingFinished()), SLOT(editingFinished()));
0040 
0041     QVBoxLayout *vBoxLayout = new QVBoxLayout;
0042     setLayout(vBoxLayout);
0043 
0044     QGridLayout *gridLayout = new QGridLayout;
0045     vBoxLayout->addLayout(gridLayout);
0046     gridLayout->setColumnStretch(2, 1);
0047 
0048     int row(0);
0049 
0050     gridLayout->addWidget(new QLabel("Timeout [sec]:"), row, 0);
0051     gridLayout->addWidget(m_timeoutLineEdit, row++, 1);
0052 
0053     gridLayout->addWidget(new QLabel("Number of Parameters:"), row, 0);
0054     gridLayout->addWidget(m_nrOfParametersLineEdit, row++, 1);
0055 
0056     gridLayout->addWidget(new QLabel("Number of Samples:"), row, 0);
0057     gridLayout->addWidget(m_nrOfSamplesLineEdit, row++, 1);
0058 
0059     vBoxLayout->addLayout(m_paramVsParamGridLayout);
0060 
0061     m_sourceModel->setTimeout(m_timeoutLineEdit->text().toInt());
0062     m_sourceModel->populate(m_nrOfParametersLineEdit->text().toInt(), m_nrOfSamplesLineEdit->text().toInt());
0063     addPlots();
0064 } // MainWindow::MainWindow()
0065 
0066 
0067 MainWindow::~MainWindow()
0068 {
0069     delete m_sourceModel;
0070     m_sourceModel = nullptr;
0071 } // MainWindow::~MainWindow()
0072 
0073 
0074 void MainWindow::timeoutEditingFinished()
0075 {
0076     if (m_timeoutLineEdit->isModified())
0077     {
0078         m_timeoutLineEdit->setModified(false);
0079         m_sourceModel->setTimeout(m_timeoutLineEdit->text().toInt());
0080     }
0081 } // MainWindow::timeoutEditingFinished()
0082 
0083 
0084 void MainWindow::editingFinished()
0085 {
0086     if (m_nrOfParametersLineEdit->isModified() || m_nrOfSamplesLineEdit->isModified())
0087     {
0088         m_nrOfParametersLineEdit->setModified(false);
0089         m_nrOfSamplesLineEdit->setModified(false);
0090 
0091         m_sourceModel->populate(m_nrOfParametersLineEdit->text().toInt(), m_nrOfSamplesLineEdit->text().toInt());
0092         m_sourceModel->stopSampling();
0093         removePlots();
0094         addPlots();
0095         m_sourceModel->startSampling();
0096     }
0097 } // MainWindow::editingFinished()
0098 
0099 
0100 void MainWindow::addPlots()
0101 {
0102     for (int r = 0; r < m_sourceModel->columnCount(); r++)
0103     {
0104         for (int c = 0; c < m_sourceModel->columnCount(); c++)
0105         {
0106 
0107             Chart * chart = new Chart;
0108             m_paramVsParamGridLayout->addWidget(chart, r, c);
0109 
0110             CartesianCoordinatePlane * plane = static_cast<CartesianCoordinatePlane *>(chart->coordinatePlane());
0111 
0112             // Hide grid.
0113             GridAttributes ga = plane->globalGridAttributes();
0114             ga.setGridVisible(false);
0115             plane->setGlobalGridAttributes(ga);
0116 
0117             // Set axes fixed scale.
0118             qreal                       xoffset(c * 10);
0119             qreal                       yoffset(r * 10);
0120             QPair<qreal, qreal> horizontalRange(xoffset, xoffset + 10);
0121             QPair<qreal, qreal> verticalRange(yoffset, yoffset + 10);
0122             plane->setHorizontalRange(horizontalRange);
0123             plane->setVerticalRange(verticalRange);
0124 
0125             if (r == c)
0126             {
0127             }
0128             else
0129             {
0130                 ModelParamVsParamPlot   *modelParamVsParamPlot =
0131                     new ModelParamVsParamPlot(m_sourceModel, c, r);
0132 
0133                 LineDiagram *lineDiagram = new LineDiagram;
0134                 lineDiagram->setDatasetDimension(2);
0135                 lineDiagram->setModel(modelParamVsParamPlot);
0136                 lineDiagram->setPen(Qt::NoPen);
0137                 setMarkerAttributes(lineDiagram);
0138 
0139                 CartesianAxis   *xAxis = new CartesianAxis(lineDiagram);
0140                 CartesianAxis   *yAxis = new CartesianAxis(lineDiagram);
0141                 xAxis->setPosition(CartesianAxis::Bottom);
0142                 yAxis->setPosition(CartesianAxis::Left);
0143                 xAxis->setTitleText('P' + QString::number(c));
0144                 yAxis->setTitleText('P' + QString::number(r));
0145                 lineDiagram->addAxis(xAxis);
0146                 lineDiagram->addAxis(yAxis);
0147 
0148                 chart->coordinatePlane()->replaceDiagram(lineDiagram);
0149             }
0150         } // for all rows
0151     } // for all columns
0152 } // MainWindow::addPlots()
0153 
0154 
0155 void MainWindow::removePlots()
0156 {
0157     while (m_paramVsParamGridLayout->count())
0158     {
0159         Chart *chart = static_cast<Chart *>(m_paramVsParamGridLayout->itemAt(0)->widget());
0160         m_paramVsParamGridLayout->removeWidget(chart);
0161         delete chart;
0162     }
0163 } // MainWindow::removePlots()
0164 
0165 
0166 void MainWindow::setMarkerAttributes(
0167     KChart::LineDiagram     *p_lineDiagram)
0168 {
0169     QColor                              markerColor         = Qt::green;
0170     MarkerAttributes::MarkerStyle   markerStyle         = MarkerAttributes::Marker4Pixels;
0171     QColor                              firstMarkerColor    = Qt::red;
0172     MarkerAttributes::MarkerStyle   firstMarkerStyle    = MarkerAttributes::MarkerDiamond;
0173     DataValueAttributes             dva                 = p_lineDiagram->dataValueAttributes();
0174     MarkerAttributes                    ma                      = dva.markerAttributes();
0175     TextAttributes                      ta                      = dva.textAttributes();
0176 
0177     ma.setVisible(true);
0178     ma.setMarkerColor(markerColor);
0179     ma.setMarkerStyle(markerStyle);
0180     dva.setMarkerAttributes(ma);
0181 
0182     ta.setVisible(false);
0183     dva.setTextAttributes(ta);
0184 
0185     dva.setVisible(true);
0186     p_lineDiagram->setDataValueAttributes(0, dva);
0187     p_lineDiagram->setDataValueAttributes(1, dva);
0188 
0189     // Override for first row.
0190     ma.setMarkerColor(firstMarkerColor);
0191     ma.setMarkerStyle(firstMarkerStyle);
0192     dva.setMarkerAttributes(ma);
0193     QAbstractItemModel  *model = p_lineDiagram->model();
0194     p_lineDiagram->setDataValueAttributes(model->index(0, 0), dva);
0195     p_lineDiagram->setDataValueAttributes(model->index(0, 1), dva);
0196 } // MainWindow::setMarkerAttributes()