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"