File indexing completed on 2025-02-16 04:03:04

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 <KChartLineDiagram>
0014 #include <KChartTextAttributes>
0015 #include <KChartDatasetProxyModel>
0016 #include <QComboBox>
0017 #include <QLineEdit>
0018 #include <QPen>
0019 #include <QPainter>
0020 #include <QPrinter>
0021 #include <QPrintPreviewDialog>
0022 
0023 class HeaderItem : public QTreeWidgetItem
0024 {
0025 public:
0026     HeaderItem( KChart::HeaderFooter* header, QTreeWidget* parent ) :
0027         QTreeWidgetItem( parent ), m_header( header ) {}
0028 
0029     KChart::HeaderFooter* header() const { return m_header; }
0030 
0031 private:
0032     KChart::HeaderFooter* m_header;
0033 };
0034 
0035 MainWindow::MainWindow( QWidget* parent ) :
0036     QWidget( parent )
0037 {
0038     setupUi( this );
0039 
0040     QHBoxLayout* chartLayout = new QHBoxLayout( chartFrame );
0041     m_chart = new KChart::Chart();
0042     chartLayout->addWidget( m_chart );
0043 
0044     m_model.loadFromCSV( ":/data" );
0045 
0046     // Set up the diagram
0047     m_lines = new KChart::LineDiagram();
0048     m_lines->setModel( &m_model );
0049     m_chart->coordinatePlane()->replaceDiagram( m_lines );
0050 
0051     m_chart->update();
0052 }
0053 
0054 void MainWindow::on_defaultButton_clicked()
0055 {
0056     addHeaderFooter( tr("header west"), KChart::HeaderFooter::Header, KChart::Position::West);
0057     addHeaderFooter( tr("header north"), KChart::HeaderFooter::Header, KChart::Position::North);
0058     addHeaderFooter( tr("header south"), KChart::HeaderFooter::Header, KChart::Position::South);
0059     addHeaderFooter( tr("header east"), KChart::HeaderFooter::Header, KChart::Position::East);
0060     addHeaderFooter( tr("header center"), KChart::HeaderFooter::Header, KChart::Position::Center);
0061     addHeaderFooter( tr("header north west"), KChart::HeaderFooter::Header, KChart::Position::NorthWest);
0062     addHeaderFooter( tr("header north east"), KChart::HeaderFooter::Header, KChart::Position::NorthEast);
0063     addHeaderFooter( tr("header south west"), KChart::HeaderFooter::Header, KChart::Position::SouthWest);
0064     addHeaderFooter( tr("header south east"), KChart::HeaderFooter::Header, KChart::Position::SouthEast);
0065 
0066     addHeaderFooter( tr("footer west"), KChart::HeaderFooter::Footer, KChart::Position::West);
0067     addHeaderFooter( tr("footer north"), KChart::HeaderFooter::Footer, KChart::Position::North);
0068     addHeaderFooter( tr("footer south"), KChart::HeaderFooter::Footer, KChart::Position::South);
0069     addHeaderFooter( tr("footer east"), KChart::HeaderFooter::Footer, KChart::Position::East);
0070     addHeaderFooter( tr("footer center"), KChart::HeaderFooter::Footer, KChart::Position::Center);
0071     addHeaderFooter( tr("footer north west"), KChart::HeaderFooter::Footer, KChart::Position::NorthWest);
0072     addHeaderFooter( tr("footer north east"), KChart::HeaderFooter::Footer, KChart::Position::NorthEast);
0073     addHeaderFooter( tr("footer south west"), KChart::HeaderFooter::Footer, KChart::Position::SouthWest);
0074     addHeaderFooter( tr("footer south east"), KChart::HeaderFooter::Footer, KChart::Position::SouthEast);
0075 }
0076 
0077 void MainWindow::setupAddHeaderDialog( QDialog* dlg,
0078                                        Ui::AddHeaderDialog& conf ) const
0079 {
0080     conf.setupUi( dlg );
0081     conf.textED->setFocus();
0082 
0083     // Note: Header/Footer position can be Center but it can not be Floating
0084     const QStringList labels = KChart::Position::printableNames( KChart::Position::IncludeCenter );
0085     const QList<QByteArray> names = KChart::Position::names( KChart::Position::IncludeCenter );
0086 
0087     for ( int i = 0, end = qMin( labels.size(), names.size() ); i != end ; ++i )
0088         conf.positionCO->addItem( labels[i], names[i] );
0089 }
0090 
0091 void MainWindow::addHeaderFooter( const QString &text,
0092                                   KChart::HeaderFooter::HeaderFooterType type,
0093                                   KChart::Position position ) const
0094 {
0095     KChart::HeaderFooter* headerFooter = new KChart::HeaderFooter( m_chart );
0096     m_chart->addHeaderFooter( headerFooter );
0097     headerFooter->setText( text );
0098     KChart::TextAttributes attrs( headerFooter->textAttributes() );
0099     attrs.setPen( QPen( Qt::red ) );
0100     headerFooter->setTextAttributes( attrs );
0101     headerFooter->setType( type );
0102     headerFooter->setPosition( position );
0103 
0104     HeaderItem* newItem = new HeaderItem( headerFooter, headersTV );
0105     newItem->setText( 0, headerFooter->text() );
0106     newItem->setText( 1, type == KChart::HeaderFooter::Header ?
0107                          tr( "Header" ) : tr( "Footer" ) );
0108     newItem->setText( 2, headerFooter->position().name() );
0109     m_chart->update();
0110 }
0111 
0112 
0113 void MainWindow::slotPaintRequested(QPrinter *printer)
0114 {
0115     QPainter painter(printer);
0116     m_chart->paint(&painter, painter.window());
0117 }
0118 
0119 void MainWindow::on_printButton_clicked()
0120 {
0121     static QPrinter printer;
0122     QPrintPreviewDialog dialog(&printer);
0123     connect(&dialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
0124     dialog.exec();
0125 }
0126 
0127 void MainWindow::on_addHeaderPB_clicked()
0128 {
0129     QDialog dlg;
0130     Ui::AddHeaderDialog conf;
0131     setupAddHeaderDialog( &dlg, conf );
0132     conf.typeCO->setCurrentIndex( 0 ); // let us start with "Header"
0133     conf.positionCO->setCurrentIndex( 0 );
0134     if ( dlg.exec() ) {
0135         addHeaderFooter( conf.textED->text(),
0136             conf.typeCO->currentText() == "Header" ? KChart::HeaderFooter::Header : KChart::HeaderFooter::Footer,
0137             KChart::Position::fromName( conf.positionCO->itemData(conf.positionCO->currentIndex() ).toByteArray() )
0138         );
0139     }
0140 }
0141 
0142 
0143 void MainWindow::on_editHeaderPB_clicked()
0144 {
0145     if ( headersTV->selectedItems().size() == 0 ) return;
0146     HeaderItem* item =
0147             static_cast<HeaderItem*>( headersTV->selectedItems().first() );
0148     KChart::HeaderFooter* headerFooter = item->header();
0149     QDialog dlg;
0150     Ui::AddHeaderDialog conf;
0151     setupAddHeaderDialog( &dlg, conf );
0152     conf.textED->setText( headerFooter->text() );
0153     conf.typeCO->setCurrentIndex( headerFooter->type() == KChart::HeaderFooter::Header ? 0 : 1 );
0154     conf.positionCO->setCurrentIndex(
0155         conf.positionCO->findText(headerFooter->position().printableName()));
0156     if ( dlg.exec() ) {
0157         headerFooter->setText( conf.textED->text() );
0158         headerFooter->setType( conf.typeCO->currentText() == "Header" ?
0159                                KChart::HeaderFooter::Header : KChart::HeaderFooter::Footer );
0160         headerFooter->setPosition(
0161             KChart::Position::fromName( conf.positionCO->itemData(
0162                 conf.positionCO->currentIndex() ).toByteArray() ) );
0163         item->setText( 0, conf.textED->text() );
0164         item->setText( 1, headerFooter->type() == KChart::HeaderFooter::Header ?
0165                           tr( "Header" ) : tr( "Footer" ) );
0166         item->setText( 2, conf.positionCO->currentText() );
0167         m_chart->update();
0168     }
0169 }
0170 
0171 
0172 
0173 
0174 void MainWindow::on_removeHeaderPB_clicked()
0175 {
0176     if ( headersTV->selectedItems().size() == 0 ) return;
0177     QList<QTreeWidgetItem*> items = headersTV->selectedItems();
0178     for ( QList<QTreeWidgetItem*>::iterator it = items.begin(); it != items.end(); ++it )
0179     {
0180         KChart::HeaderFooter* headerFooter
0181                 = static_cast<HeaderItem*>( (*it) )->header();
0182 #if 0
0183         // Note: Despite it being owned by the Chart, you *can* just
0184         //       delete the header: KD Chart will notice that and
0185         //       it will adjust its layout ...
0186         delete headerFooter;
0187 #else
0188         // ... but the correct way is to first take it, so the Chart
0189         // is no longer owning it:
0190         m_chart->takeHeaderFooter( headerFooter );
0191         // ... and then delete it:
0192         delete headerFooter;
0193 #endif
0194         delete (*it);
0195     }
0196     m_chart->update();
0197 }
0198 
0199 
0200 void MainWindow::on_headersTV_itemSelectionChanged()
0201 {
0202     removeHeaderPB->setEnabled( headersTV->selectedItems().count() > 0 );
0203     editHeaderPB->setEnabled( headersTV->selectedItems().count() == 1 );
0204 }