diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-08-20 11:49:42 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-08-21 07:50:54 +0300 |
commit | 3646f3475c932a1cc7b1b96cf1c89b3b301e80ef (patch) | |
tree | 968f28889c13150c82632f99afbdc8edc1859b2e | |
parent | 62966a4929b845af18c3b9670b03636c86f24868 (diff) |
Implement selection label formatting
Change-Id: Iae57b93be41ffeeb5ef8fc6ff625af22a7f2d21a
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
37 files changed, 335 insertions, 187 deletions
diff --git a/examples/qmlbarchart/qml/qmlbarchart/main.qml b/examples/qmlbarchart/qml/qmlbarchart/main.qml index 67d9aad0..1fbd4682 100644 --- a/examples/qmlbarchart/qml/qmlbarchart/main.qml +++ b/examples/qmlbarchart/qml/qmlbarchart/main.qml @@ -105,6 +105,7 @@ Item { min: 0 max: 35 labelFormat: "%.1f M\u20AC" + title: "Annual expenses" } Bars3D { id: testchart @@ -124,6 +125,7 @@ Item { axisX: rowAxis axisY: valueAxis axisZ: columnAxis + itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel" } } @@ -195,9 +197,11 @@ Item { if (valueMapping.valueRole == "expenses") { valueMapping.valueRole = "income" mappingButtonText.text = "Show Expenses" + valueAxis.title = "Annual income" } else { valueMapping.valueRole = "expenses" mappingButtonText.text = "Show Income" + valueAxis.title = "Annual expenses" } } } diff --git a/examples/qmlscatter/qml/qmlscatter/main.qml b/examples/qmlscatter/qml/qmlscatter/main.qml index 6238529d..33ee6303 100644 --- a/examples/qmlscatter/qml/qmlscatter/main.qml +++ b/examples/qmlscatter/qml/qmlscatter/main.qml @@ -79,6 +79,7 @@ Item { shadowQuality: Scatter3D.ShadowNone selectionMode: Scatter3D.ModeItem labelTransparency: Scatter3D.TransparencyNoBackground + itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel" Component.onCompleted: { console.log("testscatter complete"); diff --git a/examples/rainfall/rainfallchart.cpp b/examples/rainfall/rainfallchart.cpp index 1b3c574f..05b9119c 100644 --- a/examples/rainfall/rainfallchart.cpp +++ b/examples/rainfall/rainfallchart.cpp @@ -40,7 +40,6 @@ RainfallChart::RainfallChart(Q3DBars *rainfall) m_columnCount = m_numericMonths.size(); m_proxy = new VariantBarDataProxy; - m_proxy->setItemLabelFormat(QStringLiteral(" mm")); m_chart->setDataProxy(m_proxy); updateYearsList(2000, 2012); @@ -54,7 +53,7 @@ RainfallChart::RainfallChart(Q3DBars *rainfall) months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December"; m_chart->rowAxis()->setTitle("Year"); m_chart->columnAxis()->setTitle("Month"); - m_chart->valueAxis()->setTitle(QString("rainfall (in mm) in city %1").arg(m_city - 1)); + m_chart->valueAxis()->setTitle(QString("rainfall in city %1").arg(m_city - 1)); m_chart->valueAxis()->setLabelFormat("%d mm"); m_chart->rowAxis()->setCategoryLabels(m_years); m_chart->columnAxis()->setCategoryLabels(months); @@ -108,7 +107,7 @@ void RainfallChart::timeout() m_city = 2; m_proxy->mapping()->setValueIndex(m_city); - m_chart->valueAxis()->setTitle(QString("rainfall (in mm) in city %1").arg(m_city - 1)); + m_chart->valueAxis()->setTitle(QString("rainfall in city %1").arg(m_city - 1)); } void RainfallChart::updateYearsList(int start, int end) diff --git a/examples/scatterchart/scatterchart.cpp b/examples/scatterchart/scatterchart.cpp index c4cb6d15..8655898b 100644 --- a/examples/scatterchart/scatterchart.cpp +++ b/examples/scatterchart/scatterchart.cpp @@ -34,8 +34,10 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) m_chart->setObjectType(QDataVis::Spheres, true); m_chart->setTheme(QDataVis::ThemeBrownSand); m_chart->setShadowQuality(QDataVis::ShadowHigh); + m_chart->setCameraPreset(QDataVis::PresetFront); QScatterDataProxy *proxy = new QScatterDataProxy; + proxy->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"); m_chart->setDataProxy(proxy); connect(&m_timer, &QTimer::timeout, this, &ScatterDataModifier::timeout); @@ -54,9 +56,9 @@ void ScatterDataModifier::start() void ScatterDataModifier::addData() { // Add labels - m_chart->valueAxisX()->setTitle("Somethings"); - m_chart->valueAxisY()->setTitle("Values"); - m_chart->valueAxisZ()->setTitle("Others"); + m_chart->valueAxisX()->setTitle("X"); + m_chart->valueAxisY()->setTitle("Y"); + m_chart->valueAxisZ()->setTitle("Z"); m_chart->valueAxisX()->setRange(-50.0, 50.0); m_chart->valueAxisY()->setRange(-1.0, 1.0); m_chart->valueAxisZ()->setRange(-50.0, 50.0); diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp index 558ea755..68feb2fe 100644 --- a/examples/widget/chart.cpp +++ b/examples/widget/chart.cpp @@ -80,6 +80,7 @@ void ChartModifier::restart(bool dynamicData) m_chart->setFont(QFont("Times Roman", 20)); } else { m_chart->dataProxy()->resetArray(0); + m_chart->dataProxy()->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel")); // Set up sample space m_chart->setDataWindow(m_rowCount, m_columnCount); // Set selection mode to full @@ -126,12 +127,11 @@ void ChartModifier::addDataSet() // Use default data proxy to feed data directly in expected format QBarDataProxy *proxy = m_chart->dataProxy(); - proxy->setItemLabelFormat(celsiusString); // Add labels m_chart->rowAxis()->setTitle("Year"); m_chart->columnAxis()->setTitle("Month"); - m_chart->valueAxis()->setTitle("Average temperature (" + celsiusString + ")"); + m_chart->valueAxis()->setTitle("Average temperature"); m_chart->rowAxis()->setCategoryLabels(years); m_chart->columnAxis()->setCategoryLabels(months); m_chart->valueAxis()->setSegmentCount(m_segments); @@ -160,6 +160,7 @@ void ChartModifier::addDataSet() // Add data to chart (chart assumes ownership) proxy->resetArray(dataSet); + proxy->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel")); } void ChartModifier::addRow() diff --git a/src/datavis3d/axis/qvalueaxis.cpp b/src/datavis3d/axis/qvalueaxis.cpp index d2634122..c51eec9c 100644 --- a/src/datavis3d/axis/qvalueaxis.cpp +++ b/src/datavis3d/axis/qvalueaxis.cpp @@ -308,7 +308,7 @@ void QValueAxisPrivate::updateLabels() QString formatString(m_labelFormat); if (formatString.isEmpty()) - formatString = QStringLiteral("%.2f"); + formatString = Utils::defaultLabelFormat(); Utils::ParamType paramType = Utils::findFormatParamType(formatString); QByteArray formatArray = formatString.toUtf8(); diff --git a/src/datavis3d/data/abstractrenderitem.cpp b/src/datavis3d/data/abstractrenderitem.cpp index 004fb598..b97ea79e 100644 --- a/src/datavis3d/data/abstractrenderitem.cpp +++ b/src/datavis3d/data/abstractrenderitem.cpp @@ -21,45 +21,33 @@ QT_DATAVIS3D_BEGIN_NAMESPACE AbstractRenderItem::AbstractRenderItem() - : m_labelItem(0), - m_selectionLabel(0) + : m_selectionLabelItem(0) { } AbstractRenderItem::~AbstractRenderItem() { - delete m_labelItem; - delete m_selectionLabel; + delete m_selectionLabelItem; } -LabelItem &AbstractRenderItem::labelItem() +LabelItem &AbstractRenderItem::selectionLabelItem() { - if (!m_labelItem) - m_labelItem = new LabelItem; - return *m_labelItem; + if (!m_selectionLabelItem) + m_selectionLabelItem = new LabelItem; + return *m_selectionLabelItem; } -LabelItem &AbstractRenderItem::selectionLabel() +void AbstractRenderItem::setSelectionLabel(const QString &label) { - if (!m_selectionLabel) - m_selectionLabel = new LabelItem; - return *m_selectionLabel; + if (m_selectionLabelItem) + m_selectionLabelItem->clear(); + m_selectionLabel = label; } -QString &AbstractRenderItem::label() +QString &AbstractRenderItem::selectionLabel() { - if (m_label.isNull()) - formatLabel(); - return m_label; + return m_selectionLabel; } -void AbstractRenderItem::setLabel(const QString &label) -{ - if (m_labelItem) - m_labelItem->clear(); - if (m_selectionLabel) - m_selectionLabel->clear(); - m_label = label; -} QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/data/abstractrenderitem_p.h b/src/datavis3d/data/abstractrenderitem_p.h index 4bf4df71..669ba200 100644 --- a/src/datavis3d/data/abstractrenderitem_p.h +++ b/src/datavis3d/data/abstractrenderitem_p.h @@ -48,23 +48,17 @@ public: inline void setTranslation(const QVector3D &translation) { m_translation = translation; } inline const QVector3D &translation() const {return m_translation; } - // Label item for formatted label - LabelItem &labelItem(); - // Selection label item (containing special selection texture, if mode is activated) - LabelItem &selectionLabel(); + LabelItem &selectionLabelItem(); - // Formatted label for item. - void setLabel(const QString &label); - QString &label(); // Formats label if not previously formatted + // Formatted selection label for item. + void setSelectionLabel(const QString &label); + QString &selectionLabel(); // Formats selection label if not previously formatted protected: - virtual void formatLabel() = 0; - - QString m_label; + QString m_selectionLabel; QVector3D m_translation; - LabelItem *m_labelItem; - LabelItem *m_selectionLabel; + LabelItem *m_selectionLabelItem; friend class QAbstractDataItem; }; diff --git a/src/datavis3d/data/barrenderitem.cpp b/src/datavis3d/data/barrenderitem.cpp index db377aa3..8cfb97d2 100644 --- a/src/datavis3d/data/barrenderitem.cpp +++ b/src/datavis3d/data/barrenderitem.cpp @@ -24,23 +24,34 @@ QT_DATAVIS3D_BEGIN_NAMESPACE BarRenderItem::BarRenderItem() : AbstractRenderItem(), m_renderer(0), - m_value(0) + m_value(0), + m_sliceLabelItem(0) { } BarRenderItem::~BarRenderItem() { + delete m_sliceLabelItem; } -void BarRenderItem::formatLabel() +LabelItem &BarRenderItem::sliceLabelItem() { - // Format the string on first access - QString numStr; - numStr.setNum(m_value); - // TODO actually format instead of just prepending the value - m_label.clear(); // Just in case - m_label.append(numStr); - m_label.append(m_renderer->itemLabelFormat()); // TODO format needs to be cached + if (!m_sliceLabelItem) + m_sliceLabelItem = new LabelItem; + return *m_sliceLabelItem; } +void BarRenderItem::setSliceLabel(const QString &label) +{ + if (m_sliceLabelItem) + m_sliceLabelItem->clear(); + m_sliceLabel = label; +} + +QString &BarRenderItem::sliceLabel() +{ + return m_sliceLabel; +} + + QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/data/barrenderitem_p.h b/src/datavis3d/data/barrenderitem_p.h index babab795..d90c7e04 100644 --- a/src/datavis3d/data/barrenderitem_p.h +++ b/src/datavis3d/data/barrenderitem_p.h @@ -53,16 +53,23 @@ public: inline void setHeight(GLfloat height) { m_height = height; } inline GLfloat height() const { return m_height; } + // Label item for formatted label + LabelItem &sliceLabelItem(); + + // Formatted label for item. + void setSliceLabel(const QString &label); + QString &sliceLabel(); // Formats label if not previously formatted + // TODO should be in abstract, but currently there is no abstract renderer inline void setRenderer(Bars3dRenderer *renderer) { m_renderer = renderer; } protected: - virtual void formatLabel(); - Bars3dRenderer *m_renderer; qreal m_value; QPoint m_position; // x = row, y = column GLfloat m_height; + QString m_sliceLabel; + LabelItem *m_sliceLabelItem; friend class QBarDataItem; }; @@ -71,8 +78,11 @@ void BarRenderItem::setValue(qreal value) { if (m_value != value) { m_value = value; - if (!m_label.isNull()) - setLabel(QString()); // Forces reformatting on next access + // Force reformatting on next access by setting label string to null string + if (!m_sliceLabel.isNull()) + setSliceLabel(QString()); + if (!m_selectionLabel.isNull()) + setSelectionLabel(QString()); } } diff --git a/src/datavis3d/data/maprenderitem.cpp b/src/datavis3d/data/maprenderitem.cpp index c7165104..062898aa 100644 --- a/src/datavis3d/data/maprenderitem.cpp +++ b/src/datavis3d/data/maprenderitem.cpp @@ -32,21 +32,4 @@ MapRenderItem::~MapRenderItem() { } -void MapRenderItem::formatLabel() -{ - // TODO The label format specified in proxy should probably have additional custom formatting - // TODO specifiers in addition to standard printf specifiers for placement of item labels - // TODO and selection data (like row/column in bar selection) - - // Format the string on first access - QString numStr; - numStr.setNum(m_value); - // TODO actually format instead of just prepending the value - m_label.clear(); // Just in case - m_label.append(m_itemLabel); - m_label.append(QStringLiteral(" ")); - m_label.append(numStr); - m_label.append(m_renderer->dataProxy()->itemLabelFormat()); -} - QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/data/maprenderitem_p.h b/src/datavis3d/data/maprenderitem_p.h index f1e7290e..f3674ec5 100644 --- a/src/datavis3d/data/maprenderitem_p.h +++ b/src/datavis3d/data/maprenderitem_p.h @@ -53,8 +53,6 @@ public: inline void setRenderer(Maps3DController *renderer) { m_renderer = renderer; } protected: - virtual void formatLabel(); - Maps3DController *m_renderer; QPointF m_mapPosition; QString m_itemLabel; // from QMapDataItem::label() - unformatted item label diff --git a/src/datavis3d/data/qabstractdataproxy.cpp b/src/datavis3d/data/qabstractdataproxy.cpp index 058e415c..20528e8c 100644 --- a/src/datavis3d/data/qabstractdataproxy.cpp +++ b/src/datavis3d/data/qabstractdataproxy.cpp @@ -72,7 +72,10 @@ QAbstractDataProxy::DataType QAbstractDataProxy::type() const /*! * Sets label \a format for data items in this proxy. This format is used for single item labels, - * e.g. when an item is selected. + * e.g. when an item is selected. How the format is interpreted depends on proxy type. See + * each proxy class documentation for more information. + * + * \sa QBarDataProxy, QScatterDataProxy, QSurfaceDataProxy */ void QAbstractDataProxy::setItemLabelFormat(const QString &format) { diff --git a/src/datavis3d/data/qbardataproxy.cpp b/src/datavis3d/data/qbardataproxy.cpp index c521f57a..676b9655 100644 --- a/src/datavis3d/data/qbardataproxy.cpp +++ b/src/datavis3d/data/qbardataproxy.cpp @@ -36,6 +36,32 @@ QT_DATAVIS3D_BEGIN_NAMESPACE * in a QBarDataArray container. * QBarDataRow pointers should not be used to modify data further after they have been passed to * the proxy, as such modifications will not trigger proper signals. + * + * QBarDataProxy supports the following format tags for QAbstractDataProxy::setItemLabelFormat(): + * \table + * \row + * \li @rowTitle \li Title from row axis + * \row + * \li @colTitle \li Title from column axis + * \row + * \li @valueTitle \li Title from value axis + * \row + * \li @rowIdx \li Visible row index + * \row + * \li @colIdx \li Visible Column index + * \row + * \li @rowLabel \li Label from row axis + * \row + * \li @colLabel \li Label from column axis + * \row + * \li @valueLabel \li Item value formatted using the same format the value axis attached to the graph uses, + * see \l{QValueAxis::setLabelFormat()} for more information. + * \row + * \li %<format spec> \li Item value in specified format. + * \endtable + * + * For example: + * \snippet doc_src_qtdatavis3d.cpp 1 */ /*! @@ -255,6 +281,7 @@ QBarDataProxyPrivate::QBarDataProxyPrivate(QBarDataProxy *q) : QAbstractDataProxyPrivate(q, QAbstractDataProxy::DataTypeBar), m_dataArray(new QBarDataArray) { + m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); } QBarDataProxyPrivate::~QBarDataProxyPrivate() diff --git a/src/datavis3d/data/qscatterdataproxy.cpp b/src/datavis3d/data/qscatterdataproxy.cpp index 7764b0b7..d8fe383d 100644 --- a/src/datavis3d/data/qscatterdataproxy.cpp +++ b/src/datavis3d/data/qscatterdataproxy.cpp @@ -30,6 +30,28 @@ QT_DATAVIS3D_BEGIN_NAMESPACE * QScatterDataProxy handles adding, inserting, changing and removing data items. * * QScatterDataProxy takes ownership of all QScatterDataArrays and QScatterDataItems passed to it. + * + * QScatterDataProxy supports the following format tags for QAbstractDataProxy::setItemLabelFormat(): + * \table + * \row + * \li @xTitle \li Title from X axis + * \row + * \li @yTitle \li Title from Y axis + * \row + * \li @zTitle \li Title from Z axis + * \row + * \li @xLabel \li Item value formatted using the same format the X axis attached to the graph uses, + * see \l{QValueAxis::setLabelFormat()} for more information. + * \row + * \li @yLabel \li Item value formatted using the same format the Y axis attached to the graph uses, + * see \l{QValueAxis::setLabelFormat()} for more information. + * \row + * \li @zLabel \li Item value formatted using the same format the Z axis attached to the graph uses, + * see \l{QValueAxis::setLabelFormat()} for more information. + * \endtable + * + * For example: + * \snippet doc_src_qtdatavis3d.cpp 2 */ /*! @@ -216,6 +238,7 @@ QScatterDataProxyPrivate::QScatterDataProxyPrivate(QScatterDataProxy *q) : QAbstractDataProxyPrivate(q, QAbstractDataProxy::DataTypeScatter), m_dataArray(new QScatterDataArray) { + m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)"); } QScatterDataProxyPrivate::~QScatterDataProxyPrivate() diff --git a/src/datavis3d/data/qscatterdataproxy_p.h b/src/datavis3d/data/qscatterdataproxy_p.h index 526845fd..23a2fc6a 100644 --- a/src/datavis3d/data/qscatterdataproxy_p.h +++ b/src/datavis3d/data/qscatterdataproxy_p.h @@ -55,7 +55,6 @@ public: private: QScatterDataArray *m_dataArray; - QString m_itemLabelFormat; friend class QScatterDataProxy; }; diff --git a/src/datavis3d/data/scatterrenderitem.cpp b/src/datavis3d/data/scatterrenderitem.cpp index 15281c0a..a7238310 100644 --- a/src/datavis3d/data/scatterrenderitem.cpp +++ b/src/datavis3d/data/scatterrenderitem.cpp @@ -31,21 +31,4 @@ ScatterRenderItem::~ScatterRenderItem() { } -void ScatterRenderItem::formatLabel() -{ - // TODO The label format specified in proxy should probably have additional custom formatting - // TODO specifiers in addition to standard printf specifiers for placement of item labels - // TODO and selection data (like row/column in bar selection) - - // Format the string on first access - QString numStr; - numStr.setNum(m_value); - // TODO actually format instead of just prepending the value - m_label.clear(); // Just in case - //m_label.append(m_itemLabel); - //m_label.append(QStringLiteral(" ")); - m_label.append(numStr); - m_label.append(m_renderer->itemLabelFormat()); -} - QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/data/scatterrenderitem_p.h b/src/datavis3d/data/scatterrenderitem_p.h index 47cfeed2..4c9de38c 100644 --- a/src/datavis3d/data/scatterrenderitem_p.h +++ b/src/datavis3d/data/scatterrenderitem_p.h @@ -52,8 +52,6 @@ public: inline void setRenderer(Scatter3DRenderer *renderer) { m_renderer = renderer; } protected: - virtual void formatLabel(); - Scatter3DRenderer *m_renderer; QVector3D m_position; //qreal m_size; // TODO in case we need a fourth variable that adjusts scatter item size diff --git a/src/datavis3d/datavis3d.pro b/src/datavis3d/datavis3d.pro index fa548c22..ca1a5502 100644 --- a/src/datavis3d/datavis3d.pro +++ b/src/datavis3d/datavis3d.pro @@ -22,3 +22,9 @@ wince* { QMAKE_CXXFLAGS_RELEASE ~= s/-O1/-Os -Oy -Ob2/ } } + +OTHER_FILES += doc/qtdatavis3d.qdocconf \ + doc/src/* \ + doc/images/* \ + doc/snippets/* + diff --git a/src/datavis3d/doc/snippets/doc_src_qtdatavis3d.cpp b/src/datavis3d/doc/snippets/doc_src_qtdatavis3d.cpp index a3b3e8e8..b4a2b152 100644 --- a/src/datavis3d/doc/snippets/doc_src_qtdatavis3d.cpp +++ b/src/datavis3d/doc/snippets/doc_src_qtdatavis3d.cpp @@ -19,3 +19,11 @@ //! [0] #include <QtDataVis3D> //! [0] + +//! [1] +proxy->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowLabel, @colLabel): %.1f")); +//! [1] + +//! [2] +proxy->setItemLabelFormat(QStringLiteral("@xTitle: @xValue, @yTitle: @yValue, @zTitle: @zValue")); +//! [2] diff --git a/src/datavis3d/engine/abstract3dcontroller.cpp b/src/datavis3d/engine/abstract3dcontroller.cpp index 0d51f7e4..64dfe786 100644 --- a/src/datavis3d/engine/abstract3dcontroller.cpp +++ b/src/datavis3d/engine/abstract3dcontroller.cpp @@ -42,7 +42,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) : m_axisY(0), m_axisZ(0), m_renderer(0), - m_isDataDirty(false) + m_isDataDirty(true) { m_theme.useColorTheme(QDataVis::ThemeSystem); } @@ -246,6 +246,33 @@ void Abstract3DController::synchDataToRenderer() valueAxisZ->subSegmentCount()); } } + + if (m_changeTracker.axisXLabelFormatChanged) { + m_changeTracker.axisXLabelFormatChanged = false; + if (m_axisX->type() & QAbstractAxis::AxisTypeValue) { + QValueAxis *valueAxisX = static_cast<QValueAxis *>(m_axisX); + m_renderer->updateAxisLabelFormat(QAbstractAxis::AxisOrientationX, + valueAxisX->labelFormat()); + } + } + + if (m_changeTracker.axisYLabelFormatChanged) { + m_changeTracker.axisYLabelFormatChanged = false; + if (m_axisY->type() & QAbstractAxis::AxisTypeValue) { + QValueAxis *valueAxisY = static_cast<QValueAxis *>(m_axisY); + m_renderer->updateAxisLabelFormat(QAbstractAxis::AxisOrientationY, + valueAxisY->labelFormat()); + } + } + + if (m_changeTracker.axisZLabelFormatChanged) { + m_changeTracker.axisZLabelFormatChanged = false; + if (m_axisZ->type() & QAbstractAxis::AxisTypeValue) { + QValueAxis *valueAxisZ = static_cast<QValueAxis *>(m_axisZ); + m_renderer->updateAxisLabelFormat(QAbstractAxis::AxisOrientationZ, + valueAxisZ->labelFormat()); + } + } } void Abstract3DController::render(const GLuint defaultFboHandle) @@ -623,6 +650,24 @@ void Abstract3DController::handleAxisAutoAdjustRangeChanged(bool autoAdjust) handleAxisAutoAdjustRangeChangedInOrientation(axis->orientation(), autoAdjust); } +void Abstract3DController::handleAxisLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format) + handleAxisLabelFormatChangedBySender(sender()); +} + +void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) +{ + if (sender == m_axisX) + m_changeTracker.axisXLabelFormatChanged = true; + else if (sender == m_axisY) + m_changeTracker.axisYLabelFormatChanged = true; + else if (sender == m_axisZ) + m_changeTracker.axisZLabelFormatChanged = true; + else + qWarning() << __FUNCTION__ << "invoked for invalid axis"; +} + void Abstract3DController::setAxisHelper(QAbstractAxis::AxisOrientation orientation, QAbstractAxis *axis, QAbstractAxis **axisPtr) { @@ -659,12 +704,15 @@ void Abstract3DController::setAxisHelper(QAbstractAxis::AxisOrientation orientat this, &Abstract3DController::handleAxisSubSegmentCountChanged); QObject::connect(valueAxis, &QValueAxis::autoAdjustRangeChanged, this, &Abstract3DController::handleAxisAutoAdjustRangeChanged); + QObject::connect(valueAxis, &QValueAxis::labelFormatChanged, + this, &Abstract3DController::handleAxisLabelFormatChanged); handleAxisRangeChangedBySender(valueAxis); handleAxisSegmentCountChangedBySender(valueAxis); handleAxisSubSegmentCountChangedBySender(valueAxis); handleAxisAutoAdjustRangeChangedInOrientation(valueAxis->orientation(), valueAxis->isAutoAdjustRange()); + handleAxisLabelFormatChangedBySender(valueAxis); } } diff --git a/src/datavis3d/engine/abstract3dcontroller_p.h b/src/datavis3d/engine/abstract3dcontroller_p.h index 7fc90a93..9157f1a6 100644 --- a/src/datavis3d/engine/abstract3dcontroller_p.h +++ b/src/datavis3d/engine/abstract3dcontroller_p.h @@ -74,6 +74,9 @@ struct Abstract3DChangeBitField { bool axisXSubSegmentCountChanged : 1; bool axisYSubSegmentCountChanged : 1; bool axisZSubSegmentCountChanged : 1; + bool axisXLabelFormatChanged : 1; + bool axisYLabelFormatChanged : 1; + bool axisZLabelFormatChanged : 1; Abstract3DChangeBitField() : positionChanged(true), @@ -105,7 +108,10 @@ struct Abstract3DChangeBitField { axisZSegmentCountChanged(true), axisXSubSegmentCountChanged(true), axisYSubSegmentCountChanged(true), - axisZSubSegmentCountChanged(true) + axisZSubSegmentCountChanged(true), + axisXLabelFormatChanged(true), + axisYLabelFormatChanged(true), + axisZLabelFormatChanged(true) { } }; @@ -254,6 +260,7 @@ public: virtual void handleAxisSegmentCountChangedBySender(QObject *sender); virtual void handleAxisSubSegmentCountChangedBySender(QObject *sender); virtual void handleAxisAutoAdjustRangeChangedInOrientation(QAbstractAxis::AxisOrientation orientation, bool autoAdjust) = 0; + virtual void handleAxisLabelFormatChangedBySender(QObject *sender); public slots: void handleAxisTitleChanged(const QString &title); @@ -262,6 +269,7 @@ public slots: void handleAxisSegmentCountChanged(int count); void handleAxisSubSegmentCountChanged(int count); void handleAxisAutoAdjustRangeChanged(bool autoAdjust); + void handleAxisLabelFormatChanged(const QString &format); signals: void boundingRectChanged(QRect boundingRect); diff --git a/src/datavis3d/engine/abstract3drenderer.cpp b/src/datavis3d/engine/abstract3drenderer.cpp index 14b5ef8c..2b40955c 100644 --- a/src/datavis3d/engine/abstract3drenderer.cpp +++ b/src/datavis3d/engine/abstract3drenderer.cpp @@ -77,6 +77,8 @@ void Abstract3DRenderer::initializeOpenGL() void Abstract3DRenderer::render(CameraHelper *camera, const GLuint defaultFboHandle) { + Q_UNUSED(camera) + #ifdef DISPLAY_RENDER_SPEED // For speed computation if (m_isFirstFrame) { @@ -106,6 +108,16 @@ void Abstract3DRenderer::render(CameraHelper *camera, const GLuint defaultFboHan glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } +QString Abstract3DRenderer::generateValueLabel(const QString &format, qreal value) +{ + QString valueLabelFormat = format; + if (valueLabelFormat.isEmpty()) + valueLabelFormat = Utils::defaultLabelFormat(); + Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); + QByteArray valueFormatArray = valueLabelFormat.toUtf8(); + return Utils::formatLabel(valueFormatArray, valueParamType, value); +} + void Abstract3DRenderer::updateDataModel(QAbstractDataProxy *dataProxy) { m_cachedItemLabelFormat = dataProxy->itemLabelFormat(); @@ -268,6 +280,11 @@ void Abstract3DRenderer::updateAxisSubSegmentCount(QAbstractAxis::AxisOrientatio axisCacheForOrientation(orientation).setSubSegmentCount(count); } +void Abstract3DRenderer::updateAxisLabelFormat(QAbstractAxis::AxisOrientation orientation, const QString &format) +{ + axisCacheForOrientation(orientation).setLabelFormat(format); +} + AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(QAbstractAxis::AxisOrientation orientation) { switch (orientation) { diff --git a/src/datavis3d/engine/abstract3drenderer_p.h b/src/datavis3d/engine/abstract3drenderer_p.h index b881bcdd..b4286f20 100644 --- a/src/datavis3d/engine/abstract3drenderer_p.h +++ b/src/datavis3d/engine/abstract3drenderer_p.h @@ -73,6 +73,8 @@ protected: AxisRenderCache m_axisCacheZ; TextureHelper *m_textureHelper; + QString generateValueLabel(const QString &format, qreal value); + public: ~Abstract3DRenderer(); @@ -108,6 +110,7 @@ public: virtual void updateAxisRange(QAbstractAxis::AxisOrientation orientation, qreal min, qreal max); virtual void updateAxisSegmentCount(QAbstractAxis::AxisOrientation orientation, int count); virtual void updateAxisSubSegmentCount(QAbstractAxis::AxisOrientation orientation, int count); + virtual void updateAxisLabelFormat(QAbstractAxis::AxisOrientation orientation, const QString &format); protected: Abstract3DRenderer(Abstract3DController *controller); diff --git a/src/datavis3d/engine/axisrendercache_p.h b/src/datavis3d/engine/axisrendercache_p.h index 4b38fa20..561c04cc 100644 --- a/src/datavis3d/engine/axisrendercache_p.h +++ b/src/datavis3d/engine/axisrendercache_p.h @@ -59,6 +59,8 @@ public: inline int segmentCount() const { return m_segmentCount; } void setSubSegmentCount(int count); inline int subSegmentCount() const { return m_subSegmentCount; } + inline void setLabelFormat(const QString &format) { m_labelFormat = format; } + inline const QString &labelFormat() { return m_labelFormat; } inline LabelItem &titleItem() { return m_titleItem; } inline QList<LabelItem *> &labelItems() { return m_labelItems; } @@ -80,6 +82,7 @@ private: qreal m_max; int m_segmentCount; int m_subSegmentCount; + QString m_labelFormat; // Renderer items Drawer *m_drawer; // Not owned diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp index 4cf65ca4..b208e33a 100644 --- a/src/datavis3d/engine/bars3drenderer.cpp +++ b/src/datavis3d/engine/bars3drenderer.cpp @@ -47,8 +47,6 @@ QT_DATAVIS3D_BEGIN_NAMESPACE -#define DISPLAY_FULL_DATA_ON_SELECTION // Append selection value text with row and column labels - const GLfloat gridLineWidth = 0.005f; static QVector3D selectionSkipColor = QVector3D(255, 255, 255); // Selection texture's background color @@ -358,7 +356,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera, for (int col = 0; col < m_sliceSelection->size(); col++) { BarRenderItem *item = m_sliceSelection->at(col); // Draw values - m_drawer->drawLabel(*item, item->labelItem(), viewMatrix, projectionMatrix, + m_drawer->drawLabel(*item, item->sliceLabelItem(), viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), QVector3D(0.0f, 0.0f, 0.0f), item->height(), m_cachedSelectionMode, m_labelShader, @@ -1154,15 +1152,6 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, m_barShader->release(); } - // Generate label textures for slice selection if m_updateLabels is set - if (m_cachedIsSlicingActivated && m_updateLabels) { - // Create label textures - for (int col = 0; col < m_sliceSelection->size(); col++) { - BarRenderItem *item = m_sliceSelection->at(col); - m_drawer->generateLabelTexture(item); - } - } - // Handle slice activation and label drawing if (!barSelectionFound) { // We have no ownership, don't delete. Just NULL the pointer. @@ -1178,7 +1167,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, // Create label textures for (int col = 0; col < m_sliceSelection->size(); col++) { BarRenderItem *item = m_sliceSelection->at(col); - m_drawer->generateLabelTexture(item); + if (item->sliceLabel().isNull()) + item->setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), item->value())); + m_drawer->generateLabelItem(item->sliceLabelItem(), item->sliceLabel()); } } else { // Print value of selected bar @@ -1189,32 +1180,37 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } -#ifndef DISPLAY_FULL_DATA_ON_SELECTION - // Draw just the value string of the selected bar - if (m_previouslySelectedBar != m_selectedBar || m_updateLabels) { - m_drawer->generateLabelTexture(m_selectedBar); - m_previouslySelectedBar = m_selectedBar; - } - - m_drawer->drawLabel(*m_selectedBar, m_selectedBar->labelItem(), - viewMatrix, projectionMatrix, - QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), - m_cachedSelectionMode, m_labelShader, - m_labelObj, true); -#else - // Draw the value string followed by row label and column label - LabelItem &labelItem = m_selectedBar->selectionLabel(); + // Draw the selection label + LabelItem &labelItem = m_selectedBar->selectionLabelItem(); if (m_previouslySelectedBar != m_selectedBar || m_updateLabels || !labelItem.textureId()) { - QString labelText = m_selectedBar->label(); - if ((m_axisCacheZ.labels().size() > m_selectedBar->position().y()) - && (m_axisCacheX.labels().size() > m_selectedBar->position().x())) { - labelText.append(QStringLiteral(" (")); - labelText.append(m_axisCacheX.labels().at(m_selectedBar->position().x())); - labelText.append(QStringLiteral(", ")); - labelText.append(m_axisCacheZ.labels().at(m_selectedBar->position().y())); - labelText.append(QStringLiteral(")")); - //qDebug() << labelText; + QString labelText = m_selectedBar->selectionLabel(); + if (labelText.isNull()) { + static const QString rowIndexTag(QStringLiteral("@rowIdx")); + static const QString rowLabelTag(QStringLiteral("@rowLabel")); + static const QString rowTitleTag(QStringLiteral("@rowTitle")); + static const QString colIndexTag(QStringLiteral("@colIdx")); + static const QString colLabelTag(QStringLiteral("@colLabel")); + static const QString colTitleTag(QStringLiteral("@colTitle")); + static const QString valueTitleTag(QStringLiteral("@valueTitle")); + static const QString valueLabelTag(QStringLiteral("@valueLabel")); + + // Custom format expects printf format specifier. There is no tag for it. + labelText = generateValueLabel(itemLabelFormat(), m_selectedBar->value()); + + labelText.replace(rowIndexTag, QString::number(m_selectedBar->position().x())); + labelText.replace(rowLabelTag, m_axisCacheX.labels().at(m_selectedBar->position().x())); + labelText.replace(rowTitleTag, m_axisCacheX.title()); + labelText.replace(colIndexTag, QString::number(m_selectedBar->position().y())); + labelText.replace(colLabelTag, m_axisCacheZ.labels().at(m_selectedBar->position().y())); + labelText.replace(colTitleTag, m_axisCacheZ.title()); + labelText.replace(valueTitleTag, m_axisCacheY.title()); + + if (labelText.contains(valueLabelTag)) { + QString valueLabelText = generateValueLabel(m_axisCacheY.labelFormat(), m_selectedBar->value()); + labelText.replace(valueLabelTag, valueLabelText); + } + + m_selectedBar->setSelectionLabel(labelText); } m_drawer->generateLabelItem(labelItem, labelText); m_previouslySelectedBar = m_selectedBar; @@ -1225,7 +1221,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, camera, true, false); -#endif + glDisable(GL_TEXTURE_2D); if (m_cachedLabelTransparency > QDataVis::TransparencyNone) glDisable(GL_BLEND); diff --git a/src/datavis3d/engine/drawer.cpp b/src/datavis3d/engine/drawer.cpp index 5d524963..5946e54c 100644 --- a/src/datavis3d/engine/drawer.cpp +++ b/src/datavis3d/engine/drawer.cpp @@ -309,10 +309,10 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte drawObject(shader, object, labelItem.textureId()); } -void Drawer::generateLabelTexture(AbstractRenderItem *item) +void Drawer::generateSelectionLabelTexture(AbstractRenderItem *item) { - LabelItem &labelItem = item->labelItem(); - generateLabelItem(labelItem, item->label()); + LabelItem &labelItem = item->selectionLabelItem(); + generateLabelItem(labelItem, item->selectionLabel()); } void Drawer::generateLabelItem(LabelItem &item, const QString &text) diff --git a/src/datavis3d/engine/drawer_p.h b/src/datavis3d/engine/drawer_p.h index 3139fbe0..19109861 100644 --- a/src/datavis3d/engine/drawer_p.h +++ b/src/datavis3d/engine/drawer_p.h @@ -84,7 +84,7 @@ public: LabelPosition position = LabelOver, Qt::AlignmentFlag alignment = Qt::AlignCenter); - void generateLabelTexture(AbstractRenderItem *item); + void generateSelectionLabelTexture(AbstractRenderItem *item); void generateLabelItem(LabelItem &item, const QString &text); Q_SIGNALS: diff --git a/src/datavis3d/engine/maps3dcontroller.cpp b/src/datavis3d/engine/maps3dcontroller.cpp index 2457d5fd..253b774a 100644 --- a/src/datavis3d/engine/maps3dcontroller.cpp +++ b/src/datavis3d/engine/maps3dcontroller.cpp @@ -51,8 +51,6 @@ QT_DATAVIS3D_BEGIN_NAMESPACE -//#define DISPLAY_FULL_DATA_ON_SELECTION // Append selection value text with row and column labels - const GLfloat gridLineWidth = 0.005f; GLfloat distanceMod = 0.0f; static QVector3D skipColor = QVector3D(255, 255, 255); // Selection texture's background color @@ -827,7 +825,7 @@ void Maps3DController::drawScene(const GLuint defaultFboHandle) m_drawer->generateLabelTexture(item); } }*/ else { - // Print value of selected bar + // Draw the selection label m_labelShader->bind(); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); @@ -835,35 +833,20 @@ void Maps3DController::drawScene(const GLuint defaultFboHandle) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } -#ifndef DISPLAY_FULL_DATA_ON_SELECTION - // Draw just the value string of the selected bar - if (m_previouslySelectedBar != m_selectedBar || m_updateLabels) { - m_drawer->generateLabelTexture(m_selectedBar); + + LabelItem &labelItem = m_selectedBar->selectionLabelItem(); + if (m_previouslySelectedBar != m_selectedBar || m_updateLabels || !labelItem.textureId()) { + m_drawer->generateLabelItem(labelItem, m_selectedBar->selectionLabel()); m_previouslySelectedBar = m_selectedBar; } - m_drawer->drawLabel(*m_selectedBar, m_selectedBar->labelItem(), + m_drawer->drawLabel(*m_selectedBar, labelItem, viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), m_selectionMode, m_labelShader, m_labelObj, m_camera, true); -#else - // Draw the value string followed by row label and column label - LabelItem &labelItem = m_selectedBar->selectionLabel(); - if (m_previouslySelectedBar != m_selectedBar || m_updateLabels || !labelItem.textureId()) { - QString labelText = m_selectedBar->label(); - // TODO More elaborate label? - m_drawer->generateLabelItem(&labelItem, labelText); - m_previouslySelectedBar = m_selectedBar; - } - m_drawer->drawLabel(*m_selectedBar, labelItem, viewMatrix, projectionMatrix, - QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), - m_selectionMode, m_labelShader, - m_labelObj, true, false); -#endif glDisable(GL_TEXTURE_2D); if (m_labelTransparency > QDataVis::TransparencyNone) glDisable(GL_BLEND); diff --git a/src/datavis3d/engine/scatter3drenderer.cpp b/src/datavis3d/engine/scatter3drenderer.cpp index 6468a3b2..619cf06f 100644 --- a/src/datavis3d/engine/scatter3drenderer.cpp +++ b/src/datavis3d/engine/scatter3drenderer.cpp @@ -1024,7 +1024,7 @@ void Scatter3DRenderer::drawScene(CameraHelper *camera, // We have no ownership, don't delete. Just NULL the pointer. m_selectedItem = NULL; } else { - // Print value of selected bar + // Draw the selection label m_labelShader->bind(); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); @@ -1032,26 +1032,43 @@ void Scatter3DRenderer::drawScene(CameraHelper *camera, glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } -#ifndef DISPLAY_FULL_DATA_ON_SELECTION - // Draw just the value string of the selected bar - if (m_previouslySelectedBar != m_selectedBar || m_updateLabels) { - m_drawer->generateLabelTexture(m_selectedBar); - m_previouslySelectedBar = m_selectedBar; - } - m_drawer->drawLabel(*m_selectedBar, m_selectedBar->labelItem(), - viewMatrix, projectionMatrix, - QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), - m_cachedSelectionMode, m_labelShader, - m_labelObj, m_camera, true); -#else - // Draw the value string followed by row label and column label - LabelItem &labelItem = m_selectedItem->selectionLabel(); + LabelItem &labelItem = m_selectedItem->selectionLabelItem(); if (m_previouslySelectedItem != m_selectedItem || m_updateLabels || !labelItem.textureId()) { - QString labelText = m_selectedItem->label(); - // TODO More elaborate label? + QString labelText = m_selectedItem->selectionLabel(); + if (labelText.isNull()) { + static const QString xTitleTag(QStringLiteral("@xTitle")); + static const QString yTitleTag(QStringLiteral("@yTitle")); + static const QString zTitleTag(QStringLiteral("@zTitle")); + static const QString xLabelTag(QStringLiteral("@xLabel")); + static const QString yLabelTag(QStringLiteral("@yLabel")); + static const QString zLabelTag(QStringLiteral("@zLabel")); + + labelText = itemLabelFormat(); + + labelText.replace(xTitleTag, m_axisCacheX.title()); + labelText.replace(yTitleTag, m_axisCacheY.title()); + labelText.replace(zTitleTag, m_axisCacheZ.title()); + + if (labelText.contains(xLabelTag)) { + QString valueLabelText = generateValueLabel(m_axisCacheX.labelFormat(), + m_selectedItem->position().x()); + labelText.replace(xLabelTag, valueLabelText); + } + if (labelText.contains(yLabelTag)) { + QString valueLabelText = generateValueLabel(m_axisCacheY.labelFormat(), + m_selectedItem->position().y()); + labelText.replace(yLabelTag, valueLabelText); + } + if (labelText.contains(zLabelTag)) { + QString valueLabelText = generateValueLabel(m_axisCacheZ.labelFormat(), + m_selectedItem->position().z()); + labelText.replace(zLabelTag, valueLabelText); + } + + m_selectedItem->setSelectionLabel(labelText); + } m_drawer->generateLabelItem(labelItem, labelText); m_previouslySelectedItem = m_selectedItem; } @@ -1061,7 +1078,7 @@ void Scatter3DRenderer::drawScene(CameraHelper *camera, QVector3D(0.0f, 0.0f, 0.0f), m_selectedItem->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, camera, true, false, Drawer::LabelMid); -#endif + glDisable(GL_TEXTURE_2D); if (m_cachedLabelTransparency > QDataVis::TransparencyNone) glDisable(GL_BLEND); diff --git a/src/datavis3d/engine/theme.cpp b/src/datavis3d/engine/theme.cpp index 7b2cb210..7cdd6779 100644 --- a/src/datavis3d/engine/theme.cpp +++ b/src/datavis3d/engine/theme.cpp @@ -209,7 +209,7 @@ void Theme::useColorTheme(QDataVis::ColorTheme colorTheme) m_backgroundColor = QColor(QRgb(0xf3ece0)); m_windowColor = QColor(QRgb(0xf3ece0)); m_textColor = QColor(QRgb(0x404044)); - m_textBackgroundColor = QColor(0xb5, 0xb0, 0xa7, 0x80); + m_textBackgroundColor = QColor(0xb5, 0xb0, 0xa7, 0xC0); m_gridLine = QColor(QRgb(0xd4cec3)); m_highlightBarColor = QColor(QRgb(0xc35660)); m_highlightRowColor = QColor(QRgb(0x536780)); diff --git a/src/datavis3d/utils/utils.cpp b/src/datavis3d/utils/utils.cpp index 40d7ec9f..d5ae95e9 100644 --- a/src/datavis3d/utils/utils.cpp +++ b/src/datavis3d/utils/utils.cpp @@ -278,8 +278,14 @@ QString Utils::formatLabel(const QByteArray &format, ParamType paramType, qreal case ParamTypeReal: return QString().sprintf(format, value); default: - return QString::number(value); + return QString::fromUtf8(format); // To detect errors } } +QString Utils::defaultLabelFormat() +{ + static const QString defaultFormat(QStringLiteral("%.2f")); + return defaultFormat; +} + QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/utils/utils_p.h b/src/datavis3d/utils/utils_p.h index 1d8aedfa..ac96b901 100644 --- a/src/datavis3d/utils/utils_p.h +++ b/src/datavis3d/utils/utils_p.h @@ -64,6 +64,7 @@ public: static ParamType findFormatParamType(const QString &format); static QString formatLabel(const QByteArray &format, ParamType paramType, qreal value); + static QString defaultLabelFormat(); private: static ParamType mapFormatCharToParamType(const QChar &formatChar); diff --git a/src/datavis3dqml2/declarativebars.cpp b/src/datavis3dqml2/declarativebars.cpp index 2adcd870..c33ec044 100644 --- a/src/datavis3dqml2/declarativebars.cpp +++ b/src/datavis3dqml2/declarativebars.cpp @@ -351,6 +351,16 @@ void DeclarativeBars::setColumns(int columns) setDataWindow(rows(), columns); } +void DeclarativeBars::setItemLabelFormat(const QString &format) +{ + m_shared->dataProxy()->setItemLabelFormat(format); +} + +QString DeclarativeBars::itemLabelFormat() +{ + return m_shared->dataProxy()->itemLabelFormat(); +} + void DeclarativeBars::mousePressEvent(QMouseEvent *event) { QPoint mousePos = event->pos(); diff --git a/src/datavis3dqml2/declarativebars_p.h b/src/datavis3dqml2/declarativebars_p.h index 0256b5e5..c3aacecd 100644 --- a/src/datavis3dqml2/declarativebars_p.h +++ b/src/datavis3dqml2/declarativebars_p.h @@ -68,6 +68,7 @@ class DeclarativeBars : public QQuickItem Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible) Q_PROPERTY(int rows READ rows WRITE setRows) Q_PROPERTY(int columns READ columns WRITE setColumns) + Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat) Q_ENUMS(QtDataVis3D::QDataVis::SelectionMode) Q_ENUMS(QtDataVis3D::QDataVis::ShadowQuality) Q_ENUMS(QtDataVis3D::QDataVis::LabelTransparency) @@ -177,6 +178,9 @@ public: int columns() const; void setColumns(int columns); + void setItemLabelFormat(const QString &format); + QString itemLabelFormat(); + public slots: // Used to detect when shadow quality changes autonomously due to e.g. resizing. void handleShadowQualityUpdate(QDataVis::ShadowQuality quality); diff --git a/src/datavis3dqml2/declarativescatter.cpp b/src/datavis3dqml2/declarativescatter.cpp index 6731035e..f9a1fa3a 100644 --- a/src/datavis3dqml2/declarativescatter.cpp +++ b/src/datavis3dqml2/declarativescatter.cpp @@ -299,6 +299,16 @@ QDataVis::ShadowQuality DeclarativeScatter::shadowQuality() return m_shared->shadowQuality(); } +void DeclarativeScatter::setItemLabelFormat(const QString &format) +{ + m_shared->dataProxy()->setItemLabelFormat(format); +} + +QString DeclarativeScatter::itemLabelFormat() +{ + return m_shared->dataProxy()->itemLabelFormat(); +} + void DeclarativeScatter::mousePressEvent(QMouseEvent *event) { QPoint mousePos = event->pos(); diff --git a/src/datavis3dqml2/declarativescatter_p.h b/src/datavis3dqml2/declarativescatter_p.h index dce5c021..ea8f6c95 100644 --- a/src/datavis3dqml2/declarativescatter_p.h +++ b/src/datavis3dqml2/declarativescatter_p.h @@ -61,6 +61,7 @@ class DeclarativeScatter : public QQuickItem Q_PROPERTY(float fontSize READ fontSize WRITE setFontSize) Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible) Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible) + Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat) Q_ENUMS(QtDataVis3D::QDataVis::SelectionMode) Q_ENUMS(QtDataVis3D::QDataVis::ShadowQuality) Q_ENUMS(QtDataVis3D::QDataVis::LabelTransparency) @@ -143,6 +144,9 @@ public: void setBackgroundVisible(bool visible); bool isBackgroundVisible(); + void setItemLabelFormat(const QString &format); + QString itemLabelFormat(); + // Adjust shadow quality void setShadowQuality(QDataVis::ShadowQuality quality); QDataVis::ShadowQuality shadowQuality(); |