12 #include <KDChartWidget_p.h>
27 #include <KDABLibFakes>
33 Widget::Private::Private(
Widget *qq)
38 , m_cartPlane(&m_chart)
39 , m_polPlane(&m_chart)
46 layout.addWidget(&m_chart);
49 Widget::Private::~Private()
65 Widget::Widget(QWidget *parent)
67 , _d(new Private(this))
89 if (!checkDatasetWidth(1))
92 QStandardItemModel &model =
d->m_model;
94 justifyModelSize(data.size(), column + 1);
96 for (
int i = 0; i < data.size(); ++i) {
97 const QModelIndex index = model.index(i, column);
98 model.setData(index, QVariant(data[i]), Qt::DisplayRole);
100 if (!title.isEmpty())
101 model.setHeaderData(column, Qt::Horizontal, QVariant(title));
106 if (!checkDatasetWidth(2))
109 QStandardItemModel &model =
d->m_model;
111 justifyModelSize(data.size(), (column + 1) * 2);
113 for (
int i = 0; i < data.size(); ++i) {
114 QModelIndex index = model.index(i, column * 2);
115 model.setData(index, QVariant(data[i].first), Qt::DisplayRole);
117 index = model.index(i, column * 2 + 1);
118 model.setData(index, QVariant(data[i].second), Qt::DisplayRole);
120 if (!title.isEmpty()) {
121 model.setHeaderData(column, Qt::Horizontal, QVariant(title));
127 if (!checkDatasetWidth(1))
130 QStandardItemModel &model =
d->m_model;
132 justifyModelSize(row + 1, column + 1);
134 const QModelIndex index = model.index(row, column);
135 model.setData(index, QVariant(data), Qt::DisplayRole);
140 if (!checkDatasetWidth(2))
143 QStandardItemModel &model =
d->m_model;
145 justifyModelSize(row + 1, (column + 1) * 2);
147 QModelIndex index = model.index(row, column * 2);
148 model.setData(index, QVariant(data.first), Qt::DisplayRole);
150 index = model.index(row, column * 2 + 1);
151 model.setData(index, QVariant(data.second), Qt::DisplayRole);
160 d->usedDatasetWidth = 0;
168 d->m_chart.setGlobalLeading(left, top, right, bottom);
176 d->m_chart.setGlobalLeadingLeft(leading);
184 return d->m_chart.globalLeadingLeft();
192 d->m_chart.setGlobalLeadingTop(leading);
200 return d->m_chart.globalLeadingTop();
208 d->m_chart.setGlobalLeadingRight(leading);
216 return d->m_chart.globalLeadingRight();
224 d->m_chart.setGlobalLeadingBottom(leading);
232 return d->m_chart.globalLeadingBottom();
240 return d->m_chart.headerFooter();
248 return d->m_chart.headerFooters();
259 newHeader->setType(
type);
260 newHeader->setPosition(position);
261 newHeader->setText(text);
262 d->m_chart.addHeaderFooter(newHeader);
271 d->m_chart.addHeaderFooter(header);
277 d->m_chart.replaceHeaderFooter(header, oldHeader);
282 d->m_chart.takeHeaderFooter(header);
290 return d->m_chart.legend();
298 return d->m_chart.legends();
317 legend->setParent(&
d->m_chart);
324 legend->setParent(&
d->m_chart);
325 d->m_chart.replaceLegend(
legend, oldLegend);
336 qDebug() <<
"diagram(): coordinatePlane() was NULL";
368 return d->m_chart.coordinatePlane();
388 if (chartType != oldType) {
389 if (chartType !=
NoType) {
392 d->m_chart.takeCoordinatePlane(&
d->m_polPlane);
393 d->m_chart.addCoordinatePlane(&
d->m_cartPlane);
395 d->m_chart.replaceCoordinatePlane(&
d->m_cartPlane);
399 d->m_chart.takeCoordinatePlane(&
d->m_cartPlane);
400 d->m_chart.addCoordinatePlane(&
d->m_polPlane);
402 d->m_chart.replaceCoordinatePlane(&
d->m_polPlane);
414 diag =
new Plotter(&
d->m_chart, &
d->m_cartPlane);
428 if (diag !=
nullptr) {
433 qobject_cast<AbstractCartesianDiagram *>(diag);
434 const auto constAxes = oldDiag->axes();
436 oldDiag->takeAxis(axis);
437 newDiag->addAxis(axis);
441 const auto constLegends =
d->m_chart.legends();
442 for (
Legend *l : constLegends) {
454 if (chartType !=
NoType) {
455 if (chartType != oldType || chartSubType !=
subType())
457 d->m_chart.resize(size());
461 template<
class DiagramType,
class Subtype>
464 if (
auto *dia = qobject_cast<DiagramType *>(_dia)) {
491 setSubtype<BarDiagram>(dia, BarDiagram::Rows);
494 Q_ASSERT_X(
false,
"Widget::setSubType",
"Sub-type not supported!");
506 if (qobject_cast<BarDiagram *>(dia))
508 else if (qobject_cast<LineDiagram *>(dia))
510 else if (qobject_cast<Plotter *>(dia))
512 else if (qobject_cast<PieDiagram *>(dia))
514 else if (qobject_cast<PolarDiagram *>(dia))
516 else if (qobject_cast<RingDiagram *>(dia))
528 auto *barDia = qobject_cast<BarDiagram *>(dia);
529 auto *lineDia = qobject_cast<LineDiagram *>(dia);
530 auto *plotterDia = qobject_cast<Plotter *>(dia);
537 #define TEST_SUB_TYPE(DIAGRAM, INTERNALSUBTYPE, SUBTYPE) \
539 if (DIAGRAM && DIAGRAM->type() == INTERNALSUBTYPE) \
570 "Widget::subType",
"Chart type not supported!");
579 bool Widget::checkDatasetWidth(
int width)
581 if (width ==
diagram()->datasetDimension()) {
582 d->usedDatasetWidth = width;
585 qDebug() <<
"The current diagram type doesn't support this data dimension.";
599 void Widget::justifyModelSize(
int rows,
int columns)
601 QAbstractItemModel &model =
d->m_model;
602 const int currentRows = model.rowCount();
603 const int currentCols = model.columnCount();
605 if (currentCols < columns)
606 if (!model.insertColumns(currentCols, columns - currentCols))
607 qDebug() <<
"justifyModelSize: could not increase model size.";
608 if (currentRows < rows)
609 if (!model.insertRows(currentRows, rows - currentRows))
610 qDebug() <<
"justifyModelSize: could not increase model size.";
612 Q_ASSERT(model.rowCount() >= rows);
613 Q_ASSERT(model.columnCount() >= columns);
#define KDAB_SET_OBJECT_NAME(x)
Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane,...
virtual void replaceDiagram(AbstractDiagram *diagram, AbstractDiagram *oldDiagram=nullptr)
AbstractDiagram * diagram()
AbstractDiagram defines the interface for diagram classes.
void setModel(QAbstractItemModel *model) override
BarDiagram defines a common bar diagram.
Legend defines the interface for the legend drawing class.
void setDiagram(KDChart::AbstractDiagram *newDiagram)
A convenience method doing the same as replaceDiagram( newDiagram, 0 );.
void setPosition(Position position)
Specify the position of a non-floating legend.
LineDiagram defines a common line diagram.
PieDiagram defines a common pie diagram.
Plotter defines a diagram type plotting two-dimensional data.
PolarDiagram defines a common polar diagram.
Defines a position, using compass terminology.
RingDiagram defines a common ring diagram.