summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-08 14:55:13 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-09 13:44:47 +0300
commit590d11726e0708e9f8fad0ec386cc5859dbe5cc8 (patch)
treec71592d440579365774a1e56be842d135a9b9b30
parentbb36daafb6cb461d21c6f6dace10e23ee5fc2dde (diff)
Enable mapping single role to multiple properties for bars
Surface and scatter to follow in separate task Task-number: QTRD-3074 Change-Id: I790078446cd1b805a83da2e3760eaf27c586aaab Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc17
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Data.qml168
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/main.qml61
-rw-r--r--src/datavisualization/data/baritemmodelhandler.cpp86
-rw-r--r--src/datavisualization/data/baritemmodelhandler_p.h6
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy.cpp319
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy.h35
-rw-r--r--src/datavisualization/data/qitemmodelbardataproxy_p.h10
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2_plugin.cpp1
-rw-r--r--tests/itemmodeltest/main.cpp27
-rw-r--r--tests/qmlcamera/qml/qmlcamera/Axes.qml4
-rw-r--r--tests/qmlcamera/qml/qmlcamera/Data.qml174
12 files changed, 685 insertions, 223 deletions
diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
index d3da5e6a..f2a0f8b0 100644
--- a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
+++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
@@ -39,9 +39,9 @@
\snippet qmlbars/qml/qmlbars/Data.qml 0
\dots
- Each data item has four roles: year, month, income, and expenses. Years and months are natural to
- map to rows and columns of a bar chart, but we can only show either income or expenses as the
- value.
+ Each data item has three roles: timestamp, income, and expenses. The timestamp value is in
+ format: \c{<four digit year>-<two digit month>}. Years and months are natural to map to rows and
+ columns of a bar chart, but we can only show either income or expenses as the value.
Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it,
starting with a series for the income:
@@ -50,7 +50,16 @@
\dots
The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the
- series.
+ series. For \c valueRole we simply specify the \c income field, as it contains the value we
+ want, but getting the years and months is a bit more complicated, since they are both found
+ in the same field. To extract those values, we specify the \c timestamp field for both
+ \c rowRole and \c columnRole, and additionally specify a search pattern and a replace rule
+ for those roles to extract the correct portion of the field contents for each role.
+ The search pattern is a normal JavaScript regular expression and the replace rule specifies
+ what the field content that matches the regular expression is replaced with.
+ In this case we want to replace the entire field content with just the year or the month.
+ For more information how the replace using regular expressions works, see
+ QString::replace(const QRegExp &rx, const QString &after) function documentation.
Then we add another series for the expenses:
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
index 7e0978c6..6922ef17 100644
--- a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
@@ -24,96 +24,96 @@ Item {
//! [0]
ListModel {
id: dataModel
- ListElement{ year: "2006"; month: "Jan"; expenses: "4"; income: "5" }
- ListElement{ year: "2006"; month: "Feb"; expenses: "5"; income: "6" }
- ListElement{ year: "2006"; month: "Mar"; expenses: "7"; income: "4" }
+ ListElement{ timestamp: "2006-01"; expenses: "4"; income: "5" }
+ ListElement{ timestamp: "2006-02"; expenses: "5"; income: "6" }
+ ListElement{ timestamp: "2006-03"; expenses: "7"; income: "4" }
//! [0]
- ListElement{ year: "2006"; month: "Apr"; expenses: "3"; income: "2" }
- ListElement{ year: "2006"; month: "May"; expenses: "4"; income: "1" }
- ListElement{ year: "2006"; month: "Jun"; expenses: "2"; income: "2" }
- ListElement{ year: "2006"; month: "Jul"; expenses: "1"; income: "3" }
- ListElement{ year: "2006"; month: "Aug"; expenses: "5"; income: "1" }
- ListElement{ year: "2006"; month: "Sep"; expenses: "2"; income: "3" }
- ListElement{ year: "2006"; month: "Oct"; expenses: "5"; income: "2" }
- ListElement{ year: "2006"; month: "Nov"; expenses: "8"; income: "5" }
- ListElement{ year: "2006"; month: "Dec"; expenses: "3"; income: "3" }
+ ListElement{ timestamp: "2006-04"; expenses: "3"; income: "2" }
+ ListElement{ timestamp: "2006-05"; expenses: "4"; income: "1" }
+ ListElement{ timestamp: "2006-06"; expenses: "2"; income: "2" }
+ ListElement{ timestamp: "2006-07"; expenses: "1"; income: "3" }
+ ListElement{ timestamp: "2006-08"; expenses: "5"; income: "1" }
+ ListElement{ timestamp: "2006-09"; expenses: "2"; income: "3" }
+ ListElement{ timestamp: "2006-10"; expenses: "5"; income: "2" }
+ ListElement{ timestamp: "2006-11"; expenses: "8"; income: "5" }
+ ListElement{ timestamp: "2006-12"; expenses: "3"; income: "3" }
- ListElement{ year: "2007"; month: "Jan"; expenses: "3"; income: "1" }
- ListElement{ year: "2007"; month: "Feb"; expenses: "4"; income: "2" }
- ListElement{ year: "2007"; month: "Mar"; expenses: "12"; income: "4" }
- ListElement{ year: "2007"; month: "Apr"; expenses: "13"; income: "6" }
- ListElement{ year: "2007"; month: "May"; expenses: "14"; income: "11" }
- ListElement{ year: "2007"; month: "Jun"; expenses: "7"; income: "7" }
- ListElement{ year: "2007"; month: "Jul"; expenses: "6"; income: "4" }
- ListElement{ year: "2007"; month: "Aug"; expenses: "4"; income: "15" }
- ListElement{ year: "2007"; month: "Sep"; expenses: "2"; income: "18" }
- ListElement{ year: "2007"; month: "Oct"; expenses: "29"; income: "25" }
- ListElement{ year: "2007"; month: "Nov"; expenses: "23"; income: "29" }
- ListElement{ year: "2007"; month: "Dec"; expenses: "5"; income: "9" }
+ ListElement{ timestamp: "2007-01"; expenses: "3"; income: "1" }
+ ListElement{ timestamp: "2007-02"; expenses: "4"; income: "2" }
+ ListElement{ timestamp: "2007-03"; expenses: "12"; income: "4" }
+ ListElement{ timestamp: "2007-04"; expenses: "13"; income: "6" }
+ ListElement{ timestamp: "2007-05"; expenses: "14"; income: "11" }
+ ListElement{ timestamp: "2007-06"; expenses: "7"; income: "7" }
+ ListElement{ timestamp: "2007-07"; expenses: "6"; income: "4" }
+ ListElement{ timestamp: "2007-08"; expenses: "4"; income: "15" }
+ ListElement{ timestamp: "2007-09"; expenses: "2"; income: "18" }
+ ListElement{ timestamp: "2007-10"; expenses: "29"; income: "25" }
+ ListElement{ timestamp: "2007-11"; expenses: "23"; income: "29" }
+ ListElement{ timestamp: "2007-12"; expenses: "5"; income: "9" }
- ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" }
- ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" }
- ListElement{ year: "2008"; month: "Mar"; expenses: "10"; income: "20" }
- ListElement{ year: "2008"; month: "Apr"; expenses: "12"; income: "24" }
- ListElement{ year: "2008"; month: "May"; expenses: "10"; income: "19" }
- ListElement{ year: "2008"; month: "Jun"; expenses: "5"; income: "8" }
- ListElement{ year: "2008"; month: "Jul"; expenses: "1"; income: "4" }
- ListElement{ year: "2008"; month: "Aug"; expenses: "7"; income: "12" }
- ListElement{ year: "2008"; month: "Sep"; expenses: "4"; income: "16" }
- ListElement{ year: "2008"; month: "Oct"; expenses: "22"; income: "33" }
- ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" }
- ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" }
+ ListElement{ timestamp: "2008-01"; expenses: "3"; income: "8" }
+ ListElement{ timestamp: "2008-02"; expenses: "8"; income: "14" }
+ ListElement{ timestamp: "2008-03"; expenses: "10"; income: "20" }
+ ListElement{ timestamp: "2008-04"; expenses: "12"; income: "24" }
+ ListElement{ timestamp: "2008-05"; expenses: "10"; income: "19" }
+ ListElement{ timestamp: "2008-06"; expenses: "5"; income: "8" }
+ ListElement{ timestamp: "2008-07"; expenses: "1"; income: "4" }
+ ListElement{ timestamp: "2008-08"; expenses: "7"; income: "12" }
+ ListElement{ timestamp: "2008-09"; expenses: "4"; income: "16" }
+ ListElement{ timestamp: "2008-10"; expenses: "22"; income: "33" }
+ ListElement{ timestamp: "2008-11"; expenses: "16"; income: "25" }
+ ListElement{ timestamp: "2008-12"; expenses: "2"; income: "7" }
- ListElement{ year: "2009"; month: "Jan"; expenses: "4"; income: "5" }
- ListElement{ year: "2009"; month: "Feb"; expenses: "4"; income: "7" }
- ListElement{ year: "2009"; month: "Mar"; expenses: "11"; income: "14" }
- ListElement{ year: "2009"; month: "Apr"; expenses: "16"; income: "22" }
- ListElement{ year: "2009"; month: "May"; expenses: "3"; income: "5" }
- ListElement{ year: "2009"; month: "Jun"; expenses: "4"; income: "8" }
- ListElement{ year: "2009"; month: "Jul"; expenses: "7"; income: "9" }
- ListElement{ year: "2009"; month: "Aug"; expenses: "9"; income: "13" }
- ListElement{ year: "2009"; month: "Sep"; expenses: "1"; income: "6" }
- ListElement{ year: "2009"; month: "Oct"; expenses: "14"; income: "25" }
- ListElement{ year: "2009"; month: "Nov"; expenses: "19"; income: "29" }
- ListElement{ year: "2009"; month: "Dec"; expenses: "5"; income: "7" }
+ ListElement{ timestamp: "2009-01"; expenses: "4"; income: "5" }
+ ListElement{ timestamp: "2009-02"; expenses: "4"; income: "7" }
+ ListElement{ timestamp: "2009-03"; expenses: "11"; income: "14" }
+ ListElement{ timestamp: "2009-04"; expenses: "16"; income: "22" }
+ ListElement{ timestamp: "2009-05"; expenses: "3"; income: "5" }
+ ListElement{ timestamp: "2009-06"; expenses: "4"; income: "8" }
+ ListElement{ timestamp: "2009-07"; expenses: "7"; income: "9" }
+ ListElement{ timestamp: "2009-08"; expenses: "9"; income: "13" }
+ ListElement{ timestamp: "2009-09"; expenses: "1"; income: "6" }
+ ListElement{ timestamp: "2009-10"; expenses: "14"; income: "25" }
+ ListElement{ timestamp: "2009-11"; expenses: "19"; income: "29" }
+ ListElement{ timestamp: "2009-12"; expenses: "5"; income: "7" }
- ListElement{ year: "2010"; month: "Jan"; expenses: "14"; income: "22" }
- ListElement{ year: "2010"; month: "Feb"; expenses: "5"; income: "7" }
- ListElement{ year: "2010"; month: "Mar"; expenses: "1"; income: "9" }
- ListElement{ year: "2010"; month: "Apr"; expenses: "1"; income: "12" }
- ListElement{ year: "2010"; month: "May"; expenses: "5"; income: "9" }
- ListElement{ year: "2010"; month: "Jun"; expenses: "5"; income: "8" }
- ListElement{ year: "2010"; month: "Jul"; expenses: "3"; income: "7" }
- ListElement{ year: "2010"; month: "Aug"; expenses: "1"; income: "5" }
- ListElement{ year: "2010"; month: "Sep"; expenses: "2"; income: "4" }
- ListElement{ year: "2010"; month: "Oct"; expenses: "10"; income: "13" }
- ListElement{ year: "2010"; month: "Nov"; expenses: "12"; income: "17" }
- ListElement{ year: "2010"; month: "Dec"; expenses: "6"; income: "9" }
+ ListElement{ timestamp: "2010-01"; expenses: "14"; income: "22" }
+ ListElement{ timestamp: "2010-02"; expenses: "5"; income: "7" }
+ ListElement{ timestamp: "2010-03"; expenses: "1"; income: "9" }
+ ListElement{ timestamp: "2010-04"; expenses: "1"; income: "12" }
+ ListElement{ timestamp: "2010-05"; expenses: "5"; income: "9" }
+ ListElement{ timestamp: "2010-06"; expenses: "5"; income: "8" }
+ ListElement{ timestamp: "2010-07"; expenses: "3"; income: "7" }
+ ListElement{ timestamp: "2010-08"; expenses: "1"; income: "5" }
+ ListElement{ timestamp: "2010-09"; expenses: "2"; income: "4" }
+ ListElement{ timestamp: "2010-10"; expenses: "10"; income: "13" }
+ ListElement{ timestamp: "2010-11"; expenses: "12"; income: "17" }
+ ListElement{ timestamp: "2010-12"; expenses: "6"; income: "9" }
- ListElement{ year: "2011"; month: "Jan"; expenses: "2"; income: "6" }
- ListElement{ year: "2011"; month: "Feb"; expenses: "4"; income: "8" }
- ListElement{ year: "2011"; month: "Mar"; expenses: "7"; income: "12" }
- ListElement{ year: "2011"; month: "Apr"; expenses: "9"; income: "15" }
- ListElement{ year: "2011"; month: "May"; expenses: "7"; income: "19" }
- ListElement{ year: "2011"; month: "Jun"; expenses: "9"; income: "18" }
- ListElement{ year: "2011"; month: "Jul"; expenses: "13"; income: "17" }
- ListElement{ year: "2011"; month: "Aug"; expenses: "5"; income: "9" }
- ListElement{ year: "2011"; month: "Sep"; expenses: "3"; income: "8" }
- ListElement{ year: "2011"; month: "Oct"; expenses: "13"; income: "15" }
- ListElement{ year: "2011"; month: "Nov"; expenses: "8"; income: "17" }
- ListElement{ year: "2011"; month: "Dec"; expenses: "7"; income: "10" }
+ ListElement{ timestamp: "2011-01"; expenses: "2"; income: "6" }
+ ListElement{ timestamp: "2011-02"; expenses: "4"; income: "8" }
+ ListElement{ timestamp: "2011-03"; expenses: "7"; income: "12" }
+ ListElement{ timestamp: "2011-04"; expenses: "9"; income: "15" }
+ ListElement{ timestamp: "2011-05"; expenses: "7"; income: "19" }
+ ListElement{ timestamp: "2011-06"; expenses: "9"; income: "18" }
+ ListElement{ timestamp: "2011-07"; expenses: "13"; income: "17" }
+ ListElement{ timestamp: "2011-08"; expenses: "5"; income: "9" }
+ ListElement{ timestamp: "2011-09"; expenses: "3"; income: "8" }
+ ListElement{ timestamp: "2011-10"; expenses: "13"; income: "15" }
+ ListElement{ timestamp: "2011-11"; expenses: "8"; income: "17" }
+ ListElement{ timestamp: "2011-12"; expenses: "7"; income: "10" }
- ListElement{ year: "2012"; month: "Jan"; expenses: "12"; income: "16" }
- ListElement{ year: "2012"; month: "Feb"; expenses: "24"; income: "28" }
- ListElement{ year: "2012"; month: "Mar"; expenses: "27"; income: "22" }
- ListElement{ year: "2012"; month: "Apr"; expenses: "29"; income: "25" }
- ListElement{ year: "2012"; month: "May"; expenses: "27"; income: "29" }
- ListElement{ year: "2012"; month: "Jun"; expenses: "19"; income: "18" }
- ListElement{ year: "2012"; month: "Jul"; expenses: "13"; income: "17" }
- ListElement{ year: "2012"; month: "Aug"; expenses: "15"; income: "19" }
- ListElement{ year: "2012"; month: "Sep"; expenses: "3"; income: "8" }
- ListElement{ year: "2012"; month: "Oct"; expenses: "3"; income: "6" }
- ListElement{ year: "2012"; month: "Nov"; expenses: "4"; income: "8" }
- ListElement{ year: "2012"; month: "Dec"; expenses: "5"; income: "9" }
+ ListElement{ timestamp: "2012-01"; expenses: "12"; income: "16" }
+ ListElement{ timestamp: "2012-02"; expenses: "24"; income: "28" }
+ ListElement{ timestamp: "2012-03"; expenses: "27"; income: "22" }
+ ListElement{ timestamp: "2012-04"; expenses: "29"; income: "25" }
+ ListElement{ timestamp: "2012-05"; expenses: "27"; income: "29" }
+ ListElement{ timestamp: "2012-06"; expenses: "19"; income: "18" }
+ ListElement{ timestamp: "2012-07"; expenses: "13"; income: "17" }
+ ListElement{ timestamp: "2012-08"; expenses: "15"; income: "19" }
+ ListElement{ timestamp: "2012-09"; expenses: "3"; income: "8" }
+ ListElement{ timestamp: "2012-10"; expenses: "3"; income: "6" }
+ ListElement{ timestamp: "2012-11"; expenses: "4"; income: "8" }
+ ListElement{ timestamp: "2012-12"; expenses: "5"; income: "9" }
}
}
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
index 0df8d8ae..2bb5e376 100644
--- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
@@ -19,7 +19,7 @@
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
+import QtDataVisualization 1.1
import QtQuick.Window 2.0
import "."
@@ -50,14 +50,13 @@ Rectangle {
// Set tableView current row to selected bar
var rowRole = series.dataProxy.rowLabels[position.x];
var colRole = series.dataProxy.columnLabels[position.y];
+ var checkTimestamp = rowRole + "-" + colRole
var currentRow = tableView.currentRow
- if (currentRow === -1 || rowRole !== graphData.model.get(currentRow).year
- || colRole !== graphData.model.get(currentRow).month) {
+ if (currentRow === -1 || checkTimestamp !== graphData.model.get(currentRow).timestamp) {
var totalRows = tableView.rowCount;
for (var i = 0; i < totalRows; i++) {
- var currentRowRole = graphData.model.get(i).year
- var currentColRole = graphData.model.get(i).month
- if (currentRowRole === rowRole && currentColRole === colRole) {
+ var modelTimestamp = graphData.model.get(i).timestamp
+ if (modelTimestamp === checkTimestamp) {
tableView.currentRow = i
// Workaround to 5.2 row selection issue
if (typeof tableView.selection != "undefined") {
@@ -111,9 +110,13 @@ Rectangle {
ItemModelBarDataProxy {
id: modelProxy
itemModel: graphData.model
- rowRole: "year"
- columnRole: "month"
+ rowRole: "timestamp"
+ columnRole: "timestamp"
valueRole: "income"
+ rowRolePattern: /^(\d\d\d\d).*$/
+ columnRolePattern: /^.*-(\d\d)$/
+ rowRoleReplace: "\\1"
+ columnRoleReplace: "\\1"
}
//! [3]
@@ -136,9 +139,13 @@ Rectangle {
ItemModelBarDataProxy {
id: secondaryProxy
itemModel: graphData.model
- rowRole: "year"
- columnRole: "month"
+ rowRole: "timestamp"
+ columnRole: "timestamp"
valueRole: "expenses"
+ rowRolePattern: /^(\d\d\d\d).*$/
+ columnRolePattern: /^.*-(\d\d)$/
+ rowRoleReplace: "\\1"
+ columnRoleReplace: "\\1"
}
//! [4]
@@ -157,16 +164,42 @@ Rectangle {
id: tableView
anchors.top: parent.top
anchors.left: parent.left
- TableViewColumn{ role: "year" ; title: "Year" ; width: tableView.width / 4 }
- TableViewColumn{ role: "month" ; title: "Month" ; width: tableView.width / 4 }
+ TableViewColumn{ role: "timestamp" ; title: "Month" ; width: tableView.width / 2 }
TableViewColumn{ role: "expenses" ; title: "Expenses" ; width: tableView.width / 4 }
TableViewColumn{ role: "income" ; title: "Income" ; width: tableView.width / 4 }
+ itemDelegate: Item {
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+ width: parent.width
+ anchors.leftMargin: 4
+ anchors.left: parent.left
+ anchors.right: parent.right
+ color: styleData.textColor
+ elide: styleData.elideMode
+ text: styleData.value
+ horizontalAlignment: styleData.textAlignment
+
+ Component.onCompleted: {
+ if (styleData.column === 0) {
+ var pattern = /(\d\d\d\d)-(\d\d)/
+ var matches = pattern.exec(styleData.value)
+ var colIndex = parseInt(matches[2], 10) - 1
+ text = matches[1] + " - " + barGraph.columnAxis.labels[colIndex]
+
+ }
+ }
+ }
+ }
+
model: graphData.model
//! [2]
onCurrentRowChanged: {
- var rowIndex = modelProxy.rowCategoryIndex(graphData.model.get(currentRow).year)
- var colIndex = modelProxy.columnCategoryIndex(graphData.model.get(currentRow).month)
+ var timestamp = graphData.model.get(currentRow).timestamp
+ var pattern = /(\d\d\d\d)-(\d\d)/
+ var matches = pattern.exec(timestamp)
+ var rowIndex = modelProxy.rowCategoryIndex(matches[1])
+ var colIndex = modelProxy.columnCategoryIndex(matches[2])
if (selectedSeries.visible)
mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex)
else if (barSeries.visible)
diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp
index 3b02c1e3..e8941c4b 100644
--- a/src/datavisualization/data/baritemmodelhandler.cpp
+++ b/src/datavisualization/data/baritemmodelhandler.cpp
@@ -28,7 +28,9 @@ BarItemModelHandler::BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject
m_proxyArray(0),
m_columnCount(0),
m_valueRole(noRoleIndex),
- m_rotationRole(noRoleIndex)
+ m_rotationRole(noRoleIndex),
+ m_haveValuePattern(false),
+ m_haveRotationPattern(false)
{
}
@@ -54,9 +56,24 @@ void BarItemModelHandler::handleDataChanged(const QModelIndex &topLeft,
for (int i = startRow; i <= endRow; i++) {
for (int j = startCol; j <= endCol; j++) {
QBarDataItem item;
- item.setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat());
- if (m_rotationRole != noRoleIndex)
- item.setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat());
+ QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole);
+ float value;
+ if (m_haveValuePattern)
+ value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat();
+ else
+ value = valueVar.toFloat();
+ item.setValue(value);
+ if (m_rotationRole != noRoleIndex) {
+ QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole);
+ float rotation;
+ if (m_haveRotationPattern) {
+ rotation = rotationVar.toString().replace(m_rotationPattern,
+ m_rotationReplace).toFloat();
+ } else {
+ rotation = rotationVar.toFloat();
+ }
+ item.setRotation(rotation);
+ }
m_proxy->setItem(i, j, item);
}
}
@@ -78,6 +95,21 @@ void BarItemModelHandler::resolveModel()
return;
}
+ // Value and rotation patterns can be reused on single item changes,
+ // so store them to member variables.
+ QRegExp rowPattern(m_proxy->rowRolePattern());
+ QRegExp colPattern(m_proxy->columnRolePattern());
+ m_valuePattern = m_proxy->valueRolePattern();
+ m_rotationPattern = m_proxy->rotationRolePattern();
+ QString rowReplace = m_proxy->rowRoleReplace();
+ QString colReplace = m_proxy->columnRoleReplace();
+ m_valueReplace = m_proxy->valueRoleReplace();
+ m_rotationReplace = m_proxy->rotationRoleReplace();
+ bool haveRowPattern = !rowPattern.isEmpty() && rowPattern.isValid();
+ bool haveColPattern = !colPattern.isEmpty() && colPattern.isValid();
+ m_haveValuePattern = !m_valuePattern.isEmpty() && m_valuePattern.isValid();
+ m_haveRotationPattern = !m_rotationPattern.isEmpty() && m_rotationPattern.isValid();
+
QStringList rowLabels;
QStringList columnLabels;
@@ -101,9 +133,24 @@ void BarItemModelHandler::resolveModel()
for (int i = 0; i < rowCount; i++) {
QBarDataRow &newProxyRow = *m_proxyArray->at(i);
for (int j = 0; j < columnCount; j++) {
- newProxyRow[j].setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat());
- if (m_rotationRole != noRoleIndex)
- newProxyRow[j].setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat());
+ QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole);
+ float value;
+ if (m_haveValuePattern)
+ value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat();
+ else
+ value = valueVar.toFloat();
+ newProxyRow[j].setValue(value);
+ if (m_rotationRole != noRoleIndex) {
+ QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole);
+ float rotation;
+ if (m_haveRotationPattern) {
+ rotation = rotationVar.toString().replace(m_rotationPattern,
+ m_rotationReplace).toFloat();
+ } else {
+ rotation = rotationVar.toFloat();
+ }
+ newProxyRow[j].setRotation(rotation);
+ }
}
}
// Generate labels from headers if using model rows/columns
@@ -133,10 +180,29 @@ void BarItemModelHandler::resolveModel()
for (int j = 0; j < columnCount; j++) {
QModelIndex index = m_itemModel->index(i, j);
QString rowRoleStr = index.data(rowRole).toString();
+ if (haveRowPattern)
+ rowRoleStr.replace(rowPattern, rowReplace);
QString columnRoleStr = index.data(columnRole).toString();
- itemValueMap[rowRoleStr][columnRoleStr] = index.data(m_valueRole).toFloat();
- if (m_rotationRole != noRoleIndex)
- itemRotationMap[rowRoleStr][columnRoleStr] = index.data(m_rotationRole).toFloat();
+ if (haveColPattern)
+ columnRoleStr.replace(colPattern, colReplace);
+ QVariant valueVar = index.data(m_valueRole);
+ float value;
+ if (m_haveValuePattern)
+ value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat();
+ else
+ value = valueVar.toFloat();
+ itemValueMap[rowRoleStr][columnRoleStr] = value;
+ if (m_rotationRole != noRoleIndex) {
+ QVariant rotationVar = index.data(m_rotationRole);
+ float rotation;
+ if (m_haveRotationPattern) {
+ rotation = rotationVar.toString().replace(m_rotationPattern,
+ m_rotationReplace).toFloat();
+ } else {
+ rotation = rotationVar.toFloat();
+ }
+ itemRotationMap[rowRoleStr][columnRoleStr] = rotation;
+ }
if (generateRows && !rowListHash.value(rowRoleStr, false)) {
rowListHash.insert(rowRoleStr, true);
rowList << rowRoleStr;
diff --git a/src/datavisualization/data/baritemmodelhandler_p.h b/src/datavisualization/data/baritemmodelhandler_p.h
index 737e0055..6dea906e 100644
--- a/src/datavisualization/data/baritemmodelhandler_p.h
+++ b/src/datavisualization/data/baritemmodelhandler_p.h
@@ -53,6 +53,12 @@ protected:
int m_columnCount;
int m_valueRole;
int m_rotationRole;
+ QRegExp m_valuePattern;
+ QRegExp m_rotationPattern;
+ QString m_valueReplace;
+ QString m_rotationReplace;
+ bool m_haveValuePattern;
+ bool m_haveRotationPattern;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp
index 2281e33f..2351bc25 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp
@@ -50,12 +50,22 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* and in which order by defining an explicit list of categories for either or both of rows and
* columns.
*
- * For example, assume that you have a custom QAbstractItemModel for storing various monthly values
- * related to a business.
- * Each item in the model has the roles "year", "month", "income", and "expenses".
- * You could do the following to display the data in a bar graph:
+ * For example, assume that you have a custom QAbstractItemModel for storing various monthly values
+ * related to a business.
+ * Each item in the model has the roles "year", "month", "income", and "expenses".
+ * You could do the following to display the data in a bar graph:
*
- * \snippet doc_src_qtdatavisualization.cpp 3
+ * \snippet doc_src_qtdatavisualization.cpp 3
+ *
+ * If the fields of the model do not contain the data in the exact format you need, you can specify
+ * a search pattern regular expression and a replace rule for each role to get the value in a
+ * format you need. For more information how the replace using regular expressions works, see
+ * QString::replace(const QRegExp &rx, const QString &after) function documentation. Note that
+ * using regular expressions has an impact on the performance, so it's more efficient to utilize
+ * item models where doing search and replace is not necessary to get the desired values.
+ *
+ * For example about using the search patterns in conjunction with the roles, see
+ * \l{Qt Quick 2 Bars Example}.
*
* \sa {Qt Data Visualization Data Handling}
*/
@@ -90,35 +100,36 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
/*!
* \qmlproperty string ItemModelBarDataProxy::rowRole
- * The row role of the mapping.
+ * Defines the item model role to map into row category.
*/
/*!
* \qmlproperty string ItemModelBarDataProxy::columnRole
- * The column role of the mapping.
+ * Defines the item model role to map into column category.
*/
/*!
* \qmlproperty string ItemModelBarDataProxy::valueRole
- * The value role of the mapping.
+ * Defines the item model role to map into bar value.
*/
/*!
* \qmlproperty string ItemModelBarDataProxy::rotationRole
- *
- * Defines the rotation role for the mapping.
+ * Defines the item model role to map into bar rotation angle.
*/
/*!
* \qmlproperty list<String> ItemModelBarDataProxy::rowCategories
- * The row categories of the mapping. Only items with row roles that are found in this list are
- * included when the data is resolved. The rows are ordered in the same order as they are in this list.
+ * The row categories of the mapping. Only items with row role values that are found in this list
+ * are included when the data is resolved. The rows are ordered in the same order as they are in
+ * this list.
*/
/*!
* \qmlproperty list<String> ItemModelBarDataProxy::columnCategories
- * The column categories of the mapping. Only items with column roles that are found in this list are
- * included when the data is resolved. The columns are ordered in the same order as they are in this list.
+ * The column categories of the mapping. Only items with column role values that are found in this
+ * list are included when the data is resolved. The columns are ordered in the same order as they
+ * are in this list.
*/
/*!
@@ -143,6 +154,86 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ * \qmlproperty regExp ItemModelBarDataProxy::rowRolePattern
+ * When set, a search and replace is done on the value mapped by row role before it is used as
+ * a row category. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and rowRoleReplace property contains the replacement string.
+ * This is useful for example in parsing row and column categories from a single
+ * timestamp field in the item model.
+ *
+ * \sa rowRole, rowRoleReplace
+ */
+
+/*!
+ * \qmlproperty regExp ItemModelBarDataProxy::columnRolePattern
+ * When set, a search and replace is done on the value mapped by column role before it is used
+ * as a column category. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and columnRoleReplace property contains the replacement string.
+ * This is useful for example in parsing row and column categories from
+ * a single timestamp field in the item model.
+ *
+ * \sa columnRole, columnRoleReplace
+ */
+
+/*!
+ * \qmlproperty regExp ItemModelBarDataProxy::valueRolePattern
+ * When set, a search and replace is done on the value mapped by value role before it is used as
+ * a bar value. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and valueRoleReplace property contains the replacement string.
+ *
+ * \sa valueRole, valueRoleReplace
+ */
+
+/*!
+ * \qmlproperty regExp ItemModelBarDataProxy::rotationRolePattern
+ * When set, a search and replace is done on the value mapped by rotation role before it is used
+ * as a bar rotation angle. This property specifies the regular expression to find the portion
+ * of the mapped value to replace and rotationRoleReplace property contains the replacement string.
+ *
+ * \sa rotationRole, rotationRoleReplace
+ */
+
+/*!
+ * \qmlproperty string ItemModelBarDataProxy::rowRoleReplace
+ * This property defines the replace content to be used in conjunction with rowRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa rowRole, rowRolePattern
+ */
+
+/*!
+ * \qmlproperty string ItemModelBarDataProxy::columnRoleReplace
+ * This property defines the replace content to be used in conjunction with columnRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa columnRole, columnRolePattern
+ */
+
+/*!
+ * \qmlproperty string ItemModelBarDataProxy::valueRoleReplace
+ * This property defines the replace content to be used in conjunction with valueRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa valueRole, valueRolePattern
+ */
+
+/*!
+ * \qmlproperty string ItemModelBarDataProxy::rotationRoleReplace
+ * This property defines the replace content to be used in conjunction with rotationRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa rotationRole, rotationRolePattern
+ */
+
+/*!
* Constructs QItemModelBarDataProxy with optional \a parent.
*/
QItemModelBarDataProxy::QItemModelBarDataProxy(QObject *parent)
@@ -506,6 +597,190 @@ int QItemModelBarDataProxy::columnCategoryIndex(const QString &category)
}
/*!
+ * \property QItemModelBarDataProxy::rowRolePattern
+ *
+ * When set, a search and replace is done on the value mapped by row role before it is used as
+ * a row category. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and rowRoleReplace property contains the replacement string.
+ * This is useful for example in parsing row and column categories from a single
+ * timestamp field in the item model.
+ *
+ * \sa rowRole, rowRoleReplace
+ */
+void QItemModelBarDataProxy::setRowRolePattern(const QRegExp &pattern)
+{
+ if (dptr()->m_rowRolePattern != pattern) {
+ dptr()->m_rowRolePattern = pattern;
+ emit rowRolePatternChanged(pattern);
+ }
+}
+
+QRegExp QItemModelBarDataProxy::rowRolePattern() const
+{
+ return dptrc()->m_rowRolePattern;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::columnRolePattern
+ *
+ * When set, a search and replace is done on the value mapped by column role before it is used
+ * as a column category. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and columnRoleReplace property contains the replacement string.
+ * This is useful for example in parsing row and column categories from
+ * a single timestamp field in the item model.
+ *
+ * \sa columnRole, columnRoleReplace
+ */
+void QItemModelBarDataProxy::setColumnRolePattern(const QRegExp &pattern)
+{
+ if (dptr()->m_columnRolePattern != pattern) {
+ dptr()->m_columnRolePattern = pattern;
+ emit columnRolePatternChanged(pattern);
+ }
+}
+
+QRegExp QItemModelBarDataProxy::columnRolePattern() const
+{
+ return dptrc()->m_columnRolePattern;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::valueRolePattern
+ *
+ * When set, a search and replace is done on the value mapped by value role before it is used as
+ * a bar value. This property specifies the regular expression to find the portion of the
+ * mapped value to replace and valueRoleReplace property contains the replacement string.
+ *
+ * \sa valueRole, valueRoleReplace
+ */
+void QItemModelBarDataProxy::setValueRolePattern(const QRegExp &pattern)
+{
+ if (dptr()->m_valueRolePattern != pattern) {
+ dptr()->m_valueRolePattern = pattern;
+ emit valueRolePatternChanged(pattern);
+ }
+}
+
+QRegExp QItemModelBarDataProxy::valueRolePattern() const
+{
+ return dptrc()->m_valueRolePattern;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::rotationRolePattern
+ *
+ * When set, a search and replace is done on the value mapped by rotation role before it is used
+ * as a bar rotation angle. This property specifies the regular expression to find the portion
+ * of the mapped value to replace and rotationRoleReplace property contains the replacement string.
+ *
+ * \sa rotationRole, rotationRoleReplace
+ */
+void QItemModelBarDataProxy::setRotationRolePattern(const QRegExp &pattern)
+{
+ if (dptr()->m_rotationRolePattern != pattern) {
+ dptr()->m_rotationRolePattern = pattern;
+ emit rotationRolePatternChanged(pattern);
+ }
+}
+
+QRegExp QItemModelBarDataProxy::rotationRolePattern() const
+{
+ return dptrc()->m_rotationRolePattern;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::rowRoleReplace
+ *
+ * This property defines the replace content to be used in conjunction with rowRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa rowRole, rowRolePattern
+ */
+void QItemModelBarDataProxy::setRowRoleReplace(const QString &replace)
+{
+ if (dptr()->m_rowRoleReplace != replace) {
+ dptr()->m_rowRoleReplace = replace;
+ emit rowRoleReplaceChanged(replace);
+ }
+}
+
+QString QItemModelBarDataProxy::rowRoleReplace() const
+{
+ return dptrc()->m_rowRoleReplace;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::columnRoleReplace
+ *
+ * This property defines the replace content to be used in conjunction with columnRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa columnRole, columnRolePattern
+ */
+void QItemModelBarDataProxy::setColumnRoleReplace(const QString &replace)
+{
+ if (dptr()->m_columnRoleReplace != replace) {
+ dptr()->m_columnRoleReplace = replace;
+ emit columnRoleReplaceChanged(replace);
+ }
+}
+
+QString QItemModelBarDataProxy::columnRoleReplace() const
+{
+ return dptrc()->m_columnRoleReplace;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::valueRoleReplace
+ *
+ * This property defines the replace content to be used in conjunction with valueRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa valueRole, valueRolePattern
+ */
+void QItemModelBarDataProxy::setValueRoleReplace(const QString &replace)
+{
+ if (dptr()->m_valueRoleReplace != replace) {
+ dptr()->m_valueRoleReplace = replace;
+ emit valueRoleReplaceChanged(replace);
+ }
+}
+
+QString QItemModelBarDataProxy::valueRoleReplace() const
+{
+ return dptrc()->m_valueRoleReplace;
+}
+
+/*!
+ * \property QItemModelBarDataProxy::rotationRoleReplace
+ *
+ * This property defines the replace content to be used in conjunction with rotationRolePattern.
+ * Defaults to empty string. For more information on how the search and replace using regular
+ * expressions works, see QString::replace(const QRegExp &rx, const QString &after)
+ * function documentation.
+ *
+ * \sa rotationRole, rotationRolePattern
+ */
+void QItemModelBarDataProxy::setRotationRoleReplace(const QString &replace)
+{
+ if (dptr()->m_rotationRoleReplace != replace) {
+ dptr()->m_rotationRoleReplace = replace;
+ emit rotationRoleReplaceChanged(replace);
+ }
+}
+
+QString QItemModelBarDataProxy::rotationRoleReplace() const
+{
+ return dptrc()->m_rotationRoleReplace;
+}
+
+/*!
* \internal
*/
QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptr()
@@ -564,6 +839,22 @@ void QItemModelBarDataProxyPrivate::connectItemModelHandler()
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
QObject::connect(qptr(), &QItemModelBarDataProxy::autoColumnCategoriesChanged,
m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::rowRolePatternChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::columnRolePatternChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::valueRolePatternChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRolePatternChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::rowRoleReplaceChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::columnRoleReplaceChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::valueRoleReplaceChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRoleReplaceChanged,
+ m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h
index f19b4445..ad7be3a7 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy.h
+++ b/src/datavisualization/data/qitemmodelbardataproxy.h
@@ -21,6 +21,7 @@
#include <QtDataVisualization/qbardataproxy.h>
#include <QtCore/QAbstractItemModel>
+#include <QtCore/QRegExp>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -39,6 +40,14 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy
Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged)
Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories NOTIFY autoRowCategoriesChanged)
Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories NOTIFY autoColumnCategoriesChanged)
+ Q_PROPERTY(QRegExp rowRolePattern READ rowRolePattern WRITE setRowRolePattern NOTIFY rowRolePatternChanged REVISION 1)
+ Q_PROPERTY(QRegExp columnRolePattern READ columnRolePattern WRITE setColumnRolePattern NOTIFY columnRolePatternChanged REVISION 1)
+ Q_PROPERTY(QRegExp valueRolePattern READ valueRolePattern WRITE setValueRolePattern NOTIFY valueRolePatternChanged REVISION 1)
+ Q_PROPERTY(QRegExp rotationRolePattern READ rotationRolePattern WRITE setRotationRolePattern NOTIFY rotationRolePatternChanged REVISION 1)
+ Q_PROPERTY(QString rowRoleReplace READ rowRoleReplace WRITE setRowRoleReplace NOTIFY rowRoleReplaceChanged REVISION 1)
+ Q_PROPERTY(QString columnRoleReplace READ columnRoleReplace WRITE setColumnRoleReplace NOTIFY columnRoleReplaceChanged REVISION 1)
+ Q_PROPERTY(QString valueRoleReplace READ valueRoleReplace WRITE setValueRoleReplace NOTIFY valueRoleReplaceChanged REVISION 1)
+ Q_PROPERTY(QString rotationRoleReplace READ rotationRoleReplace WRITE setRotationRoleReplace NOTIFY rotationRoleReplaceChanged REVISION 1)
public:
explicit QItemModelBarDataProxy(QObject *parent = 0);
@@ -93,6 +102,24 @@ public:
Q_INVOKABLE int rowCategoryIndex(const QString& category);
Q_INVOKABLE int columnCategoryIndex(const QString& category);
+ void setRowRolePattern(const QRegExp &pattern);
+ QRegExp rowRolePattern() const;
+ void setColumnRolePattern(const QRegExp &pattern);
+ QRegExp columnRolePattern() const;
+ void setValueRolePattern(const QRegExp &pattern);
+ QRegExp valueRolePattern() const;
+ void setRotationRolePattern(const QRegExp &pattern);
+ QRegExp rotationRolePattern() const;
+
+ void setRowRoleReplace(const QString &replace);
+ QString rowRoleReplace() const;
+ void setColumnRoleReplace(const QString &replace);
+ QString columnRoleReplace() const;
+ void setValueRoleReplace(const QString &replace);
+ QString valueRoleReplace() const;
+ void setRotationRoleReplace(const QString &replace);
+ QString rotationRoleReplace() const;
+
signals:
void itemModelChanged(const QAbstractItemModel* itemModel);
void rowRoleChanged(const QString &role);
@@ -104,6 +131,14 @@ signals:
void useModelCategoriesChanged(bool enable);
void autoRowCategoriesChanged(bool enable);
void autoColumnCategoriesChanged(bool enable);
+ Q_REVISION(1) void rowRolePatternChanged(const QRegExp &pattern);
+ Q_REVISION(1) void columnRolePatternChanged(const QRegExp &pattern);
+ Q_REVISION(1) void valueRolePatternChanged(const QRegExp &pattern);
+ Q_REVISION(1) void rotationRolePatternChanged(const QRegExp &pattern);
+ Q_REVISION(1) void rowRoleReplaceChanged(const QString &replace);
+ Q_REVISION(1) void columnRoleReplaceChanged(const QString &replace);
+ Q_REVISION(1) void valueRoleReplaceChanged(const QString &replace);
+ Q_REVISION(1) void rotationRoleReplaceChanged(const QString &replace);
protected:
QItemModelBarDataProxyPrivate *dptr();
diff --git a/src/datavisualization/data/qitemmodelbardataproxy_p.h b/src/datavisualization/data/qitemmodelbardataproxy_p.h
index 2fd74bb2..3e8fa3ae 100644
--- a/src/datavisualization/data/qitemmodelbardataproxy_p.h
+++ b/src/datavisualization/data/qitemmodelbardataproxy_p.h
@@ -63,6 +63,16 @@ private:
bool m_autoRowCategories;
bool m_autoColumnCategories;
+ QRegExp m_rowRolePattern;
+ QRegExp m_columnRolePattern;
+ QRegExp m_valueRolePattern;
+ QRegExp m_rotationRolePattern;
+
+ QString m_rowRoleReplace;
+ QString m_columnRoleReplace;
+ QString m_valueRoleReplace;
+ QString m_rotationRoleReplace;
+
friend class BarItemModelHandler;
friend class QItemModelBarDataProxy;
};
diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
index 71c54265..d7a82d6b 100644
--- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
+++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp
@@ -92,6 +92,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri)
QLatin1String("Trying to create uncreatable: Abstract3DSeries."));
qmlRegisterUncreatableType<AbstractDeclarative, 1>(uri, 1, 1, "AbstractGraph3D",
QLatin1String("Trying to create uncreatable: AbstractGraph3D."));
+ qmlRegisterType<QItemModelBarDataProxy, 1>(uri, 1, 1, "ItemModelBarDataProxy");
// New types
qmlRegisterType<QValue3DAxisFormatter>(uri, 1, 1, "ValueAxis3DFormatter");
diff --git a/tests/itemmodeltest/main.cpp b/tests/itemmodeltest/main.cpp
index 419ee162..a607fe8d 100644
--- a/tests/itemmodeltest/main.cpp
+++ b/tests/itemmodeltest/main.cpp
@@ -149,11 +149,11 @@ void GraphDataGenerator::setupModel()
weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5";
// Set up data Mon Tue Wed Thu Fri Sat Sun
- float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 10.0f}, // week 1
- {0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2
- {1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3
- {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4
- {3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5
+ const char *hours[5][7] = {{"2.0/30", "1.0/30", "3.0/30", "0.2/30", "1.0/30", "5.0/30", "10.0/30"}, // week 1
+ {"0.5/45", "1.0/45", "3.0/45", "1.0/45", "2.0/45", "2.0/45", "3.0/45"}, // week 2
+ {"1.0/60", "1.0/60", "2.0/60", "1.0/60", "4.0/60", "4.0/60", "4.0/60"}, // week 3
+ {"0.0/75", "1.0/75", "0.0/75", "0.0/75", "2.0/75", "2.0/75", "0.3/75"}, // week 4
+ {"3.0/90", "3.0/90", "6.0/90", "2.0/90", "2.0/90", "1.0/90", "1.0/90"}}; // week 5
// Add labels
m_barGraph->rowAxis()->setTitle("Week of year");
@@ -190,7 +190,8 @@ void GraphDataGenerator::addRow()
for (int i = 0; i < m_columnCount; i++) {
QModelIndex index = m_tableWidget->model()->index(0, i);
m_tableWidget->model()->setData(index,
- ((float)i / (float)m_columnCount) / 2.0f + (float)(rand() % 30) / 100.0f);
+ ((float)i / (float)m_columnCount) / 2.0f
+ + (float)(rand() % 30) / 100.0f);
}
m_tableWidget->resizeColumnsToContents();
}
@@ -225,8 +226,12 @@ void GraphDataGenerator::changeSelectedButtonClicked()
// Change all selected cells to a random value 1-10
QVariant value = QVariant::fromValue(float((rand() % 10) + 1));
QList<QTableWidgetItem *> selectedItems = m_tableWidget->selectedItems();
- foreach (QTableWidgetItem *item, selectedItems)
- item->setData(Qt::DisplayRole, value);
+ foreach (QTableWidgetItem *item, selectedItems) {
+ item->setData(Qt::DisplayRole,
+ QString::number(value.toReal())
+ .append("/")
+ .append(QString::number(value.toReal() * 10)));
+ }
}
int main(int argc, char **argv)
@@ -269,6 +274,12 @@ int main(int argc, char **argv)
QItemModelSurfaceDataProxy *surfaceProxy = new QItemModelSurfaceDataProxy(tableWidget->model());
barProxy->setUseModelCategories(true);
surfaceProxy->setUseModelCategories(true);
+ barProxy->setRotationRole(tableWidget->model()->roleNames().value(Qt::DisplayRole));
+ barProxy->setValueRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$")));
+ barProxy->setRotationRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$")));
+ barProxy->setValueRoleReplace(QStringLiteral("\\1"));
+ barProxy->setRotationRoleReplace(QStringLiteral("\\2"));
+ // TODO surface proxy test
QBar3DSeries *barSeries = new QBar3DSeries(barProxy);
QSurface3DSeries *surfaceSeries = new QSurface3DSeries(surfaceProxy);
barSeries->setMesh(QAbstract3DSeries::MeshPyramid);
diff --git a/tests/qmlcamera/qml/qmlcamera/Axes.qml b/tests/qmlcamera/qml/qmlcamera/Axes.qml
index a6b8d4de..6494adbc 100644
--- a/tests/qmlcamera/qml/qmlcamera/Axes.qml
+++ b/tests/qmlcamera/qml/qmlcamera/Axes.qml
@@ -35,15 +35,11 @@ Item {
}
ValueAxis3D {
id: incomeAxis
- min: 0
- max: 35
labelFormat: "%.2f M\u20AC"
title: "Monthly income"
}
ValueAxis3D {
id: expensesAxis
- min: 0
- max: 35
labelFormat: "-%.2f M\u20AC"
title: "Monthly expenses"
}
diff --git a/tests/qmlcamera/qml/qmlcamera/Data.qml b/tests/qmlcamera/qml/qmlcamera/Data.qml
index bab6bf78..8a301925 100644
--- a/tests/qmlcamera/qml/qmlcamera/Data.qml
+++ b/tests/qmlcamera/qml/qmlcamera/Data.qml
@@ -17,7 +17,7 @@
****************************************************************************/
import QtQuick 2.1
-import QtDataVisualization 1.0
+import QtDataVisualization 1.1
Item {
property alias model: dataModel
@@ -31,6 +31,10 @@ Item {
columnRole: "month"
valueRole: "expenses"
rotationRole: "angle"
+ valueRolePattern: /@*(\d*)t*/
+ rotationRolePattern: /jjj/
+ valueRoleReplace: "\\1"
+ rotationRoleReplace: "1"
}
Bar3DSeries {
@@ -43,95 +47,95 @@ Item {
ListModel {
id: dataModel
- ListElement{ year: "2006"; month: "Jan"; expenses: "4"; angle: "1"; income: "5" }
- ListElement{ year: "2006"; month: "Feb"; expenses: "5"; angle: "2"; income: "6" }
- ListElement{ year: "2006"; month: "Mar"; expenses: "7"; angle: "3"; income: "4" }
- ListElement{ year: "2006"; month: "Apr"; expenses: "3"; angle: "4"; income: "2" }
- ListElement{ year: "2006"; month: "May"; expenses: "4"; angle: "5"; income: "1" }
- ListElement{ year: "2006"; month: "Jun"; expenses: "2"; angle: "6"; income: "2" }
- ListElement{ year: "2006"; month: "Jul"; expenses: "1"; angle: "7"; income: "3" }
- ListElement{ year: "2006"; month: "Aug"; expenses: "5"; angle: "8"; income: "1" }
- ListElement{ year: "2006"; month: "Sep"; expenses: "2"; angle: "9"; income: "3" }
- ListElement{ year: "2006"; month: "Oct"; expenses: "5"; angle: "10"; income: "2" }
- ListElement{ year: "2006"; month: "Nov"; expenses: "8"; angle: "11"; income: "5" }
- ListElement{ year: "2006"; month: "Dec"; expenses: "3"; angle: "12"; income: "3" }
+ ListElement{ year: "2006"; month: "Jan"; expenses: "@@4ttt"; angle: "jjj1"; income: "5" }
+ ListElement{ year: "2006"; month: "Feb"; expenses: "@@5ttt"; angle: "jjj2"; income: "6" }
+ ListElement{ year: "2006"; month: "Mar"; expenses: "@@7ttt"; angle: "jjj3"; income: "4" }
+ ListElement{ year: "2006"; month: "Apr"; expenses: "@@3ttt"; angle: "jjj4"; income: "2" }
+ ListElement{ year: "2006"; month: "May"; expenses: "@@4ttt"; angle: "jjj5"; income: "1" }
+ ListElement{ year: "2006"; month: "Jun"; expenses: "@@2ttt"; angle: "jjj6"; income: "2" }
+ ListElement{ year: "2006"; month: "Jul"; expenses: "@@1ttt"; angle: "jjj7"; income: "3" }
+ ListElement{ year: "2006"; month: "Aug"; expenses: "@@5ttt"; angle: "jjj8"; income: "1" }
+ ListElement{ year: "2006"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj9"; income: "3" }
+ ListElement{ year: "2006"; month: "Oct"; expenses: "@@5ttt"; angle: "jjj10"; income: "2" }
+ ListElement{ year: "2006"; month: "Nov"; expenses: "@@8ttt"; angle: "jjj11"; income: "5" }
+ ListElement{ year: "2006"; month: "Dec"; expenses: "@@3ttt"; angle: "jjj12"; income: "3" }
- ListElement{ year: "2007"; month: "Jan"; expenses: "3"; angle: "13"; income: "1" }
- ListElement{ year: "2007"; month: "Feb"; expenses: "4"; angle: "14"; income: "2" }
- ListElement{ year: "2007"; month: "Mar"; expenses: "12";angle: "15"; income: "4" }
- ListElement{ year: "2007"; month: "Apr"; expenses: "13";angle: "16"; income: "6" }
- ListElement{ year: "2007"; month: "May"; expenses: "14";angle: "17"; income: "11" }
- ListElement{ year: "2007"; month: "Jun"; expenses: "7"; angle: "18"; income: "7" }
- ListElement{ year: "2007"; month: "Jul"; expenses: "6"; angle: "19"; income: "4" }
- ListElement{ year: "2007"; month: "Aug"; expenses: "4"; angle: "20"; income: "15" }
- ListElement{ year: "2007"; month: "Sep"; expenses: "2"; angle: "21"; income: "18" }
- ListElement{ year: "2007"; month: "Oct"; expenses: "29";angle: "22"; income: "25" }
- ListElement{ year: "2007"; month: "Nov"; expenses: "23";angle: "23"; income: "29" }
- ListElement{ year: "2007"; month: "Dec"; expenses: "5"; angle: "24"; income: "9" }
+ ListElement{ year: "2007"; month: "Jan"; expenses: "@@3ttt"; angle: "jjj13"; income: "1" }
+ ListElement{ year: "2007"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj14"; income: "2" }
+ ListElement{ year: "2007"; month: "Mar"; expenses: "@@12ttt"; angle: "jjj15"; income: "4" }
+ ListElement{ year: "2007"; month: "Apr"; expenses: "@@13ttt"; angle: "jjj16"; income: "6" }
+ ListElement{ year: "2007"; month: "May"; expenses: "@@14ttt"; angle: "jjj17"; income: "11" }
+ ListElement{ year: "2007"; month: "Jun"; expenses: "@@7ttt"; angle: "jjj18"; income: "7" }
+ ListElement{ year: "2007"; month: "Jul"; expenses: "@@6ttt"; angle: "jjj19"; income: "4" }
+ ListElement{ year: "2007"; month: "Aug"; expenses: "@@4ttt"; angle: "jjj20"; income: "15" }
+ ListElement{ year: "2007"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj21"; income: "18" }
+ ListElement{ year: "2007"; month: "Oct"; expenses: "@@29ttt"; angle: "jjj22"; income: "25" }
+ ListElement{ year: "2007"; month: "Nov"; expenses: "@@23ttt"; angle: "jjj23"; income: "29" }
+ ListElement{ year: "2007"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj24"; income: "9" }
- ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" }
- ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" }
- ListElement{ year: "2008"; month: "Mar"; expenses: "10"; income: "20" }
- ListElement{ year: "2008"; month: "Apr"; expenses: "12"; income: "24" }
- ListElement{ year: "2008"; month: "May"; expenses: "10"; income: "19" }
- ListElement{ year: "2008"; month: "Jun"; expenses: "5"; income: "8" }
- ListElement{ year: "2008"; month: "Jul"; expenses: "1"; income: "4" }
- ListElement{ year: "2008"; month: "Aug"; expenses: "7"; income: "12" }
- ListElement{ year: "2008"; month: "Sep"; expenses: "4"; income: "16" }
- ListElement{ year: "2008"; month: "Oct"; expenses: "22"; income: "33" }
- ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" }
- ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" }
+ ListElement{ year: "2008"; month: "Jan"; expenses: "@@3"; income: "8" }
+ ListElement{ year: "2008"; month: "Feb"; expenses: "@@8"; income: "14" }
+ ListElement{ year: "2008"; month: "Mar"; expenses: "@@10"; income: "20" }
+ ListElement{ year: "2008"; month: "Apr"; expenses: "@@12"; income: "24" }
+ ListElement{ year: "2008"; month: "May"; expenses: "@@10"; income: "19" }
+ ListElement{ year: "2008"; month: "Jun"; expenses: "@@5"; income: "8" }
+ ListElement{ year: "2008"; month: "Jul"; expenses: "@@1"; income: "4" }
+ ListElement{ year: "2008"; month: "Aug"; expenses: "@@7"; income: "12" }
+ ListElement{ year: "2008"; month: "Sep"; expenses: "@@4"; income: "16" }
+ ListElement{ year: "2008"; month: "Oct"; expenses: "@@22"; income: "33" }
+ ListElement{ year: "2008"; month: "Nov"; expenses: "@@16"; income: "25" }
+ ListElement{ year: "2008"; month: "Dec"; expenses: "@@2"; income: "7" }
- ListElement{ year: "2009"; month: "Jan"; expenses: "4"; angle: "37"; income: "5" }
- ListElement{ year: "2009"; month: "Feb"; expenses: "4"; angle: "38"; income: "7" }
- ListElement{ year: "2009"; month: "Mar"; expenses: "11";angle: "39"; income: "14" }
- ListElement{ year: "2009"; month: "Apr"; expenses: "16";angle: "40"; income: "22" }
- ListElement{ year: "2009"; month: "May"; expenses: "3"; angle: "41"; income: "5" }
- ListElement{ year: "2009"; month: "Jun"; expenses: "4"; angle: "42"; income: "8" }
- ListElement{ year: "2009"; month: "Jul"; expenses: "7"; angle: "43"; income: "9" }
- ListElement{ year: "2009"; month: "Aug"; expenses: "9"; angle: "44"; income: "13" }
- ListElement{ year: "2009"; month: "Sep"; expenses: "1"; angle: "45"; income: "6" }
- ListElement{ year: "2009"; month: "Oct"; expenses: "14";angle: "46"; income: "25" }
- ListElement{ year: "2009"; month: "Nov"; expenses: "19";angle: "47"; income: "29" }
- ListElement{ year: "2009"; month: "Dec"; expenses: "5"; angle: "48"; income: "7" }
+ ListElement{ year: "2009"; month: "Jan"; expenses: "@@4ttt"; angle: "jjj37"; income: "5" }
+ ListElement{ year: "2009"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj38"; income: "7" }
+ ListElement{ year: "2009"; month: "Mar"; expenses: "@@11ttt"; angle: "jjj39"; income: "14" }
+ ListElement{ year: "2009"; month: "Apr"; expenses: "@@16ttt"; angle: "jjj40"; income: "22" }
+ ListElement{ year: "2009"; month: "May"; expenses: "@@3ttt"; angle: "jjj41"; income: "5" }
+ ListElement{ year: "2009"; month: "Jun"; expenses: "@@4ttt"; angle: "jjj42"; income: "8" }
+ ListElement{ year: "2009"; month: "Jul"; expenses: "@@7ttt"; angle: "jjj43"; income: "9" }
+ ListElement{ year: "2009"; month: "Aug"; expenses: "@@9ttt"; angle: "jjj44"; income: "13" }
+ ListElement{ year: "2009"; month: "Sep"; expenses: "@@1ttt"; angle: "jjj45"; income: "6" }
+ ListElement{ year: "2009"; month: "Oct"; expenses: "@@14ttt"; angle: "jjj46"; income: "25" }
+ ListElement{ year: "2009"; month: "Nov"; expenses: "@@19ttt"; angle: "jjj47"; income: "29" }
+ ListElement{ year: "2009"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj48"; income: "7" }
- ListElement{ year: "2010"; month: "Jan"; expenses: "14";angle: "49"; income: "22" }
- ListElement{ year: "2010"; month: "Feb"; expenses: "5"; angle: "50"; income: "7" }
- ListElement{ year: "2010"; month: "Mar"; expenses: "1"; angle: "51"; income: "9" }
- ListElement{ year: "2010"; month: "Apr"; expenses: "1"; angle: "52"; income: "12" }
- ListElement{ year: "2010"; month: "May"; expenses: "5"; angle: "53"; income: "9" }
- ListElement{ year: "2010"; month: "Jun"; expenses: "5"; angle: "54"; income: "8" }
- ListElement{ year: "2010"; month: "Jul"; expenses: "3"; angle: "55"; income: "7" }
- ListElement{ year: "2010"; month: "Aug"; expenses: "1"; angle: "56"; income: "5" }
- ListElement{ year: "2010"; month: "Sep"; expenses: "2"; angle: "57"; income: "4" }
- ListElement{ year: "2010"; month: "Oct"; expenses: "10";angle: "58"; income: "13" }
- ListElement{ year: "2010"; month: "Nov"; expenses: "12";angle: "59"; income: "17" }
- ListElement{ year: "2010"; month: "Dec"; expenses: "6"; angle: "60"; income: "9" }
+ ListElement{ year: "2010"; month: "Jan"; expenses: "@@14ttt"; angle: "jjj49"; income: "22" }
+ ListElement{ year: "2010"; month: "Feb"; expenses: "@@5ttt"; angle: "jjj50"; income: "7" }
+ ListElement{ year: "2010"; month: "Mar"; expenses: "@@1ttt"; angle: "jjj51"; income: "9" }
+ ListElement{ year: "2010"; month: "Apr"; expenses: "@@1ttt"; angle: "jjj52"; income: "12" }
+ ListElement{ year: "2010"; month: "May"; expenses: "@@5ttt"; angle: "jjj53"; income: "9" }
+ ListElement{ year: "2010"; month: "Jun"; expenses: "@@5ttt"; angle: "jjj54"; income: "8" }
+ ListElement{ year: "2010"; month: "Jul"; expenses: "@@3ttt"; angle: "jjj55"; income: "7" }
+ ListElement{ year: "2010"; month: "Aug"; expenses: "@@1ttt"; angle: "jjj56"; income: "5" }
+ ListElement{ year: "2010"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj57"; income: "4" }
+ ListElement{ year: "2010"; month: "Oct"; expenses: "@@10ttt"; angle: "jjj58"; income: "13" }
+ ListElement{ year: "2010"; month: "Nov"; expenses: "@@12ttt"; angle: "jjj59"; income: "17" }
+ ListElement{ year: "2010"; month: "Dec"; expenses: "@@6ttt"; angle: "jjj60"; income: "9" }
- ListElement{ year: "2011"; month: "Jan"; expenses: "2"; angle: "61"; income: "6" }
- ListElement{ year: "2011"; month: "Feb"; expenses: "4"; angle: "62"; income: "8" }
- ListElement{ year: "2011"; month: "Mar"; expenses: "7"; angle: "63"; income: "12" }
- ListElement{ year: "2011"; month: "Apr"; expenses: "9"; angle: "64"; income: "15" }
- ListElement{ year: "2011"; month: "May"; expenses: "7"; angle: "65"; income: "19" }
- ListElement{ year: "2011"; month: "Jun"; expenses: "9"; angle: "66"; income: "18" }
- ListElement{ year: "2011"; month: "Jul"; expenses: "13";angle: "67"; income: "17" }
- ListElement{ year: "2011"; month: "Aug"; expenses: "5"; angle: "68"; income: "9" }
- ListElement{ year: "2011"; month: "Sep"; expenses: "3"; angle: "69"; income: "8" }
- ListElement{ year: "2011"; month: "Oct"; expenses: "13";angle: "70"; income: "15" }
- ListElement{ year: "2011"; month: "Nov"; expenses: "8"; angle: "71"; income: "17" }
- ListElement{ year: "2011"; month: "Dec"; expenses: "7"; angle: "72"; income: "10" }
+ ListElement{ year: "2011"; month: "Jan"; expenses: "@@2ttt"; angle: "jjj61"; income: "6" }
+ ListElement{ year: "2011"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj62"; income: "8" }
+ ListElement{ year: "2011"; month: "Mar"; expenses: "@@7ttt"; angle: "jjj63"; income: "12" }
+ ListElement{ year: "2011"; month: "Apr"; expenses: "@@9ttt"; angle: "jjj64"; income: "15" }
+ ListElement{ year: "2011"; month: "May"; expenses: "@@7ttt"; angle: "jjj65"; income: "19" }
+ ListElement{ year: "2011"; month: "Jun"; expenses: "@@9ttt"; angle: "jjj66"; income: "18" }
+ ListElement{ year: "2011"; month: "Jul"; expenses: "@@13ttt"; angle: "jjj67"; income: "17" }
+ ListElement{ year: "2011"; month: "Aug"; expenses: "@@5ttt"; angle: "jjj68"; income: "9" }
+ ListElement{ year: "2011"; month: "Sep"; expenses: "@@3ttt"; angle: "jjj69"; income: "8" }
+ ListElement{ year: "2011"; month: "Oct"; expenses: "@@13ttt"; angle: "jjj70"; income: "15" }
+ ListElement{ year: "2011"; month: "Nov"; expenses: "@@8ttt"; angle: "jjj71"; income: "17" }
+ ListElement{ year: "2011"; month: "Dec"; expenses: "@@7ttt"; angle: "jjj72"; income: "10" }
- ListElement{ year: "2012"; month: "Jan"; expenses: "12";angle: "73"; income: "16" }
- ListElement{ year: "2012"; month: "Feb"; expenses: "24";angle: "74"; income: "28" }
- ListElement{ year: "2012"; month: "Mar"; expenses: "27";angle: "75"; income: "22" }
- ListElement{ year: "2012"; month: "Apr"; expenses: "29";angle: "76"; income: "25" }
- ListElement{ year: "2012"; month: "May"; expenses: "27";angle: "77"; income: "29" }
- ListElement{ year: "2012"; month: "Jun"; expenses: "19";angle: "78"; income: "18" }
- ListElement{ year: "2012"; month: "Jul"; expenses: "13";angle: "79"; income: "17" }
- ListElement{ year: "2012"; month: "Aug"; expenses: "15";angle: "80"; income: "19" }
- ListElement{ year: "2012"; month: "Sep"; expenses: "3"; angle: "81"; income: "8" }
- ListElement{ year: "2012"; month: "Oct"; expenses: "3"; angle: "82"; income: "6" }
- ListElement{ year: "2012"; month: "Nov"; expenses: "4"; angle: "83"; income: "8" }
- ListElement{ year: "2012"; month: "Dec"; expenses: "5"; angle: "84"; income: "9" }
+ ListElement{ year: "2012"; month: "Jan"; expenses: "@@12ttt"; angle: "jjj73"; income: "16" }
+ ListElement{ year: "2012"; month: "Feb"; expenses: "@@24ttt"; angle: "jjj74"; income: "28" }
+ ListElement{ year: "2012"; month: "Mar"; expenses: "@@27ttt"; angle: "jjj75"; income: "22" }
+ ListElement{ year: "2012"; month: "Apr"; expenses: "@@29ttt"; angle: "jjj76"; income: "25" }
+ ListElement{ year: "2012"; month: "May"; expenses: "@@27ttt"; angle: "jjj77"; income: "29" }
+ ListElement{ year: "2012"; month: "Jun"; expenses: "@@19ttt"; angle: "jjj78"; income: "18" }
+ ListElement{ year: "2012"; month: "Jul"; expenses: "@@13ttt"; angle: "jjj79"; income: "17" }
+ ListElement{ year: "2012"; month: "Aug"; expenses: "@@15ttt"; angle: "jjj80"; income: "19" }
+ ListElement{ year: "2012"; month: "Sep"; expenses: "@@3ttt"; angle: "jjj81"; income: "8" }
+ ListElement{ year: "2012"; month: "Oct"; expenses: "@@3ttt"; angle: "jjj82"; income: "6" }
+ ListElement{ year: "2012"; month: "Nov"; expenses: "@@4ttt"; angle: "jjj83"; income: "8" }
+ ListElement{ year: "2012"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj84"; income: "9" }
}
}