File indexing completed on 2024-05-26 04:23:41

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 <QApplication>
0010 
0011 #include <KChartChart>
0012 #include <KChartLeveyJenningsAxis>
0013 #include <KChartLeveyJenningsDiagram>
0014 #include <KChartLeveyJenningsCoordinatePlane>
0015 #include <KChartLeveyJenningsGridAttributes>
0016 
0017 #include <QDateTime>
0018 #include <QStandardItemModel>
0019 #include <QSplitter>
0020 #include <QTableView>
0021 #include <QTimer>
0022 
0023 class SelectionAnimator : public QObject
0024 {
0025     Q_OBJECT
0026 public:
0027     SelectionAnimator( QAbstractItemView* view )
0028         : QObject( view ),
0029           view( view )
0030     {
0031         QTimer* const t = new QTimer( this );
0032         connect( t, SIGNAL(timeout()), this, SLOT(animate()) );
0033         t->start( 1000 );
0034     }
0035 
0036 protected Q_SLOTS:
0037     void animate()
0038     {
0039         const int row = ( view->selectionModel()->currentIndex().row() + 1 ) % view->model()->rowCount();
0040         view->selectionModel()->setCurrentIndex( view->model()->index( row, 0 ), QItemSelectionModel::ClearAndSelect );
0041     }
0042 
0043 private:
0044     QAbstractItemView* const view;
0045 
0046 };
0047 
0048 #include "main.moc"
0049 
0050 int main( int argc, char** argv )
0051 {
0052     QApplication app( argc, argv );
0053 
0054     QStandardItemModel model( 14, 6 );
0055 
0056     model.setHeaderData( 0, Qt::Horizontal, QObject::tr( "Lot" ) );
0057     model.setHeaderData( 1, Qt::Horizontal, QObject::tr( "Value" ) );
0058     model.setHeaderData( 2, Qt::Horizontal, QObject::tr( "OK" ) );
0059     model.setHeaderData( 3, Qt::Horizontal, QObject::tr( "Date/Time" ) );
0060     model.setHeaderData( 4, Qt::Horizontal, QObject::tr( "Mean Value" ) );
0061     model.setHeaderData( 5, Qt::Horizontal, QObject::tr( "Standard Deviation" ) );
0062 
0063     // Lot 1
0064     model.setData( model.index( 0, 0 ), 1 );        // lot number
0065     model.setData( model.index( 0, 1 ), 210 );      // value
0066     model.setData( model.index( 0, 2 ), true );     // QC value ok/not ok
0067     model.setData( model.index( 0, 3 ), QDateTime::fromString( "2007-07-06T09:00:00", Qt::ISODate ) );
0068 
0069     model.setData( model.index( 1, 0 ), 1 );
0070     model.setData( model.index( 1, 1 ), 9.5 );
0071     model.setData( model.index( 1, 2 ), true );
0072     model.setData( model.index( 1, 3 ), QDateTime::fromString( "2007-07-06T21:00:00", Qt::ISODate ) );
0073     model.setData( model.index( 1, 4 ), 7.5 );
0074     model.setData( model.index( 1, 5 ), 1.0 );
0075 
0076     model.setData( model.index( 2, 0 ), 1 );
0077     model.setData( model.index( 2, 1 ), 200 );
0078     model.setData( model.index( 2, 2 ), true );
0079     model.setData( model.index( 2, 3 ), QDateTime::fromString( "2007-07-07T09:00:00", Qt::ISODate ) );
0080 
0081     // This values should be missing (lot is needed anyway)
0082     model.setData( model.index( 3, 0 ), 1 );
0083     model.setData( model.index( 3, 3 ), QDateTime::fromString( "2007-07-07T21:00:00", Qt::ISODate ) );
0084 
0085     model.setData( model.index( 4, 0 ), 1 );
0086     model.setData( model.index( 4, 1 ), 180 );
0087     model.setData( model.index( 4, 2 ), true );
0088     model.setData( model.index( 4, 3 ), QDateTime::fromString( "2007-07-08T09:00:00", Qt::ISODate ) );
0089 
0090     
0091     // Lot 2
0092     model.setData( model.index( 5, 0 ), 2 );
0093     model.setData( model.index( 5, 1 ), 210 );
0094     model.setData( model.index( 5, 2 ), true );
0095     model.setData( model.index( 5, 3 ), QDateTime::fromString( "2007-07-08T21:00:00", Qt::ISODate ) );
0096 
0097     model.setData( model.index( 6, 0 ), 2 );
0098     model.setData( model.index( 6, 1 ), 195 );
0099     model.setData( model.index( 6, 2 ), true );
0100     model.setData( model.index( 6, 3 ), QDateTime::fromString( "2007-07-09T09:00:00", Qt::ISODate ) );
0101 
0102     // this value is not OK
0103     model.setData( model.index( 7, 0 ), 2 );
0104     model.setData( model.index( 7, 1 ), 200 );
0105     model.setData( model.index( 7, 2 ), false );
0106     model.setData( model.index( 7, 3 ), QDateTime::fromString( "2007-07-09T21:00:00", Qt::ISODate ) );
0107 
0108     model.setData( model.index( 8, 0 ), 2 );
0109     model.setData( model.index( 8, 1 ), 210 );
0110     model.setData( model.index( 8, 2 ), true );
0111     model.setData( model.index( 8, 3 ), QDateTime::fromString( "2007-07-10T09:00:00", Qt::ISODate ) );
0112 
0113     model.setData( model.index( 9, 0 ), 2 );
0114     model.setData( model.index( 9, 1 ), 180 );
0115     model.setData( model.index( 9, 2 ), true );
0116     model.setData( model.index( 9, 3 ), QDateTime::fromString( "2007-07-10T21:00:00", Qt::ISODate ) );
0117 
0118     // this values is completely out of bounds and therefore cut/truncated
0119     model.setData( model.index( 10,0 ), 2 );
0120     model.setData( model.index( 10,1 ), 290 );
0121     model.setData( model.index( 10,2 ), true );
0122     model.setData( model.index( 10,3 ), QDateTime::fromString( "2007-07-11T09:00:00", Qt::ISODate ) );
0123 
0124     // this value is ok again
0125     model.setData( model.index( 11,0 ), 2 );
0126     model.setData( model.index( 11,1 ), 210 );
0127     model.setData( model.index( 11,2 ), true );
0128     model.setData( model.index( 11,3 ), QDateTime::fromString( "2007-07-11T21:00:00", Qt::ISODate ) );
0129 
0130     model.setData( model.index( 12,0 ), 2 );
0131     model.setData( model.index( 12,1 ), 205 );
0132     model.setData( model.index( 12,2 ), true );
0133     model.setData( model.index( 12,3 ), QDateTime::fromString( "2007-07-12T09:00:00", Qt::ISODate ) );
0134 
0135     model.setData( model.index( 13,0 ), 2 );
0136     model.setData( model.index( 13,1 ), 204 );
0137     model.setData( model.index( 13,2 ), true );
0138     model.setData( model.index( 13,3 ), QDateTime::fromString( "2007-07-12T21:00:00", Qt::ISODate ) );
0139 
0140     KChart::Chart* chart = new KChart::Chart();
0141 
0142     KChart::LeveyJenningsDiagram* diagram = new KChart::LeveyJenningsDiagram;
0143     diagram->setModel( &model );
0144     diagram->setExpectedMeanValue( 200 );
0145     diagram->setExpectedStandardDeviation( 20 );
0146     KChart::LeveyJenningsCoordinatePlane* plane = new KChart::LeveyJenningsCoordinatePlane;
0147     chart->replaceCoordinatePlane( plane );
0148     plane->replaceDiagram( diagram );
0149 
0150     /*diagram->setLotChangedSymbolPosition( Qt::AlignBottom );
0151     diagram->setSensorChangedSymbolPosition( Qt::AlignTop );
0152     diagram->setFluidicsPackChangedSymbolPosition( Qt::AlignTop );*/
0153 
0154     //diagram->setScanLinePen( QPen( Qt::green ) );
0155     //diagram->setSymbol( KChart::LeveyJenningsDiagram::NotOkDataPoint, 
0156     //                    diagram->symbol( KChart::LeveyJenningsDiagram::OkDataPoint ) );
0157 
0158     diagram->setFluidicsPackChanges( QVector< QDateTime >() << QDateTime::fromString( "2007-07-11T15:00:00", Qt::ISODate ) );
0159     diagram->setSensorChanges( QVector< QDateTime >() << QDateTime::fromString( "2007-07-10T11:00:00", Qt::ISODate ) );
0160 
0161     KChart::LeveyJenningsAxis* axis = new KChart::LeveyJenningsAxis( diagram );
0162     axis->setPosition( KChart::CartesianAxis::Left );
0163     diagram->addAxis( axis );
0164 
0165     KChart::LeveyJenningsAxis* axis2 = new KChart::LeveyJenningsAxis( diagram );
0166     axis2->setPosition( KChart::CartesianAxis::Right );
0167     axis2->setType( KChart::LeveyJenningsGridAttributes::Calculated );
0168     diagram->addAxis( axis2 );
0169 
0170     KChart::CartesianAxis* axis3 = new KChart::LeveyJenningsAxis( diagram );
0171     axis3->setPosition( KChart::CartesianAxis::Bottom );
0172     diagram->addAxis( axis3 );
0173 
0174     QTableView* tv = new QTableView;
0175     tv->setModel( &model );
0176     tv->setSelectionModel( diagram->selectionModel() );
0177 
0178     QSplitter* splitter = new QSplitter;
0179     splitter->addWidget( tv );
0180     splitter->addWidget( chart );
0181 
0182     splitter->show();
0183 
0184     new SelectionAnimator( tv );//diagram );
0185 
0186     return app.exec();
0187 }