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"