File indexing completed on 2024-05-12 04:20:06

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 <KChartChart>
0012 #include <KChartCartesianCoordinatePlane>
0013 #include <KChartAbstractCoordinatePlane>
0014 #include <KChartCartesianAxis>
0015 #include <KChartCartesianGrid>
0016 #include <KChartAbstractDiagram>
0017 #include <KChartBarDiagram>
0018 #include <KChartLineDiagram>
0019 #include <KChartPlotter>
0020 #include <KChartPieDiagram>
0021 #include <KChartPolarCoordinatePlane>
0022 #include <KChartLegend>
0023 #include <KChartDataValueAttributes>
0024 #include <KChartMarkerAttributes>
0025 #include <KChartTextAttributes>
0026 #include <KChartGridAttributes>
0027 #include <KChartRulerAttributes>
0028 #include <KChartPieAttributes>
0029 
0030 #include <TableModel.h>
0031 
0032 #include <QDockWidget>
0033 
0034 #include "datasetsettings.h"
0035 #include "diagramsettings.h"
0036 #include "datavaluesettings.h"
0037 #include "diagramtypedialog.h"
0038 #include "axissettings.h"
0039 
0040 using namespace KChart;
0041 
0042 class MainWindow::Private : public QObject
0043 {
0044     Q_OBJECT
0045     Q_PROPERTY( int datasetCount READ datasetCount NOTIFY datasetCountChanged )
0046 public:
0047     int datasetCount() const;
0048     enum ChartType{ Bar, Line, Plotter, Polar, Pie };
0049     Private( MainWindow *q = nullptr );
0050     Chart *m_chartWin;
0051     CartesianCoordinatePlane *m_cartPlane;
0052     TableModel *m_model;
0053     AbstractDiagram *m_curDiagram;
0054     ChartType m_type;
0055     QHash< DiagramTypeDialog::DiagramType, QAbstractItemModel* > m_modelTable;
0056     MainWindow *qq;
0057 Q_SIGNALS:
0058     void datasetCountChanged( int );
0059 public Q_SLOTS:
0060     void changedChartType();
0061 };
0062 
0063 MainWindow::Private::Private( MainWindow *q )
0064     : m_chartWin( new Chart( q ) )
0065     , m_cartPlane( new CartesianCoordinatePlane )
0066     , m_model( new TableModel( q ) )
0067     , m_curDiagram( new BarDiagram( q, m_cartPlane ) )
0068     , m_type( Bar )
0069     , qq( q )
0070 {
0071     m_chartWin->replaceCoordinatePlane( m_cartPlane );
0072     m_model->loadFromCSV( ":/data/barSimple.csv" );
0073     m_cartPlane->replaceDiagram( m_curDiagram );
0074     m_curDiagram->setModel( m_model );
0075     m_modelTable[ DiagramTypeDialog::Bar ] = m_model;
0076     m_modelTable[ DiagramTypeDialog::LyingBar ] = m_model;
0077     TableModel *lineModel = new TableModel( q );
0078     lineModel->loadFromCSV( ":/data/lineSimple.csv" );
0079     m_modelTable[ DiagramTypeDialog::Line ] = lineModel;
0080     m_modelTable[ DiagramTypeDialog::Plotter ] = lineModel;
0081     TableModel *pieModel = new TableModel( q );
0082     pieModel->loadFromCSV( ":/data/pieSimple.csv" );
0083     m_modelTable[ DiagramTypeDialog::Pie ] = pieModel;
0084 
0085     DiagramTypeDialog *diagramTypeSettings = new DiagramTypeDialog( m_chartWin, qq );
0086     diagramTypeSettings->setDefaultModels( m_modelTable );
0087     QDockWidget *diagramTypeSettingsDock = new QDockWidget( tr( "DiagramType" ), qq );
0088     diagramTypeSettingsDock->setWidget( diagramTypeSettings );
0089     diagramTypeSettingsDock->setFloating( false );
0090     connect( diagramTypeSettings, SIGNAL(diagramTypeChanged(DiagramType,Subtype)), this, SLOT(changedChartType()) );
0091     q->addDockWidget( Qt::LeftDockWidgetArea, diagramTypeSettingsDock );
0092 
0093     AxisSettings *axisSettings = new AxisSettings( m_chartWin, qq );
0094     QDockWidget *axisSettingsDock = new QDockWidget( tr( "AxisSettings" ), qq );
0095     axisSettingsDock->setWidget( axisSettings );
0096     axisSettingsDock->setFloating( false );
0097     q->addDockWidget( Qt::LeftDockWidgetArea, axisSettingsDock );
0098     connect( diagramTypeSettings, SIGNAL(diagramTypeChanged(DiagramType,Subtype)), axisSettings, SLOT(diagramTypeChanged()) );
0099 
0100     DatasetSettings *setSettings = new DatasetSettings( m_chartWin, qq );
0101     QDockWidget *setSettingsDock = new QDockWidget( tr( "DatasetSettings" ), qq );
0102     setSettingsDock->setWidget( setSettings );
0103     setSettingsDock->setFloating( false );
0104     q->addDockWidget( Qt::LeftDockWidgetArea, setSettingsDock );
0105     connect( this, SIGNAL(datasetCountChanged(int)), setSettings, SLOT(setDatasetCount(int)) );
0106     connect( diagramTypeSettings, SIGNAL(diagramTypeChanged(DiagramType,Subtype)), setSettings, SLOT(diagramTypeChanged()) );
0107     setSettings->setDatasetCount( m_model->columnCount() );
0108 
0109     DiagramSettings *diagSettings = new DiagramSettings( m_chartWin, qq );
0110     QDockWidget *diagSettingsDock = new QDockWidget( tr( "DiagramSettings" ), qq );
0111     diagSettingsDock->setWidget( diagSettings );
0112     diagSettingsDock->setFloating( false );
0113     q->addDockWidget( Qt::LeftDockWidgetArea, diagSettingsDock );
0114     connect( diagramTypeSettings, SIGNAL(diagramTypeChanged(DiagramType,Subtype)), diagSettings, SLOT(refreshSettings()) );
0115 
0116     DataValueSettings *dataValueSettings = new DataValueSettings( m_chartWin, qq );
0117     QDockWidget *dataValueSettingsDock = new QDockWidget( tr( "DataValueSettings" ), qq );
0118     dataValueSettingsDock->setWidget( dataValueSettings );
0119     dataValueSettingsDock->setFloating( false );
0120     q->addDockWidget( Qt::RightDockWidgetArea, dataValueSettingsDock );
0121     connect( diagramTypeSettings, SIGNAL(diagramTypeChanged(DiagramType,Subtype)), dataValueSettings, SLOT(refresh()) );
0122 
0123 }
0124 
0125 int MainWindow::Private::datasetCount() const
0126 {
0127     if ( m_chartWin->coordinatePlane() && m_chartWin->coordinatePlane()->diagram() )
0128     {
0129         const AbstractDiagram *diag = m_chartWin->coordinatePlane()->diagram();
0130         if ( !diag->model() )
0131             return 0;
0132         return diag->model()->columnCount() / diag->datasetDimension();
0133     }
0134     return 0;
0135 }
0136 
0137 void MainWindow::Private::changedChartType()
0138 {
0139     Q_EMIT datasetCountChanged( datasetCount() );
0140 }
0141 
0142 MainWindow::MainWindow( QWidget *parent )
0143     : QMainWindow( parent )
0144     , d( new Private( this ) )
0145 {
0146     setCentralWidget( d->m_chartWin );
0147 }
0148 
0149 MainWindow::~MainWindow()
0150 {
0151     delete d;
0152 }
0153 
0154 #include "mainwindow.moc"