File indexing completed on 2024-05-12 04:20:05

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 "axissettings.h"
0010 
0011 #include "ui_axissettings.h"
0012 
0013 #include <QHash>
0014 #include <QVector>
0015 
0016 #include <QComboBox>
0017 
0018 #include <KChartChart>
0019 #include <KChartCartesianAxis>
0020 #include <KChartCartesianCoordinatePlane>
0021 #include <KChartAbstractCartesianDiagram>
0022 #include <KChartRulerAttributes>
0023 
0024 #include <QDebug>
0025 
0026 using namespace KChart;
0027 
0028 class AxisSettings::Private : public QObject
0029 {
0030     Q_OBJECT
0031 public:
0032     Private( Chart* chart, AxisSettings *q );
0033     void init();
0034     CartesianAxis *m_currentAxis;
0035     QHash< CartesianCoordinatePlane*, QVector< CartesianAxis* > > m_axisCache;
0036     Chart *m_chart;
0037     Ui::AxisSettings ui;
0038     AxisSettings *qq;
0039 public Q_SLOTS:
0040     void currentIndexChanged( int index );
0041     void setVisible( bool value );
0042     void setShowMajorTickMarks( bool value );
0043     void setShowMinorTickMarks( bool value );
0044 private:
0045     void updateUiForCurrentAxis();
0046 };
0047 
0048 AxisSettings::Private::Private( Chart* chart, AxisSettings *q )
0049     : m_chart( chart )
0050     , qq( q )
0051 {
0052 
0053 }
0054 
0055 void AxisSettings::Private::init()
0056 {
0057     ui.axisSelection->addItem( QIcon(), tr( "Left Y-Axis" ), CartesianAxis::Left );
0058     ui.axisSelection->addItem( QIcon(), tr( "Right Y-Axis" ), CartesianAxis::Right );
0059     ui.axisSelection->addItem( QIcon(), tr( "Bottom X-Axis" ), CartesianAxis::Bottom );
0060     ui.axisSelection->addItem( QIcon(), tr( "Top X-Axis" ), CartesianAxis::Top );
0061     connect( ui.axisSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int)) );
0062     connect( ui.axisVisibility, SIGNAL(toggled(bool)), this, SLOT(setVisible(bool)) );
0063     connect( ui.majorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMajorTickMarks(bool)) );
0064     connect( ui.minorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMinorTickMarks(bool)) );
0065     ui.axisSelection->setCurrentIndex( 0 );
0066 }
0067 
0068 void AxisSettings::Private::currentIndexChanged( int index )
0069 {
0070     m_currentAxis = nullptr;
0071     const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( index ).toInt();
0072     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
0073     AbstractCartesianDiagram *diag =  qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
0074     if ( plane && diag )
0075     {
0076         const QVector< CartesianAxis* > axes = diag->axes().toVector();
0077         for ( CartesianAxis *axis : axes )
0078         {
0079             if ( axis->position() == pos )
0080             {
0081                 m_currentAxis = axis;
0082                 break;
0083             }
0084         }
0085     }
0086     updateUiForCurrentAxis();
0087 }
0088 
0089 void AxisSettings::Private::updateUiForCurrentAxis()
0090 {
0091     const bool prevSignalsBlocked = ui.axisVisibility->blockSignals( true );
0092     ui.axisVisibility->setChecked( m_currentAxis );
0093     ui.axisVisibility->blockSignals( prevSignalsBlocked );
0094 
0095     ui.majorTicks->setEnabled( m_currentAxis );
0096     ui.minorTicks->setEnabled( m_currentAxis );
0097     if ( m_currentAxis )
0098     {
0099         const RulerAttributes rulerAttr = m_currentAxis->rulerAttributes();
0100         ui.majorTicks->setChecked( rulerAttr.showMajorTickMarks() );
0101         ui.minorTicks->setChecked( rulerAttr.showMinorTickMarks() );
0102     }
0103     else
0104     {
0105         ui.majorTicks->setChecked( false );
0106         ui.minorTicks->setChecked( false );
0107     }
0108 }
0109 
0110 void AxisSettings::Private::setVisible( bool value )
0111 {
0112     const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( ui.axisSelection->currentIndex() ).toInt();
0113     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
0114     AbstractCartesianDiagram *diag =  qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
0115     if ( plane && diag )
0116     {
0117         const QVector< CartesianAxis* > axes = m_axisCache[ plane ];
0118         bool foundAxis = false;
0119         for ( CartesianAxis *axis : axes )
0120         {
0121             if ( axis->position() == pos )
0122             {
0123                 foundAxis = true;
0124                 if ( !value )
0125                 {
0126                     diag->takeAxis( axis );
0127                     m_currentAxis = nullptr;
0128                 }
0129                 else
0130                 {
0131                     diag->addAxis( axis );
0132                     m_currentAxis = axis;
0133                 }
0134                 break;
0135             }
0136         }
0137         if ( !foundAxis )
0138         {
0139             Q_ASSERT( value );
0140             CartesianAxis *axis = new CartesianAxis( diag );
0141             axis->setPosition( pos );
0142             diag->addAxis( axis );
0143             m_axisCache[ plane ].append( axis );
0144             m_currentAxis = axis;
0145         }
0146         updateUiForCurrentAxis();
0147         m_chart->update();
0148     }
0149 }
0150 
0151 void AxisSettings::Private::setShowMajorTickMarks( bool value )
0152 {
0153     if ( m_currentAxis )
0154     {
0155         RulerAttributes attr( m_currentAxis->rulerAttributes() );
0156         attr.setShowMajorTickMarks( value );
0157         m_currentAxis->setRulerAttributes( attr );
0158         m_chart->update();
0159     }
0160 }
0161 
0162 void AxisSettings::Private::setShowMinorTickMarks( bool value )
0163 {
0164     if ( m_currentAxis )
0165     {
0166         RulerAttributes attr( m_currentAxis->rulerAttributes() );
0167         attr.setShowMinorTickMarks( value );
0168         m_currentAxis->setRulerAttributes( attr );
0169         m_chart->update();
0170     }
0171 }
0172 
0173 AxisSettings::AxisSettings( Chart *chart, QWidget *parent )
0174     : QWidget( parent )
0175     , d( new Private( chart, this ) )
0176 {
0177     d->ui.setupUi( this );
0178     d->init();
0179 }
0180 
0181 AxisSettings::~AxisSettings()
0182 {
0183     delete d;
0184 }
0185 
0186 void AxisSettings::diagramTypeChanged()
0187 {
0188     CartesianCoordinatePlane *plane =  qobject_cast< CartesianCoordinatePlane* >( d->m_chart->coordinatePlane() );
0189     setEnabled( plane );
0190     if ( plane )
0191         d->currentIndexChanged( d->ui.axisSelection->currentIndex() );
0192 }
0193 
0194 #include "axissettings.moc"