From ec8b39fe3792b6210f75beddc7fcb88974ae81a3 2014-10-22 06:08:24 From: Miikka Heikkinen Date: 2014-10-22 06:08:24 Subject: [PATCH] Fix axis attachments in QML. Now attaching same axis to multiple series is possible without spawning an extraneous default axis. Task-number: QTRD-3321 Change-Id: I561b3ca5c814e3046ed4078a2070e2c3e6ddf030 Reviewed-by: Mika Salmela Reviewed-by: Titta Heikkala --- diff --git a/src/chartsqml2/declarativechart.cpp b/src/chartsqml2/declarativechart.cpp index 89010d3..58d2529 100644 --- a/src/chartsqml2/declarativechart.cpp +++ b/src/chartsqml2/declarativechart.cpp @@ -375,14 +375,39 @@ void DeclarativeChart::componentComplete() QQuickItem::componentComplete(); } +void DeclarativeChart::seriesAxisAttachHelper(QAbstractSeries *series, QAbstractAxis *axis, + Qt::Orientations orientation, + Qt::Alignment alignment) +{ + if (!series->attachedAxes().contains(axis)) { + // Remove & delete old axes that are not attached to any other series + foreach (QAbstractAxis* oldAxis, m_chart->axes(orientation, series)) { + bool otherAttachments = false; + if (oldAxis != axis) { + foreach (QAbstractSeries *oldSeries, m_chart->series()) { + if (oldSeries != series && oldSeries->attachedAxes().contains(oldAxis)) { + otherAttachments = true; + break; + } + } + if (!otherAttachments) { + m_chart->removeAxis(oldAxis); + delete oldAxis; + } + } + } + if (!m_chart->axes(orientation).contains(axis)) + m_chart->addAxis(axis, alignment); + + series->attachAxis(axis); + } +} + void DeclarativeChart::handleAxisXSet(QAbstractAxis *axis) { QAbstractSeries *s = qobject_cast(sender()); if (axis && s) { - if (!m_chart->axes(Qt::Horizontal).contains(axis)) - m_chart->setAxisX(axis, s); - if (!s->attachedAxes().contains(axis)) - s->attachAxis(axis); + seriesAxisAttachHelper(s, axis, Qt::Horizontal, Qt::AlignBottom); } else { qWarning() << "Trying to set axisX to null."; } @@ -392,16 +417,7 @@ void DeclarativeChart::handleAxisXTopSet(QAbstractAxis *axis) { QAbstractSeries *s = qobject_cast(sender()); if (axis && s) { - if (!m_chart->axes(Qt::Horizontal).contains(axis)) { - QList oldAxes = m_chart->axes(Qt::Horizontal, s); - foreach (QAbstractAxis* a, oldAxes) { - m_chart->removeAxis(a); - delete a; - } - m_chart->addAxis(axis, Qt::AlignTop); - } - if (!s->attachedAxes().contains(axis)) - s->attachAxis(axis); + seriesAxisAttachHelper(s, axis, Qt::Horizontal, Qt::AlignTop); } else { qWarning() << "Trying to set axisXTop to null."; } @@ -411,10 +427,7 @@ void DeclarativeChart::handleAxisYSet(QAbstractAxis *axis) { QAbstractSeries *s = qobject_cast(sender()); if (axis && s) { - if (!m_chart->axes(Qt::Vertical).contains(axis)) - m_chart->setAxisY(axis, s); - if (!s->attachedAxes().contains(axis)) - s->attachAxis(axis); + seriesAxisAttachHelper(s, axis, Qt::Vertical, Qt::AlignLeft); } else { qWarning() << "Trying to set axisY to null."; } @@ -424,16 +437,7 @@ void DeclarativeChart::handleAxisYRightSet(QAbstractAxis *axis) { QAbstractSeries *s = qobject_cast(sender()); if (axis && s) { - if (!m_chart->axes(Qt::Vertical).contains(axis)) { - QList oldAxes = m_chart->axes((Qt::Vertical), s); - foreach (QAbstractAxis* a, oldAxes) { - m_chart->removeAxis(a); - delete a; - } - m_chart->addAxis(axis, Qt::AlignRight); - } - if (!s->attachedAxes().contains(axis)) - s->attachAxis(axis); + seriesAxisAttachHelper(s, axis, Qt::Vertical, Qt::AlignRight); } else { qWarning() << "Trying to set axisYRight to null."; } @@ -932,13 +936,13 @@ QAbstractSeries *DeclarativeChart::createSeries(int type, QString name, QAbstrac series->setName(name); m_chart->addSeries(series); + if (!axisX || !axisY) + initializeAxes(series); + if (axisX) setAxisX(axisX, series); if (axisY) setAxisY(axisY, series); - - if (series->attachedAxes().count() < 2) - initializeAxes(series); } return series; @@ -954,14 +958,14 @@ void DeclarativeChart::removeSeries(QAbstractSeries *series) void DeclarativeChart::setAxisX(QAbstractAxis *axis, QAbstractSeries *series) { - if (axis) - m_chart->setAxisX(axis, series); + if (axis && series) + seriesAxisAttachHelper(series, axis, Qt::Horizontal, Qt::AlignBottom); } void DeclarativeChart::setAxisY(QAbstractAxis *axis, QAbstractSeries *series) { - if (axis) - m_chart->setAxisY(axis, series); + if (axis && series) + seriesAxisAttachHelper(series, axis, Qt::Vertical, Qt::AlignLeft); } void DeclarativeChart::createDefaultAxes() diff --git a/src/chartsqml2/declarativechart.h b/src/chartsqml2/declarativechart.h index 680b7b7..a78ebda 100644 --- a/src/chartsqml2/declarativechart.h +++ b/src/chartsqml2/declarativechart.h @@ -208,6 +208,8 @@ protected: private: void initChart(QChart::ChartType type); + void seriesAxisAttachHelper(QAbstractSeries *series, QAbstractAxis *axis, + Qt::Orientations orientation, Qt::Alignment alignment); // Extending QChart with DeclarativeChart is not possible because QObject does not support // multi inheritance, so we now have a QChart as a member instead QChart *m_chart;