summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-08-20 11:49:42 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-08-21 07:50:54 +0300
commit3646f3475c932a1cc7b1b96cf1c89b3b301e80ef (patch)
tree968f28889c13150c82632f99afbdc8edc1859b2e
parent62966a4929b845af18c3b9670b03636c86f24868 (diff)
Implement selection label formatting
Change-Id: Iae57b93be41ffeeb5ef8fc6ff625af22a7f2d21a Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--examples/qmlbarchart/qml/qmlbarchart/main.qml4
-rw-r--r--examples/qmlscatter/qml/qmlscatter/main.qml1
-rw-r--r--examples/rainfall/rainfallchart.cpp5
-rw-r--r--examples/scatterchart/scatterchart.cpp8
-rw-r--r--examples/widget/chart.cpp5
-rw-r--r--src/datavis3d/axis/qvalueaxis.cpp2
-rw-r--r--src/datavis3d/data/abstractrenderitem.cpp36
-rw-r--r--src/datavis3d/data/abstractrenderitem_p.h18
-rw-r--r--src/datavis3d/data/barrenderitem.cpp29
-rw-r--r--src/datavis3d/data/barrenderitem_p.h18
-rw-r--r--src/datavis3d/data/maprenderitem.cpp17
-rw-r--r--src/datavis3d/data/maprenderitem_p.h2
-rw-r--r--src/datavis3d/data/qabstractdataproxy.cpp5
-rw-r--r--src/datavis3d/data/qbardataproxy.cpp27
-rw-r--r--src/datavis3d/data/qscatterdataproxy.cpp23
-rw-r--r--src/datavis3d/data/qscatterdataproxy_p.h1
-rw-r--r--src/datavis3d/data/scatterrenderitem.cpp17
-rw-r--r--src/datavis3d/data/scatterrenderitem_p.h2
-rw-r--r--src/datavis3d/datavis3d.pro6
-rw-r--r--src/datavis3d/doc/snippets/doc_src_qtdatavis3d.cpp8
-rw-r--r--src/datavis3d/engine/abstract3dcontroller.cpp50
-rw-r--r--src/datavis3d/engine/abstract3dcontroller_p.h10
-rw-r--r--src/datavis3d/engine/abstract3drenderer.cpp17
-rw-r--r--src/datavis3d/engine/abstract3drenderer_p.h3
-rw-r--r--src/datavis3d/engine/axisrendercache_p.h3
-rw-r--r--src/datavis3d/engine/bars3drenderer.cpp74
-rw-r--r--src/datavis3d/engine/drawer.cpp6
-rw-r--r--src/datavis3d/engine/drawer_p.h2
-rw-r--r--src/datavis3d/engine/maps3dcontroller.cpp29
-rw-r--r--src/datavis3d/engine/scatter3drenderer.cpp55
-rw-r--r--src/datavis3d/engine/theme.cpp2
-rw-r--r--src/datavis3d/utils/utils.cpp8
-rw-r--r--src/datavis3d/utils/utils_p.h1
-rw-r--r--src/datavis3dqml2/declarativebars.cpp10
-rw-r--r--src/datavis3dqml2/declarativebars_p.h4
-rw-r--r--src/datavis3dqml2/declarativescatter.cpp10
-rw-r--r--src/datavis3dqml2/declarativescatter_p.h4
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();