[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/kchart/shape
From:       Johannes Simon <johannes.simon () gmail ! com>
Date:       2010-05-13 13:38:24
Message-ID: 20100513133824.E9AB2AC8B4 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1126264 by jsimon:

Get rid of all this biggestDataSetIndex crap (darn, wasn't that my invention?).
Removes a lot of buginess and adds cleanness. Fixes release blocker 233468.

BUGS:233468
CCMAIL:inge@lysator.liu.se


 M  +66 -101   KDChartModel.cpp  


--- trunk/koffice/kchart/shape/KDChartModel.cpp #1126263:1126264
@@ -44,14 +44,34 @@
     Private();
     ~Private();
 
+    /**
+     * Returns the index of a given dataSet. If it is not present in
+     * this model (i.e. not attached, thus not in dataSets), an index
+     * is returned before which this dataSet should be inserted.
+     */
     int  dataSetIndex( DataSet *dataSet ) const;
+
+    /**
+     * Returns the cached (!) max size of all data sets in this model.
+     */
     int  maxDataSetSize() const;
-    void updateMaxDataSetSize();
+
+    /**
+     * Calculates the maximum size of all data sets in the passed list.
+     */
+    int  calcMaxDataSetSize( QList<DataSet*> list ) const;
+
+    /**
+     * Only calculates the new size for the current data set list,
+     * but does not update it.
+     */
+    int  calcMaxDataSetSize() const;
+
     bool isKnownDataRole( int role ) const;
 
     int             dataDimensions;
+    int             biggestDataSetSize;
     QList<DataSet*> dataSets;
-    int             biggestDataSetIndex;
 
     Qt::Orientation dataDirection;
 };
@@ -59,9 +79,9 @@
 
 KDChartModel::Private::Private()
 {
-    biggestDataSetIndex = -1;
     dataDimensions      = 1;
     dataDirection       = Qt::Vertical;
+    biggestDataSetSize  = 0;
 }
 
 KDChartModel::Private::~Private()
@@ -70,18 +90,20 @@
 
 int KDChartModel::Private::maxDataSetSize() const
 {
-    // There is no stored index yet. Default to 0, do not assert.
-    if ( biggestDataSetIndex < 0 )
-        return 0;
+    return biggestDataSetSize;
+}
 
-    // Check if stored index (of dataset with max size) is valid
-    const bool indexIsValid = biggestDataSetIndex < dataSets.size();
-    Q_ASSERT( indexIsValid );
-    if ( !indexIsValid )
-        return 0;
+int KDChartModel::Private::calcMaxDataSetSize( QList<DataSet*> list ) const
+{
+    int maxSize = 0;
+    foreach ( DataSet *dataSet, list )
+        maxSize = qMax( maxSize, dataSet->size() );
+    return maxSize;
+}
 
-    Q_ASSERT( dataSets[ biggestDataSetIndex ] );
-    return dataSets[ biggestDataSetIndex ]->size();
+int KDChartModel::Private::calcMaxDataSetSize() const
+{
+    return calcMaxDataSetSize( dataSets );
 }
 
 int KDChartModel::Private::dataSetIndex( DataSet *dataSet ) const
@@ -250,48 +272,32 @@
         return;
     }
 
-    // Check if stored max size (i.e. the index of the dataset having
-    // that max size) is valid.
-    Q_ASSERT( d->biggestDataSetIndex >= 0
-              && d->biggestDataSetIndex < d->dataSets.size() );
-    const int oldMaxSize = d->dataSets[ d->biggestDataSetIndex ]->size();
+    // old max data set size is cached
+    const int oldMaxSize = d->maxDataSetSize();
+    // Determine new max data set size (the size of dataSet has been changed already)
+    const int newMaxSize = d->calcMaxDataSetSize();
 
-    // Determine new max data set size.
-    //
-    // Do not use updateMaxDataSetSize() here. d->biggestDataSetIndex
-    // must not be changed before begin<Insert/Remove><Rows/Columns>()
-    // signal is emitted.
-    int maxSize = 0;
-    int biggestDataSetIndex = -1;
-    for ( int i = 0; i < d->dataSets.size(); i++ ) {
-        const int size = d->dataSets[i]->size();
-        if ( size > maxSize ) {
-            maxSize = size;
-            biggestDataSetIndex = i;
-        }
-    }
-
     // Columns/rows have been added
-    if ( maxSize > oldMaxSize ) {
+    if ( newMaxSize > oldMaxSize ) {
         if ( d->dataDirection == Qt::Horizontal )
-            beginInsertColumns( QModelIndex(), oldMaxSize, newSize - 1 );
+            beginInsertColumns( QModelIndex(), oldMaxSize, newMaxSize - 1 );
         else
-            beginInsertRows( QModelIndex(), oldMaxSize, newSize - 1 );
+            beginInsertRows( QModelIndex(), oldMaxSize, newMaxSize - 1 );
 
-        d->biggestDataSetIndex = biggestDataSetIndex;
+        d->biggestDataSetSize = d->calcMaxDataSetSize();
 
         if ( d->dataDirection == Qt::Horizontal )
             endInsertColumns();
         else
             endInsertRows();
         // Columns/rows have been removed
-    } else if ( maxSize < oldMaxSize ) {
+    } else if ( newMaxSize < oldMaxSize ) {
         if ( d->dataDirection == Qt::Horizontal )
-            beginRemoveColumns( QModelIndex(), maxSize, oldMaxSize - 1 );
+            beginRemoveColumns( QModelIndex(), newMaxSize, oldMaxSize - 1 );
         else
-            beginRemoveRows( QModelIndex(), maxSize, oldMaxSize - 1 );
+            beginRemoveRows( QModelIndex(), newMaxSize, oldMaxSize - 1 );
 
-        d->biggestDataSetIndex = biggestDataSetIndex;
+        d->biggestDataSetSize = d->calcMaxDataSetSize();
 
         if ( d->dataDirection == Qt::Horizontal )
             endRemoveColumns();
@@ -460,9 +466,7 @@
 
     if ( silent ) {
         d->dataSets.insert( dataSetIndex, dataSet );
-        const int dataSetSize = dataSet->size();
-        if ( d->biggestDataSetIndex < 0 || dataSetSize > d->maxDataSetSize() )
-                d->biggestDataSetIndex = dataSetIndex;
+        d->biggestDataSetSize = d->calcMaxDataSetSize();
 
         // Regenerate the numbers for all the datasets.
         for ( int i = dataSetIndex; i < d->dataSets.size(); i++ )
@@ -496,24 +500,19 @@
             else
                 beginInsertColumns( QModelIndex(),
                                     d->maxDataSetSize(), dataSetSize - 1 );
-            d->biggestDataSetIndex = dataSetIndex;
+            d->biggestDataSetSize = d->calcMaxDataSetSize();
             if ( d->dataDirection == Qt::Vertical )
                 endInsertRows();
             else
                 endInsertColumns();
         }
-        else {
-            // Update index if we inserted another data set *before* it.
-            if ( dataSetIndex <= d->biggestDataSetIndex )
-                d->biggestDataSetIndex++;
         }
-    }
     else {
         // If we had no datasets before, we haven't had a valid
         // structure yet.  Thus, emit the modelReset() signal.
         d->dataSets.append( dataSet );
         dataSet->setKdDataSetNumber( 0 );
-        d->biggestDataSetIndex = 0;
+        d->biggestDataSetSize = d->calcMaxDataSetSize();
 
         reset();
     }
@@ -526,59 +525,31 @@
         return;
 
     if ( silent ) {
-        d->dataSets.removeAll( dataSet );
-
-        const int dataSetSize = dataSet->size();
-        Q_UNUSED(dataSetSize);
-        if ( dataSetIndex == d->biggestDataSetIndex ) {
-            int maxSize = 0;
-            for ( int i = 0; i < d->dataSets.size(); i++ ) {
-                const int size = d->dataSets[i]->size();
-                if ( size > maxSize ) {
-                    maxSize = size;
-                    d->biggestDataSetIndex = i;
+        d->dataSets.removeAt( dataSetIndex );
+        d->biggestDataSetSize = d->calcMaxDataSetSize();
                 }
-            }
-        }
-
-        if ( dataSetIndex < d->biggestDataSetIndex )
-            d->biggestDataSetIndex--;
-    }
     else {
-        const int dataSetSize = dataSet->size();
-        if ( dataSetIndex == d->biggestDataSetIndex ) {
-            int maxSize = 0;
-            int biggestDataSetIndex = -1;
-            for ( int i = 0; i < d->dataSets.size(); i++ ) {
-                if ( i == dataSetIndex )
-                    continue;
+        // Simulate removing this dataSet without actually doing so
+        // in order to calculate new max data set size
+        QList<DataSet*> _dataSets( d->dataSets );
+        _dataSets.removeAll( dataSet );
+        // Cached size
+        int oldMaxDataSetSize = d->maxDataSetSize();
+        // Max size for new list
+        int newMaxDataSetSize = d->calcMaxDataSetSize( _dataSets );
 
-                const int size = d->dataSets[i]->size();
-                if ( size > maxSize ) {
-                    maxSize = size;
-                    biggestDataSetIndex = i;
-                }
-            }
-
-            if ( maxSize < dataSetSize ) {
+        if ( newMaxDataSetSize < oldMaxDataSetSize ) {
                 if ( d->dataDirection == Qt::Horizontal )
-                    beginRemoveColumns( QModelIndex(), maxSize, dataSetSize - 1 );
+                beginRemoveColumns( QModelIndex(), newMaxDataSetSize, newMaxDataSetSize - 1 );
                 else
-                    beginRemoveRows( QModelIndex(), maxSize, dataSetSize - 1 );
-                d->biggestDataSetIndex = biggestDataSetIndex;
+                beginRemoveRows( QModelIndex(), newMaxDataSetSize, newMaxDataSetSize - 1 );
+            d->biggestDataSetSize = d->calcMaxDataSetSize();
                 if ( d->dataDirection == Qt::Horizontal )
                     endRemoveColumns();
                 else
                     endRemoveRows();
             }
-            else {
-                d->biggestDataSetIndex = biggestDataSetIndex;
-            }
-        }
 
-        if ( dataSetIndex < d->biggestDataSetIndex )
-            d->biggestDataSetIndex--;
-
         int columnAboutToBeRemoved = dataSetIndex * d->dataDimensions;
         if ( d->dataDirection == Qt::Horizontal )
             beginRemoveRows( QModelIndex(), columnAboutToBeRemoved,
@@ -605,16 +576,10 @@
 
 void KDChartModel::emitReset()
 {
-    d->biggestDataSetIndex = -1;
+    int biggestDataSetIndex = -1;
 
     // Update max data set sizes
-    int maxSize = 0;
-    for ( int i = 0; i < d->dataSets.size(); i++ ) {
-        if ( d->dataSets[i]->size() > maxSize ) {
-            maxSize = d->dataSets[i]->size();
-            d->biggestDataSetIndex = i;
-        }
-    }
+    d->biggestDataSetSize = d->calcMaxDataSetSize();
 
     emit reset();
 }
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic