From d12f993ca802ff02091d6a5141d2847641bc65a8 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 20 Nov 2013 14:49:06 +0200 Subject: Multi series selection part 2: scatter Task-number: QTRD-2556 Change-Id: I9ee193141dff6603b47db28b0ed0682db6f914c8 Reviewed-by: Mika Salmela --- tests/scattertest/main.cpp | 11 +-- tests/scattertest/scatterchart.cpp | 144 ++++++++++++++++++++++++++++--------- tests/scattertest/scatterchart.h | 5 ++ 3 files changed, 122 insertions(+), 38 deletions(-) (limited to 'tests/scattertest') diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 2e8792ad..7734faa2 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -100,6 +100,9 @@ int main(int argc, char **argv) QPushButton *setSelectedItemButton = new QPushButton(widget); setSelectedItemButton->setText(QStringLiteral("Select/deselect item 3")); + QPushButton *addSeriesButton = new QPushButton(widget); + addSeriesButton->setText(QStringLiteral("Add Series")); + QPushButton *startTimerButton = new QPushButton(widget); startTimerButton->setText(QStringLiteral("Start/stop timer")); @@ -158,6 +161,7 @@ int main(int argc, char **argv) vLayout->addWidget(removeOneButton, 0, Qt::AlignTop); vLayout->addWidget(removeBunchButton, 0, Qt::AlignTop); vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop); + vLayout->addWidget(addSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop); vLayout->addWidget(backgroundCheckBox); @@ -202,6 +206,8 @@ int main(int argc, char **argv) &ScatterDataModifier::removeBunch); QObject::connect(setSelectedItemButton, &QPushButton::clicked, modifier, &ScatterDataModifier::selectItem); + QObject::connect(addSeriesButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::addSeries); QObject::connect(startTimerButton, &QPushButton::clicked, modifier, &ScatterDataModifier::startStopTimer); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, @@ -215,11 +221,6 @@ int main(int argc, char **argv) SLOT(changeShadowQuality(int))); QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality, &QComboBox::setCurrentIndex); - QObject::connect(chart, &Q3DScatter::shadowQualityChanged, modifier, - &ScatterDataModifier::shadowQualityUpdatedByVisual); - QObject::connect(chart, &Q3DScatter::selectedItemIndexChanged, modifier, - &ScatterDataModifier::handleSelectionChange); - QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier, &ScatterDataModifier::changeFont); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index fa59c204..6b809198 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -32,7 +32,9 @@ const int numberOfItems = 10000; ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) : m_chart(scatter), m_fontSize(30.0f), - m_selectedItem(-1) + m_loopCounter(0), + m_selectedItem(-1), + m_targetSeries(0) { QFont font = m_chart->font(); font.setPointSize(m_fontSize); @@ -44,17 +46,15 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) m_chart->setAxisX(new Q3DValueAxis); m_chart->setAxisY(new Q3DValueAxis); m_chart->setAxisZ(new Q3DValueAxis); - QScatter3DSeries *series = new QScatter3DSeries; - QScatter3DSeries *series2 = new QScatter3DSeries; - m_chart->addSeries(series); - m_chart->addSeries(series2); - series->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"); - series->setItemLabelFormat("** @xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel **"); + createAndAddSeries(); + createAndAddSeries(); m_chart->setSelectionMode(QDataVis::SelectionItem); - connect(&m_timer, &QTimer::timeout, this, &ScatterDataModifier::timeout); + QObject::connect(&m_timer, &QTimer::timeout, this, &ScatterDataModifier::timeout); + QObject::connect(m_chart, &Q3DScatter::shadowQualityChanged, this, + &ScatterDataModifier::shadowQualityUpdatedByVisual); } ScatterDataModifier::~ScatterDataModifier() @@ -186,7 +186,13 @@ void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality s void ScatterDataModifier::clear() { - m_chart->seriesList().at(0)->dataProxy()->resetArray(0); + foreach (QScatter3DSeries *series, m_chart->seriesList()) { + m_chart->removeSeries(series); + delete series; + } + + m_targetSeries = 0; + qDebug() << m_loopCounter << "Cleared array"; } @@ -209,74 +215,98 @@ void ScatterDataModifier::resetAxes() void ScatterDataModifier::addOne() { + if (!m_targetSeries) + createAndAddSeries(); + QScatterDataItem item(randVector()); - int addIndex = m_chart->seriesList().at(0)->dataProxy()->addItem(item); - qDebug() << m_loopCounter << "added one to index:" << addIndex << "array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + int addIndex = m_targetSeries->dataProxy()->addItem(item); + qDebug() << m_loopCounter << "added one to index:" << addIndex << "array size:" << m_targetSeries->dataProxy()->array()->size(); } void ScatterDataModifier::addBunch() { + if (!m_targetSeries) + createAndAddSeries(); + QScatterDataArray items(100); for (int i = 0; i < items.size(); i++) items[i].setPosition(randVector()); - int addIndex = m_chart->seriesList().at(0)->dataProxy()->addItems(items); - qDebug() << m_loopCounter << "added bunch to index:" << addIndex << "array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + int addIndex = m_targetSeries->dataProxy()->addItems(items); + qDebug() << m_loopCounter << "added bunch to index:" << addIndex << "array size:" << m_targetSeries->dataProxy()->array()->size(); } void ScatterDataModifier::insertOne() { + if (!m_targetSeries) + createAndAddSeries(); + QScatterDataItem item(randVector()); - m_chart->seriesList().at(0)->dataProxy()->insertItem(0, item); - qDebug() << m_loopCounter << "Inserted one, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + m_targetSeries->dataProxy()->insertItem(0, item); + qDebug() << m_loopCounter << "Inserted one, array size:" << m_targetSeries->dataProxy()->array()->size(); } void ScatterDataModifier::insertBunch() { + if (!m_targetSeries) + createAndAddSeries(); + QScatterDataArray items(100); for (int i = 0; i < items.size(); i++) items[i].setPosition(randVector()); - m_chart->seriesList().at(0)->dataProxy()->insertItems(0, items); - qDebug() << m_loopCounter << "Inserted bunch, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + m_targetSeries->dataProxy()->insertItems(0, items); + qDebug() << m_loopCounter << "Inserted bunch, array size:" << m_targetSeries->dataProxy()->array()->size(); } void ScatterDataModifier::changeOne() { - if (m_selectedItem >= 0 && m_chart->seriesList().at(0)->dataProxy()->array()->size()) { + if (!m_targetSeries) + createAndAddSeries(); + + if (m_selectedItem >= 0 && m_targetSeries->dataProxy()->array()->size()) { QScatterDataItem item(randVector()); - m_chart->seriesList().at(0)->dataProxy()->setItem(m_selectedItem, item); - qDebug() << m_loopCounter << "Changed one, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + m_targetSeries->dataProxy()->setItem(m_selectedItem, item); + qDebug() << m_loopCounter << "Changed one, array size:" << m_targetSeries->dataProxy()->array()->size(); } } void ScatterDataModifier::changeBunch() { - if (m_chart->seriesList().at(0)->dataProxy()->array()->size()) { - int amount = qMin(m_chart->seriesList().at(0)->dataProxy()->array()->size(), 100); + if (!m_targetSeries) + createAndAddSeries(); + + if (m_targetSeries->dataProxy()->array()->size()) { + int amount = qMin(m_targetSeries->dataProxy()->array()->size(), 100); QScatterDataArray items(amount); for (int i = 0; i < items.size(); i++) items[i].setPosition(randVector()); - m_chart->seriesList().at(0)->dataProxy()->setItems(0, items); - qDebug() << m_loopCounter << "Changed bunch, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + m_targetSeries->dataProxy()->setItems(0, items); + qDebug() << m_loopCounter << "Changed bunch, array size:" << m_targetSeries->dataProxy()->array()->size(); } } void ScatterDataModifier::removeOne() { + if (!m_targetSeries) + createAndAddSeries(); + if (m_selectedItem >= 0) { - m_chart->seriesList().at(0)->dataProxy()->removeItems(m_selectedItem, 1); - qDebug() << m_loopCounter << "Removed one, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + m_targetSeries->dataProxy()->removeItems(m_selectedItem, 1); + qDebug() << m_loopCounter << "Removed one, array size:" << m_targetSeries->dataProxy()->array()->size(); } } void ScatterDataModifier::removeBunch() { - m_chart->seriesList().at(0)->dataProxy()->removeItems(0, 100); - qDebug() << m_loopCounter << "Removed bunch, array size:" << m_chart->seriesList().at(0)->dataProxy()->array()->size(); + if (!m_targetSeries) + createAndAddSeries(); + + m_targetSeries->dataProxy()->removeItems(0, 100); + qDebug() << m_loopCounter << "Removed bunch, array size:" << m_targetSeries->dataProxy()->array()->size(); } void ScatterDataModifier::timeout() { - int doWhat = rand() % 8; + int doWhat = rand() % 10; if (!(rand() % 100)) doWhat = -1; @@ -305,6 +335,15 @@ void ScatterDataModifier::timeout() case 7: removeBunch(); break; + case 8: + addSeries(); + break; + case 9: + if (m_chart->seriesList().size()) + m_targetSeries = m_chart->seriesList().at(rand() % m_chart->seriesList().size()); + else + addSeries(); + break; default: clear(); break; @@ -326,18 +365,29 @@ void ScatterDataModifier::startStopTimer() void ScatterDataModifier::selectItem() { + if (!m_targetSeries) + createAndAddSeries(); + int targetItem(3); int noSelection(-1); - if (m_selectedItem != targetItem) - m_chart->setSelectedItemIndex(targetItem); + if (m_selectedItem != targetItem || m_targetSeries != m_chart->seriesList().at(0)) + m_chart->seriesList().at(0)->setSelectedItem(targetItem); else - m_chart->setSelectedItemIndex(noSelection); + m_chart->seriesList().at(0)->setSelectedItem(noSelection); } void ScatterDataModifier::handleSelectionChange(int index) { m_selectedItem = index; - qDebug() << "Selected item index:" << index; + m_targetSeries = static_cast(sender()); + int seriesIndex = 0; + foreach (QScatter3DSeries *series, m_chart->seriesList()) { + if (series == sender()) + break; + seriesIndex++; + } + + qDebug() << "Selected item index:" << index << "series:" << seriesIndex; } void ScatterDataModifier::setGradient() @@ -374,6 +424,16 @@ void ScatterDataModifier::setGradient() m_chart->setColorStyle(QDataVis::ColorStyleUniform); } +void ScatterDataModifier::addSeries() +{ + QScatter3DSeries *series = createAndAddSeries(); + + QScatter3DSeries *oldTargetSeries = m_targetSeries; + m_targetSeries = series; // adding always adds to target series, so fake it for a bit + addOne(); // add one random item to start the new series off + m_targetSeries = oldTargetSeries; +} + void ScatterDataModifier::changeShadowQuality(int quality) { QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality); @@ -398,3 +458,21 @@ QVector3D ScatterDataModifier::randVector() (float)(rand() % 100) / 100.0f - (float)(rand() % 100) / 100.0f, (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f); } + +QScatter3DSeries *ScatterDataModifier::createAndAddSeries() +{ + static int counter = 0; + + QScatter3DSeries *series = new QScatter3DSeries; + + if (!m_targetSeries) + m_targetSeries = series; + + m_chart->addSeries(series); + series->setItemLabelFormat(QString("%1: @xLabel - @yLabel - @zLabel").arg(counter++)); + + QObject::connect(series, &QScatter3DSeries::selectedItemChanged, this, + &ScatterDataModifier::handleSelectionChange); + + return series; +} diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index db7f3ac0..2567613f 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -20,6 +20,7 @@ #define SCATTERDATAMODIFIER_H #include +#include #include #include @@ -63,17 +64,21 @@ public slots: void selectItem(); void handleSelectionChange(int index); void setGradient(); + void addSeries(); signals: void shadowQualityChanged(int quality); private: QVector3D randVector(); + QScatter3DSeries *createAndAddSeries(); + Q3DScatter *m_chart; int m_fontSize; QTimer m_timer; int m_loopCounter; int m_selectedItem; + QScatter3DSeries *m_targetSeries; }; #endif -- cgit v1.2.3