File indexing completed on 2024-05-12 16:33:32
0001 /* This file is part of the KDE project 0002 0003 Copyright 2007-2008 Johannes Simon <johannes.simon@gmail.com> 0004 Copyright 2009 Inge Wallin <inge@lysator.liu.se> 0005 Copyright 2018 Dag Andersen <danders@get2net.dk> 0006 0007 This library is free software; you can redistribute it and/or 0008 modify it under the terms of the GNU Library General Public 0009 License as published by the Free Software Foundation; either 0010 version 2 of the License, or (at your option) any later version. 0011 0012 This library is distributed in the hope that it will be useful, 0013 but WITHOUT ANY WARRANTY; without even the implied warranty of 0014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0015 Library General Public License for more details. 0016 0017 You should have received a copy of the GNU Library General Public License 0018 along with this library; see the file COPYING.LIB. If not, write to 0019 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0020 Boston, MA 02110-1301, USA. 0021 */ 0022 0023 // Own 0024 #include "DataSetConfigWidget.h" 0025 #include "ui_DataSetConfigWidget.h" 0026 0027 // Qt 0028 #include <QAction> 0029 #include <QMenu> 0030 #include <QLatin1String> 0031 0032 // KF5 0033 #include <klocalizedstring.h> 0034 #include <kmessagebox.h> 0035 #include <kfontchooser.h> 0036 0037 // Calligra 0038 #include <interfaces/KoChartModel.h> 0039 #include <KoIcon.h> 0040 0041 // KChart 0042 #include <KChartChart> 0043 #include <KChartPosition> 0044 #include <KChartCartesianAxis> 0045 #include <KChartGridAttributes> 0046 #include <KChartAbstractCartesianDiagram> 0047 #include <KChartLegend> 0048 #include <KChartDataValueAttributes> 0049 #include <KChartTextAttributes> 0050 #include <KChartMarkerAttributes> 0051 #include <KChartMeasure> 0052 0053 // KoChart 0054 #include "ChartProxyModel.h" 0055 #include "PlotArea.h" 0056 #include "Legend.h" 0057 #include "DataSet.h" 0058 #include "Axis.h" 0059 #include "ui_ChartTableEditor.h" 0060 #include "NewAxisDialog.h" 0061 #include "AxisScalingDialog.h" 0062 #include "FontEditorDialog.h" 0063 #include "FormatErrorBarDialog.h" 0064 #include "CellRegionDialog.h" 0065 #include "TableEditorDialog.h" 0066 #include "commands/ChartTypeCommand.h" 0067 #include "CellRegionStringValidator.h" 0068 #include "ChartTableModel.h" 0069 #include "TableSource.h" 0070 #include "ChartDebug.h" 0071 0072 using namespace KoChart; 0073 0074 0075 class DataSetConfigWidget::Private 0076 { 0077 public: 0078 Private(DataSetConfigWidget *parent); 0079 ~Private(); 0080 0081 Ui::DataSetConfigWidget ui; 0082 0083 QList<Axis*> dataSetAxes; 0084 QList<DataSet*> dataSets; 0085 int selectedDataSet; 0086 0087 // Menus 0088 QMenu *dataSetBarChartMenu; 0089 QMenu *dataSetLineChartMenu; 0090 QMenu *dataSetAreaChartMenu; 0091 QMenu *dataSetRadarChartMenu; 0092 QMenu *dataSetStockChartMenu; 0093 0094 // chart type selection actions 0095 QAction *normalBarChartAction; 0096 QAction *stackedBarChartAction; 0097 QAction *percentBarChartAction; 0098 0099 QAction *normalLineChartAction; 0100 QAction *stackedLineChartAction; 0101 QAction *percentLineChartAction; 0102 0103 QAction *normalAreaChartAction; 0104 QAction *stackedAreaChartAction; 0105 QAction *percentAreaChartAction; 0106 0107 QAction *circleChartAction; 0108 QAction *ringChartAction; 0109 QAction *radarChartAction; 0110 QAction *filledRadarChartAction; 0111 0112 QAction *scatterChartAction; 0113 QAction *bubbleChartAction; 0114 0115 QAction *hlcStockChartAction; 0116 QAction *ohlcStockChartAction; 0117 QAction *candlestickStockChartAction; 0118 0119 QAction *surfaceChartAction; 0120 QAction *ganttChartAction; 0121 0122 // chart type selection actions for datasets 0123 QAction *dataSetNormalBarChartAction; 0124 QAction *dataSetStackedBarChartAction; 0125 QAction *dataSetPercentBarChartAction; 0126 0127 QAction *dataSetNormalLineChartAction; 0128 QAction *dataSetStackedLineChartAction; 0129 QAction *dataSetPercentLineChartAction; 0130 0131 QAction *dataSetNormalAreaChartAction; 0132 QAction *dataSetStackedAreaChartAction; 0133 QAction *dataSetPercentAreaChartAction; 0134 0135 QAction *dataSetCircleChartAction; 0136 QAction *dataSetRingChartAction; 0137 QAction *dataSetRadarChartAction; 0138 QAction *dataSetFilledRadarChartAction; 0139 QAction *dataSetScatterChartAction; 0140 QAction *dataSetBubbleChartAction; 0141 0142 QAction *dataSetHLCStockChartAction; 0143 QAction *dataSetOHLCStockChartAction; 0144 QAction *dataSetCandlestickStockChartAction; 0145 0146 QAction *dataSetSurfaceChartAction; 0147 QAction *dataSetGanttChartAction; 0148 0149 // marker selection actions for datasets 0150 QAction *dataSetNoMarkerAction; 0151 QAction *dataSetAutomaticMarkerAction; 0152 QAction *dataSetMarkerCircleAction; 0153 QAction *dataSetMarkerSquareAction; 0154 QAction *dataSetMarkerDiamondAction; 0155 QAction *dataSetMarkerRingAction; 0156 QAction *dataSetMarkerCrossAction; 0157 QAction *dataSetMarkerFastCrossAction; 0158 QAction *dataSetMarkerArrowDownAction; 0159 QAction *dataSetMarkerArrowUpAction; 0160 QAction *dataSetMarkerArrowRightAction; 0161 QAction *dataSetMarkerArrowLeftAction; 0162 QAction *dataSetMarkerBowTieAction; 0163 QAction *dataSetMarkerHourGlassAction; 0164 QAction *dataSetMarkerStarAction; 0165 QAction *dataSetMarkerXAction; 0166 QAction *dataSetMarkerAsteriskAction; 0167 QAction *dataSetMarkerHorizontalBarAction; 0168 QAction *dataSetMarkerVerticalBarAction; 0169 0170 FormatErrorBarDialog formatErrorBarDialog; 0171 }; 0172 0173 0174 DataSetConfigWidget::Private::Private(DataSetConfigWidget *parent) 0175 : formatErrorBarDialog(parent) 0176 0177 { 0178 ui.setupUi(parent); 0179 0180 selectedDataSet = 0; 0181 0182 dataSetBarChartMenu = 0; 0183 dataSetLineChartMenu = 0; 0184 dataSetAreaChartMenu = 0; 0185 dataSetRadarChartMenu = 0; 0186 dataSetStockChartMenu = 0; 0187 dataSetNormalBarChartAction = 0; 0188 dataSetStackedBarChartAction = 0; 0189 dataSetPercentBarChartAction = 0; 0190 dataSetNormalLineChartAction = 0; 0191 dataSetStackedLineChartAction = 0; 0192 dataSetPercentLineChartAction = 0; 0193 dataSetNormalAreaChartAction = 0; 0194 dataSetStackedAreaChartAction = 0; 0195 dataSetPercentAreaChartAction = 0; 0196 dataSetCircleChartAction = 0; 0197 dataSetRingChartAction = 0; 0198 dataSetScatterChartAction = 0; 0199 dataSetRadarChartAction = 0; 0200 dataSetFilledRadarChartAction = 0; 0201 dataSetHLCStockChartAction = 0; 0202 dataSetOHLCStockChartAction = 0; 0203 dataSetCandlestickStockChartAction = 0; 0204 dataSetBubbleChartAction = 0; 0205 dataSetSurfaceChartAction = 0; 0206 dataSetGanttChartAction = 0; 0207 0208 // Data set chart type button 0209 QMenu *dataSetChartTypeMenu = new QMenu(i18n("Chart Type"), parent); 0210 0211 // Default chart type is a bar chart 0212 dataSetChartTypeMenu->setIcon(ICON1(BarChartType)); 0213 0214 0215 dataSetBarChartMenu = dataSetChartTypeMenu->addMenu(ICON1(BarChartType), i18n("Bar Chart")); 0216 dataSetNormalBarChartAction = dataSetBarChartMenu->addAction(ICON2(BarChartType, NormalChartSubtype), i18n("Normal")); 0217 dataSetStackedBarChartAction = dataSetBarChartMenu->addAction(ICON2(BarChartType, StackedChartSubtype), i18n("Stacked")); 0218 dataSetPercentBarChartAction = dataSetBarChartMenu->addAction(ICON2(BarChartType, PercentChartSubtype), i18n("Percent")); 0219 0220 dataSetLineChartMenu = dataSetChartTypeMenu->addMenu(ICON1(LineChartType), i18n("Line Chart")); 0221 dataSetNormalLineChartAction = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Normal")); 0222 dataSetStackedLineChartAction = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Stacked")); 0223 dataSetPercentLineChartAction = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Percent")); 0224 0225 dataSetAreaChartMenu = dataSetChartTypeMenu->addMenu(ICON1(AreaChartType), i18n("Area Chart")); 0226 dataSetNormalAreaChartAction = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, NormalChartSubtype), i18n("Normal")); 0227 dataSetStackedAreaChartAction = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, StackedChartSubtype), i18n("Stacked")); 0228 dataSetPercentAreaChartAction = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, PercentChartSubtype), i18n("Percent")); 0229 0230 dataSetCircleChartAction = dataSetChartTypeMenu->addAction(ICON1(CircleChartType), i18n("Pie Chart")); 0231 dataSetRingChartAction = dataSetChartTypeMenu->addAction(ICON1(RingChartType), i18n("Ring Chart")); 0232 0233 dataSetRadarChartMenu = dataSetChartTypeMenu->addMenu(ICON1(RadarChartType), i18n("Polar Chart")); 0234 dataSetRadarChartAction = dataSetRadarChartMenu->addAction(ICON2(RadarChartType, NoChartSubtype), i18n("Normal")); 0235 dataSetFilledRadarChartAction = dataSetRadarChartMenu->addAction(ICON2(FilledRadarChartType, NoChartSubtype), i18n("Filled")); 0236 0237 dataSetStockChartMenu = dataSetChartTypeMenu->addMenu(ICON1(StockChartType), i18n("Stock Chart")); 0238 dataSetCandlestickStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, CandlestickChartSubtype), i18n("Candlestick")); 0239 dataSetOHLCStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, OpenHighLowCloseChartSubtype), i18n("OpenHighLowClose")); 0240 dataSetHLCStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, HighLowCloseChartSubtype), i18n("HighLowClose")); 0241 0242 dataSetBubbleChartAction = dataSetChartTypeMenu->addAction(ICON1(BubbleChartType), i18n("Bubble Chart")); 0243 0244 dataSetScatterChartAction = dataSetChartTypeMenu->addAction(ICON1(ScatterChartType), i18n("Scatter Chart")); 0245 0246 ui.dataSetChartTypeMenu->setMenu(dataSetChartTypeMenu); 0247 0248 connect(dataSetChartTypeMenu, SIGNAL(triggered(QAction*)), parent, SLOT(dataSetChartTypeSelected(QAction*))); 0249 0250 connect(ui.dataSetHasChartType, SIGNAL(toggled(bool)), parent, SLOT(ui_dataSetHasChartTypeChanged(bool))); 0251 0252 // Setup marker menu 0253 QMenu *datasetMarkerMenu = new QMenu(parent); 0254 0255 // Default marker is Automatic 0256 datasetMarkerMenu->setIcon(QIcon()); 0257 0258 dataSetNoMarkerAction = datasetMarkerMenu->addAction(i18n("None")); 0259 dataSetAutomaticMarkerAction = datasetMarkerMenu->addAction(i18n("Automatic")); 0260 0261 QMenu *datasetSelectMarkerMenu = datasetMarkerMenu->addMenu(i18n("Select")); 0262 dataSetMarkerSquareAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0263 dataSetMarkerDiamondAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0264 dataSetMarkerArrowDownAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0265 dataSetMarkerArrowUpAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0266 dataSetMarkerArrowRightAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0267 dataSetMarkerArrowLeftAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0268 dataSetMarkerBowTieAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0269 dataSetMarkerHourGlassAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0270 dataSetMarkerCircleAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0271 dataSetMarkerStarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0272 dataSetMarkerXAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0273 dataSetMarkerCrossAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0274 dataSetMarkerAsteriskAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0275 dataSetMarkerHorizontalBarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0276 dataSetMarkerVerticalBarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0277 dataSetMarkerRingAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0278 dataSetMarkerFastCrossAction = datasetSelectMarkerMenu->addAction(QIcon(), QString()); 0279 0280 ui.datasetMarkerMenu->setMenu(datasetMarkerMenu); 0281 connect(datasetMarkerMenu, SIGNAL(triggered(QAction*)), parent, SLOT(datasetMarkerSelected(QAction*))); 0282 0283 // Insert error bar button 0284 ui.formatErrorBar->setEnabled(false); 0285 0286 connect(ui.datasetBrush, SIGNAL(changed(QColor)),parent, SLOT(datasetBrushSelected(QColor))); 0287 connect(ui.datasetPen, SIGNAL(changed(QColor)), parent, SLOT(datasetPenSelected(QColor))); 0288 connect(ui.datasetShowCategory, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowCategoryChanged(bool))); 0289 connect(ui.datasetShowErrorBar, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowErrorBarChanged(bool))); 0290 connect(ui.dataSetShowNumber, SIGNAL(toggled(bool)), parent, SLOT(ui_dataSetShowNumberChanged(bool))); 0291 connect(ui.datasetShowPercent, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowPercentChanged(bool))); 0292 0293 // TODO 0294 // connect(ui.datasetShowSymbol, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowSymbolChanged(bool))); 0295 0296 0297 connect(ui.dataSets, SIGNAL(currentIndexChanged(int)), parent, SLOT(ui_dataSetSelectionChanged(int))); 0298 connect(ui.dataSetAxes, SIGNAL(currentIndexChanged(int)), parent, SLOT(ui_dataSetAxisSelectionChanged(int))); 0299 0300 } 0301 0302 DataSetConfigWidget::Private::~Private() 0303 { 0304 } 0305 0306 0307 // ================================================================ 0308 // class DataSetConfigWidget 0309 0310 0311 DataSetConfigWidget::DataSetConfigWidget(QWidget *parent) 0312 : ConfigSubWidgetBase(parent) 0313 , d(new Private(this)) 0314 { 0315 setObjectName("DataSetConfigWidget"); 0316 0317 setupDialogs(); 0318 createActions(); 0319 } 0320 0321 DataSetConfigWidget::DataSetConfigWidget(QList<ChartType> types, QWidget *parent) 0322 : ConfigSubWidgetBase(types, parent) 0323 , d(new Private(this)) 0324 { 0325 setObjectName("DataSetConfigWidget"); 0326 0327 setupDialogs(); 0328 createActions(); 0329 } 0330 0331 DataSetConfigWidget::~DataSetConfigWidget() 0332 { 0333 delete d; 0334 } 0335 0336 void DataSetConfigWidget::deleteSubDialogs(ChartType type) 0337 { 0338 Q_UNUSED(type) 0339 } 0340 0341 void DataSetConfigWidget::open(ChartShape* shape) 0342 { 0343 debugChartUiDataSet<<shape; 0344 0345 // reset these so we do not risc using old, deleted data 0346 // these are recalculated in updateData() anyway 0347 d->dataSetAxes.clear(); 0348 d->dataSets.clear(); 0349 0350 ConfigSubWidgetBase::open(shape); 0351 } 0352 0353 QAction *DataSetConfigWidget::createAction() 0354 { 0355 return 0; 0356 } 0357 0358 void DataSetConfigWidget::ui_dataSetAxisSelectionChanged(int index) 0359 { 0360 if (index < 0 || d->ui.dataSets->currentIndex() >= d->dataSets.count()) { 0361 return; 0362 } 0363 debugChartUiDataSet<<index<<d->dataSetAxes; 0364 if (index >= d->dataSetAxes.count()) { 0365 // Add the axis 0366 debugChartUiDataSet<<"create secondary y axis"; 0367 emit axisAdded(YAxisDimension, i18n("Axistitle")); 0368 } 0369 if (index < 0 || index >= d->dataSetAxes.count()) { 0370 return; 0371 } 0372 DataSet *dataSet = d->dataSets[d->ui.dataSets->currentIndex()]; 0373 Axis *axis = d->dataSetAxes[index]; 0374 emit dataSetAxisChanged(dataSet, axis); 0375 } 0376 0377 void DataSetConfigWidget::updateMarkers() 0378 { 0379 DataSet *dataSet = d->dataSets[d->selectedDataSet]; 0380 0381 d->dataSetMarkerCircleAction->setIcon(dataSet->markerIcon(MarkerCircle)); 0382 d->dataSetMarkerSquareAction->setIcon(dataSet->markerIcon(MarkerSquare)); 0383 d->dataSetMarkerDiamondAction->setIcon(dataSet->markerIcon(MarkerDiamond)); 0384 d->dataSetMarkerRingAction->setIcon(dataSet->markerIcon(MarkerRing)); 0385 d->dataSetMarkerCrossAction->setIcon(dataSet->markerIcon(MarkerCross)); 0386 d->dataSetMarkerFastCrossAction->setIcon(dataSet->markerIcon(MarkerFastCross)); 0387 d->dataSetMarkerArrowDownAction->setIcon(dataSet->markerIcon(MarkerArrowDown)); 0388 d->dataSetMarkerArrowUpAction->setIcon(dataSet->markerIcon(MarkerArrowUp)); 0389 d->dataSetMarkerArrowRightAction->setIcon(dataSet->markerIcon(MarkerArrowRight)); 0390 d->dataSetMarkerArrowLeftAction->setIcon(dataSet->markerIcon(MarkerArrowLeft)); 0391 d->dataSetMarkerBowTieAction->setIcon(dataSet->markerIcon(MarkerBowTie)); 0392 d->dataSetMarkerHourGlassAction->setIcon(dataSet->markerIcon(MarkerHourGlass)); 0393 d->dataSetMarkerStarAction->setIcon(dataSet->markerIcon(MarkerStar)); 0394 d->dataSetMarkerXAction->setIcon(dataSet->markerIcon(MarkerX)); 0395 d->dataSetMarkerAsteriskAction->setIcon(dataSet->markerIcon(MarkerAsterisk)); 0396 d->dataSetMarkerHorizontalBarAction->setIcon(dataSet->markerIcon(MarkerHorizontalBar)); 0397 d->dataSetMarkerVerticalBarAction->setIcon(dataSet->markerIcon(MarkerVerticalBar)); 0398 0399 switch(dataSet->odfSymbolType()) { 0400 case NoSymbol: 0401 d->ui.datasetMarkerMenu->setText(i18n("None")); 0402 d->ui.datasetMarkerMenu->setIcon(QIcon()); 0403 break; 0404 case NamedSymbol: 0405 d->ui.datasetMarkerMenu->setIcon(dataSet->markerIcon(dataSet->markerStyle())); 0406 d->ui.datasetMarkerMenu->setText(QString()); 0407 break; 0408 case ImageSymbol: 0409 case AutomaticSymbol: 0410 d->ui.datasetMarkerMenu->setText(i18n("Auto")); 0411 d->ui.datasetMarkerMenu->setIcon(QIcon()); 0412 break; 0413 } 0414 } 0415 void DataSetConfigWidget::ui_dataSetErrorBarTypeChanged() 0416 { 0417 if (d->selectedDataSet < 0) { 0418 return; 0419 } 0420 debugChartUiDataSet; 0421 QString type = d->formatErrorBarDialog.widget.errorType->currentText(); 0422 d->ui.formatErrorBar->setText(type); 0423 } 0424 0425 void DataSetConfigWidget::ui_dataSetHasChartTypeChanged(bool b) 0426 { 0427 if (d->selectedDataSet < 0) { 0428 return; 0429 } 0430 debugChartUiDataSet<<b; 0431 DataSet *dataSet = d->dataSets[d->selectedDataSet]; 0432 Q_ASSERT(dataSet); 0433 if (!dataSet) { 0434 return; 0435 } 0436 if (b) { 0437 emit dataSetChartTypeChanged(dataSet, chart->chartType(), chart->chartSubType()); 0438 } else { 0439 emit dataSetChartTypeChanged(dataSet, LastChartType, NoChartSubtype); 0440 } 0441 } 0442 0443 void DataSetConfigWidget::dataSetChartTypeSelected(QAction *action) 0444 { 0445 if (d->selectedDataSet < 0) 0446 return; 0447 0448 debugChartUiDataSet<<action; 0449 0450 ChartType type = LastChartType; 0451 ChartSubtype subtype = NoChartSubtype; 0452 0453 if (action == d->dataSetNormalBarChartAction) { 0454 type = BarChartType; 0455 subtype = NormalChartSubtype; 0456 } else if (action == d->dataSetStackedBarChartAction) { 0457 type = BarChartType; 0458 subtype = StackedChartSubtype; 0459 } else if (action == d->dataSetPercentBarChartAction) { 0460 type = BarChartType; 0461 subtype = PercentChartSubtype; 0462 } 0463 0464 else if (action == d->dataSetNormalLineChartAction) { 0465 type = LineChartType; 0466 subtype = NormalChartSubtype; 0467 } else if (action == d->dataSetStackedLineChartAction) { 0468 type = LineChartType; 0469 subtype = StackedChartSubtype; 0470 } else if (action == d->dataSetPercentLineChartAction) { 0471 type = LineChartType; 0472 subtype = PercentChartSubtype; 0473 } 0474 0475 else if (action == d->dataSetNormalAreaChartAction) { 0476 type = AreaChartType; 0477 subtype = NormalChartSubtype; 0478 } else if (action == d->dataSetStackedAreaChartAction) { 0479 type = AreaChartType; 0480 subtype = StackedChartSubtype; 0481 } else if (action == d->dataSetPercentAreaChartAction) { 0482 type = AreaChartType; 0483 subtype = PercentChartSubtype; 0484 } 0485 0486 else if (action == d->dataSetRadarChartAction) 0487 type = RadarChartType; 0488 else if (action == d->dataSetFilledRadarChartAction) 0489 type = FilledRadarChartType; 0490 0491 else if (action == d->dataSetCircleChartAction) 0492 type = CircleChartType; 0493 else if (action == d->dataSetRingChartAction) 0494 type = RingChartType; 0495 else if (action == d->dataSetScatterChartAction) 0496 type = ScatterChartType; 0497 0498 else if (action == d->dataSetHLCStockChartAction) { 0499 type = StockChartType; 0500 subtype = HighLowCloseChartSubtype; 0501 } else if (action == d->dataSetStackedAreaChartAction) { 0502 type = StockChartType; 0503 subtype = OpenHighLowCloseChartSubtype; 0504 } else if (action == d->dataSetCandlestickStockChartAction) { 0505 type = StockChartType; 0506 subtype = CandlestickChartSubtype; 0507 } 0508 0509 else if (action == d->dataSetBubbleChartAction) 0510 type = BubbleChartType; 0511 0512 // FIXME: Not supported by KoChart yet: 0513 //surface 0514 //gantt 0515 0516 DataSet *dataSet = d->dataSets[d->selectedDataSet]; 0517 Q_ASSERT(dataSet); 0518 if (!dataSet) 0519 return; 0520 0521 const QLatin1String iconName = chartTypeIconName(type, subtype); 0522 if (iconName.size() > 0) 0523 d->ui.dataSetChartTypeMenu->setIcon(QIcon::fromTheme(iconName)); 0524 0525 emit dataSetChartTypeChanged(dataSet, type, subtype); 0526 0527 updateData(type, subtype); 0528 } 0529 0530 void DataSetConfigWidget::datasetMarkerSelected(QAction *action) 0531 { 0532 if (d->selectedDataSet < 0) 0533 return; 0534 0535 const int numDefaultMarkerTypes = 15; 0536 OdfMarkerStyle style = MarkerSquare; 0537 QString type = QString(""); 0538 OdfSymbolType symbolType = NamedSymbol; 0539 if (action == d->dataSetNoMarkerAction) { 0540 symbolType = NoSymbol; 0541 type = "None"; 0542 } else if (action == d->dataSetAutomaticMarkerAction) { 0543 style = (OdfMarkerStyle) (d->selectedDataSet % numDefaultMarkerTypes); 0544 type = "Auto"; 0545 symbolType = AutomaticSymbol; 0546 } else if (action == d->dataSetMarkerCircleAction) { 0547 style = MarkerCircle; 0548 } else if (action == d->dataSetMarkerSquareAction) { 0549 style = MarkerSquare; 0550 } else if (action == d->dataSetMarkerDiamondAction) { 0551 style = MarkerDiamond; 0552 } else if (action == d->dataSetMarkerRingAction) { 0553 style = MarkerRing; 0554 } else if (action == d->dataSetMarkerCrossAction) { 0555 style = MarkerCross; 0556 } else if (action == d->dataSetMarkerFastCrossAction) { 0557 style = MarkerFastCross; 0558 } else if (action == d->dataSetMarkerArrowDownAction) { 0559 style = MarkerArrowDown; 0560 } else if (action == d->dataSetMarkerArrowUpAction) { 0561 style = MarkerArrowUp; 0562 } else if (action == d->dataSetMarkerArrowRightAction) { 0563 style = MarkerArrowRight; 0564 } else if (action == d->dataSetMarkerArrowLeftAction) { 0565 style = MarkerArrowLeft; 0566 } else if (action == d->dataSetMarkerBowTieAction) { 0567 style = MarkerBowTie; 0568 } else if (action == d->dataSetMarkerHourGlassAction) { 0569 style = MarkerHourGlass; 0570 } else if (action == d->dataSetMarkerStarAction) { 0571 style = MarkerStar; 0572 } else if (action == d->dataSetMarkerXAction) { 0573 style = MarkerX; 0574 } else if (action == d->dataSetMarkerAsteriskAction) { 0575 style = MarkerAsterisk; 0576 } else if (action == d->dataSetMarkerHorizontalBarAction) { 0577 style = MarkerHorizontalBar; 0578 } else if (action == d->dataSetMarkerVerticalBarAction) { 0579 style = MarkerVerticalBar; 0580 } 0581 0582 DataSet *dataSet = d->dataSets[d->selectedDataSet]; 0583 Q_ASSERT(dataSet); 0584 if (!dataSet) 0585 return; 0586 0587 if (type.isEmpty()) { 0588 d->ui.datasetMarkerMenu->setIcon(dataSet->markerIcon(style)); 0589 d->ui.datasetMarkerMenu->setText(""); 0590 } else { 0591 d->ui.datasetMarkerMenu->setText(type); 0592 d->ui.datasetMarkerMenu->setIcon(QIcon()); 0593 } 0594 emit dataSetMarkerChanged(dataSet, symbolType, style); 0595 0596 updateData(dataSet->chartType(), dataSet->chartSubType()); 0597 } 0598 0599 void DataSetConfigWidget::datasetBrushSelected(const QColor& color) 0600 { 0601 if (d->selectedDataSet < 0) 0602 return; 0603 0604 emit datasetBrushChanged(d->dataSets[d->selectedDataSet], color, -1); 0605 updateMarkers(); 0606 } 0607 0608 void DataSetConfigWidget::datasetPenSelected(const QColor& color) 0609 { 0610 if (d->selectedDataSet < 0) 0611 return; 0612 0613 emit datasetPenChanged(d->dataSets[d->selectedDataSet], color, -1); 0614 updateMarkers(); 0615 } 0616 0617 void DataSetConfigWidget::updateData(ChartType chartType, ChartSubtype subtype) 0618 { 0619 Q_UNUSED(subtype) 0620 if (!chart) { 0621 return; 0622 } 0623 if (!chartTypes.contains(chartType)) { 0624 return; 0625 } 0626 QList<DataSet*> newDataSets = chart->plotArea()->dataSets(); 0627 debugChartUiDataSet<<d->selectedDataSet<<d->dataSets<<':'<<newDataSets; 0628 0629 blockSignals(true); 0630 d->dataSetAxes.clear(); 0631 d->ui.dataSets->clear(); 0632 0633 // Update the chart type specific settings in the "Data Sets" tab 0634 d->ui.errorBarProperties->hide(); 0635 // TODO: error indication is not implemented 0636 // if (chartType == BarChartType || chartType == LineChartType || chartType == AreaChartType || chartType == ScatterChartType) { 0637 // d->ui.errorBarProperties->show(); 0638 // } 0639 // TODO 0640 // d->ui.datasetShowSymbol->hide(); 0641 // if (chartType == LineChartType || chartType == AreaChartType || chartType == ScatterChartType || chartType == RadarChartType || chartType == FilledRadarChartType) { 0642 // d->ui.datasetShowSymbol->show(); 0643 // } 0644 0645 // Make sure we only allow legal chart type combinations 0646 if (isPolar(chartType)) { 0647 // TODO: check out this claim: 0648 // Pie charts and ring charts have no axes but radar charts do. 0649 // Disable choosing of attached axis if there is none. 0650 bool hasAxes = !(chartType == CircleChartType || chartType == RingChartType); 0651 // d->ui.axisConfiguration->setEnabled(hasAxes); 0652 d->ui.dataSetAxes->setCurrentIndex(-1); 0653 d->ui.dataSetAxes->setEnabled(false); 0654 d->ui.dataSetHasChartType->setEnabled(hasAxes); 0655 d->ui.dataSetChartTypeMenu->setEnabled(hasAxes); 0656 } else { 0657 // All the cartesian chart types have axes. 0658 // d->ui.axisConfiguration->setEnabled(true); 0659 d->dataSetAxes.append(chart->plotArea()->yAxis()); 0660 if (chart->plotArea()->secondaryYAxis() && chart->plotArea()->secondaryYAxis()->isVisible()) { 0661 d->dataSetAxes.append(chart->plotArea()->secondaryYAxis()); 0662 } 0663 d->ui.dataSetAxes->setEnabled(true); 0664 d->ui.dataSetHasChartType->setEnabled(true); 0665 d->ui.dataSetChartTypeMenu->setEnabled(true); 0666 } 0667 0668 // always update, in case titles have changed 0669 foreach (DataSet *dataSet, newDataSets) { 0670 QString title = dataSet->labelData().toString(); 0671 if (title.isEmpty()) 0672 title = i18n("Data Set %1", d->ui.dataSets->count() + 1); 0673 d->ui.dataSets->addItem(title); 0674 } 0675 if (newDataSets != d->dataSets) { 0676 d->selectedDataSet = 0; // new datasets, select the first 0677 d->dataSets = newDataSets; 0678 debugChartUiDataSet<<"new datasets"<<newDataSets; 0679 } 0680 d->ui.dataSets->setCurrentIndex(d->selectedDataSet); 0681 0682 blockSignals(false); 0683 0684 ui_dataSetSelectionChanged(d->selectedDataSet); 0685 } 0686 0687 0688 void DataSetConfigWidget::slotShowFormatErrorBarDialog() 0689 { 0690 d->formatErrorBarDialog.show(); 0691 } 0692 0693 void DataSetConfigWidget::setupDialogs() 0694 { 0695 // Format Error Bars 0696 connect(d->ui.formatErrorBar, SIGNAL(clicked()), 0697 this, SLOT(slotShowFormatErrorBarDialog())); 0698 connect(&d->formatErrorBarDialog, SIGNAL(accepted()), 0699 this, SLOT(ui_dataSetErrorBarTypeChanged())); 0700 } 0701 0702 void DataSetConfigWidget::createActions() 0703 { 0704 } 0705 0706 void DataSetConfigWidget::ui_dataSetSelectionChanged(int index) 0707 { 0708 // Check for valid index 0709 debugChartUiDataSet<<index<<d->dataSets; 0710 if (index < 0 || index >= d->dataSets.size()) { 0711 return; 0712 } 0713 blockSignals(true); 0714 0715 DataSet *dataSet = d->dataSets[index]; 0716 //d->ui.datasetColor->setText(axis->titleText()); 0717 d->ui.dataSetAxes->setCurrentIndex(d->dataSetAxes.indexOf(dataSet->attachedAxis())); 0718 0719 d->ui.datasetBrush->setColor(dataSet->brush().color()); 0720 0721 d->ui.datasetPen->setColor(dataSet->pen().color()); 0722 0723 debugChartUiDataSet<<dataSet->valueLabelType(); 0724 d->ui.datasetShowCategory->setChecked(dataSet->valueLabelType().category); 0725 0726 d->ui.dataSetShowNumber->setChecked(dataSet->valueLabelType().number); 0727 0728 d->ui.datasetShowPercent->setChecked(dataSet->valueLabelType().percentage); 0729 0730 // TODO 0731 // d->ui.datasetShowSymbol->setChecked(dataSet->valueLabelType().symbol); 0732 0733 d->ui.dataSetHasChartType->setChecked(dataSet->chartType() != LastChartType); 0734 d->ui.dataSetChartTypeMenu->setEnabled(dataSet->chartType() != LastChartType); 0735 0736 Q_ASSERT(d->ui.dataSetChartTypeMenu->menu()); 0737 0738 d->ui.dataSetChartTypeMenu->setIcon(ICON2(dataSet->chartType(), dataSet->chartSubType())); 0739 0740 d->selectedDataSet = index; 0741 0742 blockSignals(false); 0743 0744 updateMarkers(); 0745 0746 ChartType chartType = dataSet->chartType(); 0747 if (chartType == LastChartType) { 0748 chartType = chart->chartType(); 0749 } 0750 bool disableMarkers = chartType == BarChartType || chartType == StockChartType || chartType == CircleChartType 0751 || chartType == RingChartType || chartType == BubbleChartType; 0752 d->ui.datasetMarkerMenu->setDisabled(disableMarkers); 0753 } 0754 0755 void DataSetConfigWidget::ui_datasetShowCategoryChanged(bool b) 0756 { 0757 if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) { 0758 return; 0759 } 0760 debugChartUiDataSet<<b; 0761 emit datasetShowCategoryChanged(d->dataSets[d->selectedDataSet], b, -1); 0762 } 0763 0764 void DataSetConfigWidget::ui_datasetShowErrorBarChanged(bool b) 0765 { 0766 if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) { 0767 return; 0768 } 0769 debugChartUiDataSet<<b; 0770 d->ui.formatErrorBar->setEnabled(b); 0771 } 0772 0773 void DataSetConfigWidget::ui_dataSetShowNumberChanged(bool b) 0774 { 0775 if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) { 0776 return; 0777 } 0778 debugChartUiDataSet<<b; 0779 emit dataSetShowNumberChanged(d->dataSets[d->selectedDataSet], b, -1); 0780 } 0781 0782 void DataSetConfigWidget::ui_datasetShowPercentChanged(bool b) 0783 { 0784 if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) { 0785 return; 0786 } 0787 debugChartUiDataSet<<b; 0788 emit datasetShowPercentChanged(d->dataSets[d->selectedDataSet], b, -1); 0789 } 0790 0791 void DataSetConfigWidget::ui_datasetShowSymbolChanged(bool b) 0792 { 0793 if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) { 0794 return; 0795 } 0796 debugChartUiDataSet<<b; 0797 emit datasetShowSymbolChanged(d->dataSets[d->selectedDataSet], b, -1); 0798 }