Cache QPen and QBrush used by ChartModel.
authorMilian Wolff <mail@milianw.de>
Tue, 5 Apr 2016 21:33:40 +0000 (23:33 +0200)
committerMilian Wolff <mail@milianw.de>
Tue, 5 Apr 2016 21:33:40 +0000 (23:33 +0200)
This removes quite a few allocations that would otherwise happen
when the data is queried by KDiagram.

gui/chartmodel.cpp
gui/chartmodel.h

index b914b38..fb95aec 100644 (file)
@@ -54,9 +54,9 @@ QVariant ChartModel::headerData(int section, Qt::Orientation orientation, int ro
     Q_ASSERT(orientation == Qt::Horizontal || section < columnCount());
     if (orientation == Qt::Horizontal) {
         if (role == KChart::DatasetPenRole) {
-            return QVariant::fromValue(QPen(colorForColumn(section, columnCount())));
+            return QVariant::fromValue(m_columnDataSetPens.at(section));
         } else if (role == KChart::DatasetBrushRole) {
-            return QVariant::fromValue(QBrush(colorForColumn(section, columnCount())));
+            return QVariant::fromValue(m_columnDataSetBrushes.at(section));
         }
 
         if (role == Qt::DisplayRole || Qt::ToolTipRole) {
@@ -100,9 +100,9 @@ QVariant ChartModel::data(const QModelIndex& index, int role) const
 
 
     if ( role == KChart::DatasetPenRole ) {
-        return QVariant::fromValue(QPen(colorForColumn(index.column(), columnCount())));
+        return QVariant::fromValue(m_columnDataSetPens.at(index.column()));
     } else if ( role == KChart::DatasetBrushRole ) {
-        return QVariant::fromValue(QBrush(colorForColumn(index.column(), columnCount())));
+        return QVariant::fromValue(m_columnDataSetBrushes.at(index.column()));
     }
 
     if ( role != Qt::DisplayRole && role != Qt::ToolTipRole ) {
@@ -162,5 +162,13 @@ void ChartModel::resetData(const ChartData& data)
     Q_ASSERT(m_data.labels.size() < ChartRows::MAX_NUM_COST);
     beginResetModel();
     m_data = data;
+    m_columnDataSetBrushes.clear();
+    m_columnDataSetPens.clear();
+    const auto columns = columnCount();
+    for (int i = 0; i < columns; ++i) {
+        auto color = colorForColumn(i, columns);
+        m_columnDataSetBrushes << QBrush(color);
+        m_columnDataSetPens << QPen(color);
+    }
     endResetModel();
 }
index 2e299d6..03ce5a8 100644 (file)
@@ -72,6 +72,9 @@ public slots:
 private:
     ChartData m_data;
     Type m_type;
+    // we cache the pens and brushes as constructing them requires allocations otherwise
+    QVector<QPen> m_columnDataSetPens;
+    QVector<QBrush> m_columnDataSetBrushes;
 };
 
 #endif // CHARTMODEL_H