File indexing completed on 2024-05-19 15:26:51

0001 /**
0002  * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB.  All rights reserved.
0003  *
0004  * This file is part of the KD Chart library.
0005  *
0006  * This program is free software; you can redistribute it and/or
0007  * modify it under the terms of the GNU General Public License as
0008  * published by the Free Software Foundation; either version 2 of
0009  * the License, or (at your option) any later version.
0010  *
0011  * This program is distributed in the hope that it will be useful,
0012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014  * GNU General Public License for more details.
0015  *
0016  * You should have received a copy of the GNU General Public License
0017  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
0018  */
0019 
0020 #include "axissettings.h"
0021 
0022 #include "ui_axissettings.h"
0023 
0024 #include <QHash>
0025 #include <QVector>
0026 
0027 #include <QComboBox>
0028 
0029 #include <KChartChart>
0030 #include <KChartCartesianAxis>
0031 #include <KChartCartesianCoordinatePlane>
0032 #include <KChartAbstractCartesianDiagram>
0033 #include <KChartRulerAttributes>
0034 
0035 #include <QDebug>
0036 
0037 using namespace KChart;
0038 
0039 class AxisSettings::Private : public QObject
0040 {
0041     Q_OBJECT
0042 public:
0043     Private( Chart* chart, AxisSettings *q );
0044     void init();
0045     CartesianAxis *m_currentAxis;
0046     QHash< CartesianCoordinatePlane*, QVector< CartesianAxis* > > m_axisCache;
0047     Chart *m_chart;
0048     Ui::AxisSettings ui;
0049     AxisSettings *qq;
0050 public Q_SLOTS:
0051     void currentIndexChanged( int index );
0052     void setVisible( bool value );
0053     void setShowMajorTickMarks( bool value );
0054     void setShowMinorTickMarks( bool value );
0055 private:
0056     void updateUiForCurrentAxis();
0057 };
0058 
0059 AxisSettings::Private::Private( Chart* chart, AxisSettings *q )
0060     : m_chart( chart )
0061     , qq( q )
0062 {
0063 
0064 }
0065 
0066 void AxisSettings::Private::init()
0067 {
0068     ui.axisSelection->addItem( QIcon(), tr( "Left Y-Axis" ), CartesianAxis::Left );
0069     ui.axisSelection->addItem( QIcon(), tr( "Right Y-Axis" ), CartesianAxis::Right );
0070     ui.axisSelection->addItem( QIcon(), tr( "Bottom X-Axis" ), CartesianAxis::Bottom );
0071     ui.axisSelection->addItem( QIcon(), tr( "Top X-Axis" ), CartesianAxis::Top );
0072     connect( ui.axisSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int)) );
0073     connect( ui.axisVisibility, SIGNAL(toggled(bool)), this, SLOT(setVisible(bool)) );
0074     connect( ui.majorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMajorTickMarks(bool)) );
0075     connect( ui.minorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMinorTickMarks(bool)) );
0076     ui.axisSelection->setCurrentIndex( 0 );
0077 }
0078 
0079 void AxisSettings::Private::currentIndexChanged( int index )
0080 {
0081     m_currentAxis = nullptr;
0082     const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( index ).toInt();
0083     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
0084     AbstractCartesianDiagram *diag =  qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
0085     if ( plane && diag )
0086     {
0087         const QVector< CartesianAxis* > axes = diag->axes().toVector();
0088         for ( CartesianAxis *axis : axes )
0089         {
0090             if ( axis->position() == pos )
0091             {
0092                 m_currentAxis = axis;
0093                 break;
0094             }
0095         }
0096     }
0097     updateUiForCurrentAxis();
0098 }
0099 
0100 void AxisSettings::Private::updateUiForCurrentAxis()
0101 {
0102     const bool prevSignalsBlocked = ui.axisVisibility->blockSignals( true );
0103     ui.axisVisibility->setChecked( m_currentAxis );
0104     ui.axisVisibility->blockSignals( prevSignalsBlocked );
0105 
0106     ui.majorTicks->setEnabled( m_currentAxis );
0107     ui.minorTicks->setEnabled( m_currentAxis );
0108     if ( m_currentAxis )
0109     {
0110         const RulerAttributes rulerAttr = m_currentAxis->rulerAttributes();
0111         ui.majorTicks->setChecked( rulerAttr.showMajorTickMarks() );
0112         ui.minorTicks->setChecked( rulerAttr.showMinorTickMarks() );
0113     }
0114     else
0115     {
0116         ui.majorTicks->setChecked( false );
0117         ui.minorTicks->setChecked( false );
0118     }
0119 }
0120 
0121 void AxisSettings::Private::setVisible( bool value )
0122 {
0123     const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( ui.axisSelection->currentIndex() ).toInt();
0124     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
0125     AbstractCartesianDiagram *diag =  qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
0126     if ( plane && diag )
0127     {
0128         const QVector< CartesianAxis* > axes = m_axisCache[ plane ];
0129         bool foundAxis = false;
0130         for ( CartesianAxis *axis : axes )
0131         {
0132             if ( axis->position() == pos )
0133             {
0134                 foundAxis = true;
0135                 if ( !value )
0136                 {
0137                     diag->takeAxis( axis );
0138                     m_currentAxis = nullptr;
0139                 }
0140                 else
0141                 {
0142                     diag->addAxis( axis );
0143                     m_currentAxis = axis;
0144                 }
0145                 break;
0146             }
0147         }
0148         if ( !foundAxis )
0149         {
0150             Q_ASSERT( value );
0151             CartesianAxis *axis = new CartesianAxis( diag );
0152             axis->setPosition( pos );
0153             diag->addAxis( axis );
0154             m_axisCache[ plane ].append( axis );
0155             m_currentAxis = axis;
0156         }
0157         updateUiForCurrentAxis();
0158         m_chart->update();
0159     }
0160 }
0161 
0162 void AxisSettings::Private::setShowMajorTickMarks( bool value )
0163 {
0164     if ( m_currentAxis )
0165     {
0166         RulerAttributes attr( m_currentAxis->rulerAttributes() );
0167         attr.setShowMajorTickMarks( value );
0168         m_currentAxis->setRulerAttributes( attr );
0169         m_chart->update();
0170     }
0171 }
0172 
0173 void AxisSettings::Private::setShowMinorTickMarks( bool value )
0174 {
0175     if ( m_currentAxis )
0176     {
0177         RulerAttributes attr( m_currentAxis->rulerAttributes() );
0178         attr.setShowMinorTickMarks( value );
0179         m_currentAxis->setRulerAttributes( attr );
0180         m_chart->update();
0181     }
0182 }
0183 
0184 AxisSettings::AxisSettings( Chart *chart, QWidget *parent )
0185     : QWidget( parent )
0186     , d( new Private( chart, this ) )
0187 {
0188     d->ui.setupUi( this );
0189     d->init();
0190 }
0191 
0192 AxisSettings::~AxisSettings()
0193 {
0194     delete d;
0195 }
0196 
0197 void AxisSettings::diagramTypeChanged()
0198 {
0199     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( d->m_chart->coordinatePlane() );
0200     setEnabled( plane );
0201     if ( plane )
0202         d->currentIndexChanged( d->ui.axisSelection->currentIndex() );
0203 }
0204 
0205 #include "axissettings.moc"