/** * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved. * * This file is part of the KD Chart library. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "datavaluesettings.h" #include "ui_datavaluesettings.h" #include #include #include #include #include #include #include #include #include #include using namespace KChart; class DataValueSettings::Private : public QObject { Q_OBJECT public: Private( KChart::Chart *chart, DataValueSettings *q ); DataValueSettings *qq; void init(); public Q_SLOTS: void on_scopeOneBarRB_toggled( bool checked ); void on_scopeBarDatasetSB_valueChanged( int i ); void on_scopeBarItemSB_valueChanged( int i ); void on_scopeDatasetRB_toggled( bool checked ); void on_scopeDatasetSB_valueChanged( int i ); void on_scopeCommonRB_toggled( bool checked ); void on_paintValuesCB_toggled( bool checked ); void on_fontCombo_currentIndexChanged( const QString & text ); void on_relativeSizeSB_valueChanged( int i ); void on_minimumSizeSB_valueChanged( int i ); void on_rotationSB_valueChanged( int i ); void on_posPosCombo_currentIndexChanged( const QString & text ); void on_posAlignCombo_currentIndexChanged( const QString & text ); void on_posPadHoriSB_valueChanged( int i ); void on_posPadVertSB_valueChanged( int i ); void on_negPosCombo_currentIndexChanged( const QString & text ); void on_negAlignCombo_currentIndexChanged( const QString & text ); void on_negPadHoriSB_valueChanged( int i ); void on_negPadVertSB_valueChanged( int i ); void on_labelLE_textEdited( const QString & text ); void on_prefixLE_textEdited( const QString & text ); void on_suffixLE_textEdited( const QString & text ); public: const QModelIndex currentIndex() const; const KChart::DataValueAttributes attributes() const; const char* positionToScreenName( const KChart::Position& pos ) const; const Qt::Alignment alignmentFromScreeName( const QString& name ) const; const QString alignmentToScreenName( const Qt::Alignment& align ) const; void populateWidgets(); void setAttributes( const KChart::DataValueAttributes& da ); void connectWidgets(); KChart::Chart* m_chart; Ui::DataValueSettings *ui; }; DataValueSettings::Private::Private( KChart::Chart *chart, DataValueSettings *q ) : qq ( q ) , m_chart( chart ) , ui( new Ui::DataValueSettings ) { } void DataValueSettings::Private::init() { ui->setupUi( qq ); ui->scopeCommonRB->setFocus( Qt::OtherFocusReason ); ui->scopeCommonRB->setChecked( true ); ui->paintValuesCB->setChecked( true ); populateWidgets(); connectWidgets(); } void DataValueSettings::Private::connectWidgets() { connect( ui->scopeBarDatasetSB, SIGNAL(valueChanged(int)), this, SLOT(on_scopeBarDatasetSB_valueChanged(int)) ); connect( ui->scopeBarItemSB, SIGNAL(valueChanged(int)), this, SLOT(on_scopeBarItemSB_valueChanged(int)) ); connect( ui->scopeDatasetSB, SIGNAL(valueChanged(int)), this, SLOT(on_scopeDatasetSB_valueChanged(int)) ); connect( ui->scopeOneBarRB, SIGNAL(toggled(bool)), this, SLOT(on_scopeOneBarRB_toggled(bool)) ); connect( ui->scopeDatasetRB, SIGNAL(toggled(bool)), this, SLOT(on_scopeDatasetRB_toggled(bool)) ); connect( ui->scopeCommonRB, SIGNAL(toggled(bool)), this, SLOT(on_scopeCommonRB_toggled(bool)) ); connect( ui->paintValuesCB, SIGNAL(toggled(bool)), this, SLOT(on_paintValuesCB_toggled(bool)) ); connect( ui->fontCombo, SIGNAL(currentIndexChanged(QString)), this , SLOT(on_fontCombo_currentIndexChanged(QString)) ); connect( ui->relativeSizeSB, SIGNAL(valueChanged(int)), this, SLOT(on_relativeSizeSB_valueChanged(int)) ); connect( ui->minimumSizeSB, SIGNAL(valueChanged(int)), this, SLOT(on_minimumSizeSB_valueChanged(int)) ); connect( ui->rotationSB, SIGNAL(valueChanged(int)), this, SLOT(on_rotationSB_valueChanged(int)) ); connect( ui->posPosCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_posPosCombo_currentIndexChanged(QString)) ); connect( ui->posAlignCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_posAlignCombo_currentIndexChanged(QString)) ); connect( ui->posPadHoriSB, SIGNAL(valueChanged(int)), this, SLOT(on_posPadHoriSB_valueChanged(int)) ); connect( ui->posPadVertSB, SIGNAL(valueChanged(int)), this, SLOT(on_posPadVertSB_valueChanged(int)) ); connect( ui->negPosCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_negPosCombo_currentIndexChanged(QString)) ); connect( ui->negAlignCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_negAlignCombo_currentIndexChanged(QString)) ); connect( ui->negPadHoriSB, SIGNAL(valueChanged(int)), this, SLOT(on_negPadHoriSB_valueChanged(int)) ); connect( ui->negPadVertSB, SIGNAL(valueChanged(int)), this, SLOT(on_negPadVertSB_valueChanged(int)) ); connect( ui->labelLE, SIGNAL(textEdited(QString)), this, SLOT(on_labelLE_textEdited(QString)) ); connect( ui->prefixLE, SIGNAL(textEdited(QString)), this, SLOT(on_prefixLE_textEdited(QString)) ); connect( ui->suffixLE, SIGNAL(textEdited(QString)), this, SLOT(on_suffixLE_textEdited(QString)) ); } DataValueSettings::DataValueSettings( KChart::Chart *chart, QWidget* parent ) : QWidget( parent ) , d( new Private( chart, this ) ) { d->init(); } DataValueSettings::~DataValueSettings() { delete d; } void DataValueSettings::refresh() { d->populateWidgets(); } void DataValueSettings::Private::on_scopeOneBarRB_toggled( bool checked ) { if ( checked ) { ui->scopeBarDatasetSB->setDisabled( false ); ui->scopeBarItemSB->setDisabled( false ); ui->scopeDatasetSB->setDisabled( true ); populateWidgets(); } } void DataValueSettings::Private::on_scopeBarDatasetSB_valueChanged( int i ) { Q_UNUSED(i) populateWidgets(); } void DataValueSettings::Private::on_scopeBarItemSB_valueChanged( int i ) { Q_UNUSED(i) populateWidgets(); } void DataValueSettings::Private::on_scopeDatasetRB_toggled( bool checked ) { if ( checked ) { ui->scopeBarDatasetSB->setDisabled( true ); ui->scopeBarItemSB->setDisabled( true ); ui->scopeDatasetSB->setDisabled( false ); populateWidgets(); } } void DataValueSettings::Private::on_scopeDatasetSB_valueChanged( int i ) { Q_UNUSED(i) populateWidgets(); } void DataValueSettings::Private::on_scopeCommonRB_toggled( bool checked ) { if ( checked ) { ui->scopeBarDatasetSB->setDisabled( true ); ui->scopeBarItemSB->setDisabled( true ); ui->scopeDatasetSB->setDisabled( true ); populateWidgets(); } } void DataValueSettings::Private::on_paintValuesCB_toggled( bool checked ) { DataValueAttributes da( attributes() ); da.setVisible( checked ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_fontCombo_currentIndexChanged( const QString & text ) { DataValueAttributes da( attributes() ); TextAttributes ta( da.textAttributes() ); QFont font( text ); ta.setFont( font ); da.setTextAttributes( ta ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_relativeSizeSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); TextAttributes ta( da.textAttributes() ); Measure fs( ta.fontSize() ); fs.setValue( i ); ta.setFontSize( i ); da.setTextAttributes( ta ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_minimumSizeSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); TextAttributes ta( da.textAttributes() ); Measure fs( ta.fontSize() ); fs.setValue( i ); ta.setMinimalFontSize( i ); da.setTextAttributes( ta ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_rotationSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); TextAttributes ta( da.textAttributes() ); ta.setRotation( i ); da.setTextAttributes( ta ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_posPosCombo_currentIndexChanged( const QString & text ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.positivePosition() ); relPos.setReferencePosition( Position::fromName( qPrintable( text ) ) ); da.setPositivePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_posAlignCombo_currentIndexChanged( const QString & text ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.positivePosition() ); relPos.setAlignment( alignmentFromScreeName( text ) ); da.setPositivePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_posPadHoriSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.positivePosition() ); Measure pad( relPos.horizontalPadding() ); pad.setValue( i ); relPos.setHorizontalPadding( pad ); da.setPositivePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_posPadVertSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.positivePosition() ); Measure pad( relPos.verticalPadding() ); pad.setValue( i ); relPos.setVerticalPadding( pad ); da.setPositivePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_negPosCombo_currentIndexChanged( const QString & text ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.negativePosition() ); relPos.setReferencePosition( Position::fromName( qPrintable( text ) ) ); da.setNegativePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_negAlignCombo_currentIndexChanged( const QString & text ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.negativePosition() ); relPos.setAlignment( alignmentFromScreeName( text ) ); da.setNegativePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_negPadHoriSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.negativePosition() ); Measure pad( relPos.horizontalPadding() ); pad.setValue( i ); relPos.setHorizontalPadding( pad ); da.setNegativePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_negPadVertSB_valueChanged( int i ) { DataValueAttributes da( attributes() ); RelativePosition relPos( da.negativePosition() ); Measure pad( relPos.verticalPadding() ); pad.setValue( i ); relPos.setVerticalPadding( pad ); da.setNegativePosition( relPos ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_labelLE_textEdited( const QString & text ) { DataValueAttributes da( attributes() ); da.setDataLabel( text.isEmpty() ? QString() : text ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_prefixLE_textEdited( const QString & text ) { DataValueAttributes da( attributes() ); da.setPrefix( text.isEmpty() ? QString() : text ); setAttributes( da ); m_chart->update(); } void DataValueSettings::Private::on_suffixLE_textEdited( const QString & text ) { DataValueAttributes da( attributes() ); da.setSuffix( text.isEmpty() ? QString() : text ); setAttributes( da ); m_chart->update(); } const QModelIndex DataValueSettings::Private::currentIndex() const { const int dataset = ui->scopeBarDatasetSB->value(); const int item = ui->scopeBarItemSB->value(); Q_ASSERT( m_chart ); Q_ASSERT( m_chart->coordinatePlane() ); AbstractDiagram *diag = m_chart->coordinatePlane()->diagram(); return diag->model()->index( item, dataset, QModelIndex() ); } const KChart::DataValueAttributes DataValueSettings::Private::attributes() const { Q_ASSERT( m_chart ); Q_ASSERT( m_chart->coordinatePlane() ); AbstractDiagram *diag = m_chart->coordinatePlane()->diagram(); DataValueAttributes attr = diag->dataValueAttributes(); if ( ui->scopeOneBarRB->isChecked() ) { attr = diag->dataValueAttributes( currentIndex() ); } else if ( ui->scopeDatasetRB->isChecked() ) { attr = diag->dataValueAttributes( ui->scopeDatasetSB->value() ); } attr.setShowRepetitiveDataLabels( true ); return attr; } void DataValueSettings::Private::setAttributes( const KChart::DataValueAttributes& da ) { Q_ASSERT( m_chart ); Q_ASSERT( m_chart->coordinatePlane() ); AbstractDiagram *diag = m_chart->coordinatePlane()->diagram(); if ( ui->scopeOneBarRB->isChecked() ) diag->setDataValueAttributes( currentIndex(), da ); else if ( ui->scopeDatasetRB->isChecked() ) diag->setDataValueAttributes( ui->scopeDatasetSB->value(), da ); else diag->setDataValueAttributes( da ); } // just a convenience method: // In the combo box we have the text "( Default Value )" instead of "Unknown Position" // because by setting a position to unknown we get KD Chart to use the // diagram-specific default positions. const char* DataValueSettings::Private::positionToScreenName( const Position& pos ) const { static const char* defaultPositionName = "( Default Value )"; if ( pos.isUnknown() ) return defaultPositionName; return pos.name(); } const Qt::Alignment DataValueSettings::Private::alignmentFromScreeName( const QString& name ) const { if ( name == "Center" ) return Qt::AlignCenter; if ( name == "BottomLeft" ) return Qt::AlignLeft | Qt::AlignBottom; if ( name == "Bottom" ) return Qt::AlignHCenter | Qt::AlignBottom; if ( name == "BottomRight" ) return Qt::AlignRight | Qt::AlignBottom; if ( name == "Right" ) return Qt::AlignRight | Qt::AlignVCenter; if ( name == "TopRight" ) return Qt::AlignRight | Qt::AlignTop; if ( name == "Top" ) return Qt::AlignHCenter | Qt::AlignTop; if ( name == "TopLeft" ) return Qt::AlignLeft | Qt::AlignTop; if ( name == "Left" ) return Qt::AlignLeft | Qt::AlignVCenter; return Qt::AlignCenter; } const QString DataValueSettings::Private::alignmentToScreenName( const Qt::Alignment& align ) const { if ( align == Qt::AlignCenter ) return "Center"; if ( align == (Qt::AlignLeft | Qt::AlignBottom) ) return "BottomLeft"; if ( align == (Qt::AlignHCenter | Qt::AlignBottom) ) return "Bottom"; if ( align == (Qt::AlignRight | Qt::AlignBottom) ) return "BottomRight"; if ( align == (Qt::AlignRight | Qt::AlignVCenter) ) return "Right"; if ( align == (Qt::AlignRight | Qt::AlignTop) ) return "TopRight"; if ( align == (Qt::AlignHCenter | Qt::AlignTop) ) return "Top"; if ( align == (Qt::AlignLeft | Qt::AlignTop) ) return "TopLeft"; if ( align == (Qt::AlignLeft | Qt::AlignVCenter) ) return "Left"; return "Center"; } void DataValueSettings::Private::populateWidgets() { const DataValueAttributes da( attributes() ); const TextAttributes ta( da.textAttributes() ); const RelativePosition posPos( da.positivePosition() ); const RelativePosition negPos( da.negativePosition() ); ui->paintValuesCB->setChecked( da.isVisible() && ta.isVisible() ); ui->fontCombo->setCurrentFont( ta.font() ); ui->relativeSizeSB->setValue( static_cast(ta.fontSize().value()) ); ui->minimumSizeSB->setValue( static_cast(ta.minimalFontSize().value()) ); ui->rotationSB->setValue( static_cast(ta.rotation()) ); ui->posPosCombo->setCurrentIndex( ui->posPosCombo->findText( positionToScreenName( posPos.referencePosition() ) ) ); ui->posAlignCombo->setCurrentIndex( ui->posAlignCombo->findText( alignmentToScreenName( posPos.alignment() ) ) ); ui->posPadHoriSB->setValue( static_cast(posPos.horizontalPadding().value()) ); ui->posPadVertSB->setValue( static_cast(posPos.verticalPadding().value()) ); ui->negPosCombo->setCurrentIndex( ui->negPosCombo->findText( positionToScreenName( negPos.referencePosition() ) ) ); ui->negAlignCombo->setCurrentIndex( ui->negAlignCombo->findText( alignmentToScreenName( negPos.alignment() ) ) ); ui->negPadHoriSB->setValue( static_cast(negPos.horizontalPadding().value()) ); ui->negPadVertSB->setValue( static_cast(negPos.verticalPadding().value()) ); ui->labelLE->setText( da.dataLabel() ); ui->prefixLE->setText( da.prefix() ); ui->suffixLE->setText( da.suffix() ); } #include "datavaluesettings.moc"