1 /**
2 * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
3 *
4 * This file is part of the KD Chart library.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 #include "axissettings.h"
21
22 #include "ui_axissettings.h"
23
24 #include <QHash>
25 #include <QVector>
26
27 #include <QComboBox>
28
29 #include <KChartChart>
30 #include <KChartCartesianAxis>
31 #include <KChartCartesianCoordinatePlane>
32 #include <KChartAbstractCartesianDiagram>
33 #include <KChartRulerAttributes>
34
35 #include <QDebug>
36
37 using namespace KChart;
38
39 class AxisSettings::Private : public QObject
40 {
41 Q_OBJECT
42 public:
43 Private( Chart* chart, AxisSettings *q );
44 void init();
45 CartesianAxis *m_currentAxis;
46 QHash< CartesianCoordinatePlane*, QVector< CartesianAxis* > > m_axisCache;
47 Chart *m_chart;
48 Ui::AxisSettings ui;
49 AxisSettings *qq;
50 public Q_SLOTS:
51 void currentIndexChanged( int index );
52 void setVisible( bool value );
53 void setShowMajorTickMarks( bool value );
54 void setShowMinorTickMarks( bool value );
55 private:
56 void updateUiForCurrentAxis();
57 };
58
Private(Chart * chart,AxisSettings * q)59 AxisSettings::Private::Private( Chart* chart, AxisSettings *q )
60 : m_chart( chart )
61 , qq( q )
62 {
63
64 }
65
init()66 void AxisSettings::Private::init()
67 {
68 ui.axisSelection->addItem( QIcon(), tr( "Left Y-Axis" ), CartesianAxis::Left );
69 ui.axisSelection->addItem( QIcon(), tr( "Right Y-Axis" ), CartesianAxis::Right );
70 ui.axisSelection->addItem( QIcon(), tr( "Bottom X-Axis" ), CartesianAxis::Bottom );
71 ui.axisSelection->addItem( QIcon(), tr( "Top X-Axis" ), CartesianAxis::Top );
72 connect( ui.axisSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int)) );
73 connect( ui.axisVisibility, SIGNAL(toggled(bool)), this, SLOT(setVisible(bool)) );
74 connect( ui.majorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMajorTickMarks(bool)) );
75 connect( ui.minorTicks, SIGNAL(toggled(bool)), this, SLOT(setShowMinorTickMarks(bool)) );
76 ui.axisSelection->setCurrentIndex( 0 );
77 }
78
currentIndexChanged(int index)79 void AxisSettings::Private::currentIndexChanged( int index )
80 {
81 m_currentAxis = nullptr;
82 const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( index ).toInt();
83 CartesianCoordinatePlane *plane = qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
84 AbstractCartesianDiagram *diag = qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
85 if ( plane && diag )
86 {
87 const QVector< CartesianAxis* > axes = diag->axes().toVector();
88 for ( CartesianAxis *axis : axes )
89 {
90 if ( axis->position() == pos )
91 {
92 m_currentAxis = axis;
93 break;
94 }
95 }
96 }
97 updateUiForCurrentAxis();
98 }
99
updateUiForCurrentAxis()100 void AxisSettings::Private::updateUiForCurrentAxis()
101 {
102 const bool prevSignalsBlocked = ui.axisVisibility->blockSignals( true );
103 ui.axisVisibility->setChecked( m_currentAxis );
104 ui.axisVisibility->blockSignals( prevSignalsBlocked );
105
106 ui.majorTicks->setEnabled( m_currentAxis );
107 ui.minorTicks->setEnabled( m_currentAxis );
108 if ( m_currentAxis )
109 {
110 const RulerAttributes rulerAttr = m_currentAxis->rulerAttributes();
111 ui.majorTicks->setChecked( rulerAttr.showMajorTickMarks() );
112 ui.minorTicks->setChecked( rulerAttr.showMinorTickMarks() );
113 }
114 else
115 {
116 ui.majorTicks->setChecked( false );
117 ui.minorTicks->setChecked( false );
118 }
119 }
120
setVisible(bool value)121 void AxisSettings::Private::setVisible( bool value )
122 {
123 const CartesianAxis::Position pos = ( CartesianAxis::Position ) ui.axisSelection->itemData( ui.axisSelection->currentIndex() ).toInt();
124 CartesianCoordinatePlane *plane = qobject_cast< CartesianCoordinatePlane* >( m_chart->coordinatePlane() );
125 AbstractCartesianDiagram *diag = qobject_cast< AbstractCartesianDiagram* >( m_chart->coordinatePlane()->diagram() );
126 if ( plane && diag )
127 {
128 const QVector< CartesianAxis* > axes = m_axisCache[ plane ];
129 bool foundAxis = false;
130 for ( CartesianAxis *axis : axes )
131 {
132 if ( axis->position() == pos )
133 {
134 foundAxis = true;
135 if ( !value )
136 {
137 diag->takeAxis( axis );
138 m_currentAxis = nullptr;
139 }
140 else
141 {
142 diag->addAxis( axis );
143 m_currentAxis = axis;
144 }
145 break;
146 }
147 }
148 if ( !foundAxis )
149 {
150 Q_ASSERT( value );
151 CartesianAxis *axis = new CartesianAxis( diag );
152 axis->setPosition( pos );
153 diag->addAxis( axis );
154 m_axisCache[ plane ].append( axis );
155 m_currentAxis = axis;
156 }
157 updateUiForCurrentAxis();
158 m_chart->update();
159 }
160 }
161
setShowMajorTickMarks(bool value)162 void AxisSettings::Private::setShowMajorTickMarks( bool value )
163 {
164 if ( m_currentAxis )
165 {
166 RulerAttributes attr( m_currentAxis->rulerAttributes() );
167 attr.setShowMajorTickMarks( value );
168 m_currentAxis->setRulerAttributes( attr );
169 m_chart->update();
170 }
171 }
172
setShowMinorTickMarks(bool value)173 void AxisSettings::Private::setShowMinorTickMarks( bool value )
174 {
175 if ( m_currentAxis )
176 {
177 RulerAttributes attr( m_currentAxis->rulerAttributes() );
178 attr.setShowMinorTickMarks( value );
179 m_currentAxis->setRulerAttributes( attr );
180 m_chart->update();
181 }
182 }
183
AxisSettings(Chart * chart,QWidget * parent)184 AxisSettings::AxisSettings( Chart *chart, QWidget *parent )
185 : QWidget( parent )
186 , d( new Private( chart, this ) )
187 {
188 d->ui.setupUi( this );
189 d->init();
190 }
191
~AxisSettings()192 AxisSettings::~AxisSettings()
193 {
194 delete d;
195 }
196
diagramTypeChanged()197 void AxisSettings::diagramTypeChanged()
198 {
199 CartesianCoordinatePlane *plane = qobject_cast< CartesianCoordinatePlane* >( d->m_chart->coordinatePlane() );
200 setEnabled( plane );
201 if ( plane )
202 d->currentIndexChanged( d->ui.axisSelection->currentIndex() );
203 }
204
205 #include "axissettings.moc"
206