[QGIS Commit] r10604 - in trunk/qgis/src: app core/raster

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Apr 20 05:43:49 EDT 2009


Author: wonder
Date: 2009-04-20 05:43:49 -0400 (Mon, 20 Apr 2009)
New Revision: 10604

Modified:
   trunk/qgis/src/app/qgsrasterlayerproperties.cpp
   trunk/qgis/src/core/raster/qgscolorrampshader.h
Log:
Sorting of raster color ramp items: better and faster.

... why to use insert sort if we have quicksort for free ...? :)

(was taking minutes for one raster layer)


Modified: trunk/qgis/src/app/qgsrasterlayerproperties.cpp
===================================================================
--- trunk/qgis/src/app/qgsrasterlayerproperties.cpp	2009-04-19 23:47:12 UTC (rev 10603)
+++ trunk/qgis/src/app/qgsrasterlayerproperties.cpp	2009-04-20 09:43:49 UTC (rev 10604)
@@ -1371,8 +1371,6 @@
       //iterate through mColormapTreeWidget and set colormap info of layer
       QList<QgsColorRampShader::ColorRampItem> myColorRampItems;
 
-      bool inserted = false;
-      int myCurrentIndex = 0;
       int myTopLevelItemCount = mColormapTreeWidget->topLevelItemCount();
       QTreeWidgetItem* myCurrentItem;
       for ( int i = 0; i < myTopLevelItemCount; ++i )
@@ -1386,35 +1384,13 @@
         myNewColorRampItem.value = myCurrentItem->text( 0 ).toDouble();
         myNewColorRampItem.color = myCurrentItem->background( 1 ).color();
         myNewColorRampItem.label = myCurrentItem->text( 2 );
-
-        //Simple insertion sort - speed is not a huge factor here
-        inserted = false;
-        myCurrentIndex = 0;
-        while ( !inserted )
-        {
-          if ( 0 == myColorRampItems.size() || myCurrentIndex == myColorRampItems.size() )
-          {
-            myColorRampItems.push_back( myNewColorRampItem );
-            inserted = true;
-          }
-          else if ( myColorRampItems[myCurrentIndex].value > myNewColorRampItem.value )
-          {
-            myColorRampItems.insert( myCurrentIndex, myNewColorRampItem );
-            inserted = true;
-          }
-          else if ( myColorRampItems[myCurrentIndex].value <= myNewColorRampItem.value  && myCurrentIndex == myColorRampItems.size() - 1 )
-          {
-            myColorRampItems.push_back( myNewColorRampItem );
-            inserted = true;
-          }
-          else if ( myColorRampItems[myCurrentIndex].value <= myNewColorRampItem.value && myColorRampItems[myCurrentIndex+1].value > myNewColorRampItem.value )
-          {
-            myColorRampItems.insert( myCurrentIndex + 1, myNewColorRampItem );
-            inserted = true;
-          }
-          myCurrentIndex++;
-        }
+        
+        myColorRampItems.append( myNewColorRampItem );
       }
+      
+      // sort the shader items
+      qSort(myColorRampItems);
+      
       myRasterShaderFunction->setColorRampItemList( myColorRampItems );
       //Reload table in GUI because it may have been sorted or contained invalid values
       populateColorMapTable( myColorRampItems );

Modified: trunk/qgis/src/core/raster/qgscolorrampshader.h
===================================================================
--- trunk/qgis/src/core/raster/qgscolorrampshader.h	2009-04-19 23:47:12 UTC (rev 10603)
+++ trunk/qgis/src/core/raster/qgscolorrampshader.h	2009-04-20 09:43:49 UTC (rev 10604)
@@ -44,6 +44,9 @@
       QString label;
       double value;
       QColor color;
+      
+      // compare operator for sorting
+      bool operator<(const ColorRampItem& other) const { return value < other.value; }
     };
 
     enum ColorRamp_TYPE



More information about the QGIS-commit mailing list