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 }