[QGIS Commit] r8261 - in branches/rendercontext-branch/src: app app/composer core gui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Mar 22 06:26:00 EDT 2008


Author: mhugent
Date: 2008-03-22 06:25:59 -0400 (Sat, 22 Mar 2008)
New Revision: 8261

Modified:
   branches/rendercontext-branch/src/app/composer/qgscomposermap.cpp
   branches/rendercontext-branch/src/app/qgisapp.cpp
   branches/rendercontext-branch/src/core/qgsmaprender.cpp
   branches/rendercontext-branch/src/core/qgsvectorlayer.cpp
   branches/rendercontext-branch/src/core/qgsvectorlayer.h
   branches/rendercontext-branch/src/gui/qgsmapcanvas.cpp
Log:
Added possibility to stop rendering progress with esc-key or the render checkbox

Modified: branches/rendercontext-branch/src/app/composer/qgscomposermap.cpp
===================================================================
--- branches/rendercontext-branch/src/app/composer/qgscomposermap.cpp	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/app/composer/qgscomposermap.cpp	2008-03-22 10:25:59 UTC (rev 8261)
@@ -158,6 +158,8 @@
       double widthScale = mWidthScale;
       double symbolScale = mSymbolScale;
 
+      theRenderContext.setScaleFactor( (widthScale + symbolScale) / 2);
+
 //TODO: attempt to scale cache lines and point symbols to be larger as we zoom in
 /*    if(creating cache pixmap)
       {
@@ -165,18 +167,18 @@
         symbolScale *= (cachePixmap.width / map.rect.width);
       }
 */
-      QgsRect r1, r2;
-      r1 = extent;
-      // TODO: revisit later and make this QgsMapRender-aware [MD]
-      // bool split = layer->projectExtent(r1, r2);
-      bool split = false;
+      //QgsRect r1, r2;
+      //r1 = extent;
+      //bool split = layer->projectExtent(r1, r2);
       
-      vector->draw( painter, r1, transform, ct, FALSE, widthScale, symbolScale);
+      //todo: implement with QgsMapRender
+      vector->draw(theRenderContext);
 
-      if ( split )
-      {
-        vector->draw( painter, r2, transform, ct, FALSE, widthScale, symbolScale);
-      }
+      //if ( split )
+      //{
+      //theRenderContext.setExtent(r2);
+      //vector->draw(theRenderContext);
+      //}
     } else { 
       // raster
       if ( plotStyle() == QgsComposition::Print || plotStyle() == QgsComposition::Postscript ) {
@@ -193,7 +195,8 @@
         painter->save();
         painter->scale( 1./multip, 1./multip);
         layer->draw(theRenderContext);
-              
+            
+	theRenderContext.setMapToPixel(*transform);
         painter->restore();
       } 
       else 

Modified: branches/rendercontext-branch/src/app/qgisapp.cpp
===================================================================
--- branches/rendercontext-branch/src/app/qgisapp.cpp	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/app/qgisapp.cpp	2008-03-22 10:25:59 UTC (rev 8261)
@@ -5313,9 +5313,27 @@
   // commented out for now. [gsherman]
   //    std::cout << e->text().toLocal8Bit().data() << " (keypress recevied)" << std::endl;
   emit keyPressed (e);
+  
+  //cancel rendering progress with esc key
+  if(e->key() == Qt::Key_Escape)
+    {
+      if(mMapCanvas)
+	{
+	  QgsMapRender* theMapRender = mMapCanvas->mapRender();
+	  if(theMapRender)
+	    {
+	      QgsRenderContext* theRenderContext = theMapRender->renderContext();
+	      if(theRenderContext)
+		{
+		  theRenderContext->setRenderingStopped(true);
+		}
+	    }
+	}
+    }
+
   e->ignore();
-
 }
+    
 // Debug hook - used to output diagnostic messages when evoked (usually from the menu)
 /* Temporarily disabled...
    void QgisApp::debugHook()

Modified: branches/rendercontext-branch/src/core/qgsmaprender.cpp
===================================================================
--- branches/rendercontext-branch/src/core/qgsmaprender.cpp	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/core/qgsmaprender.cpp	2008-03-22 10:25:59 UTC (rev 8261)
@@ -226,6 +226,9 @@
   mRenderContext.setDrawEditingInformation(!mOverview);
   mRenderContext.setPainter(painter);
   mRenderContext.setCoordTransform(0);
+  //this flag is only for stopping during the current rendering progress, 
+  //so must be false at every new render operation
+  mRenderContext.setRenderingStopped(false);
 
   // render all layers in the stack, starting at the base
   QListIterator<QString> li(mLayerSet);
@@ -235,6 +238,11 @@
   
   while (li.hasPrevious())
   {
+    if(mRenderContext.renderingStopped())
+      {
+	break;
+      }
+
     QString layerId = li.previous();
 
     QgsDebugMsg("Rendering at layer item " + layerId);
@@ -320,6 +328,11 @@
     li.toBack();
     while (li.hasPrevious())
     {
+      if(mRenderContext.renderingStopped())
+	{
+	  break;
+	}
+
       QString layerId = li.previous();
 
       // TODO: emit drawingProgress((myRenderCounter++),zOrder.size());

Modified: branches/rendercontext-branch/src/core/qgsvectorlayer.cpp
===================================================================
--- branches/rendercontext-branch/src/core/qgsvectorlayer.cpp	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/core/qgsvectorlayer.cpp	2008-03-22 10:25:59 UTC (rev 8261)
@@ -721,25 +721,6 @@
   mUpdateThreshold = settings.readNumEntry("Map/updateThreshold", 0);
   //draw ( p, viewExtent, theMapToPixelTransform, ct, drawingToEditingCanvas, 1., 1.);
   
-  QPainter* thePainter = renderContext.painter();
-  if(!thePainter)
-    {
-      return false;
-    }
-
-  draw(thePainter, renderContext.extent(), &(renderContext.mapToPixel()), renderContext.coordTransform(), \
-       renderContext.drawEditingInformation(), renderContext.scaleFactor(), renderContext.scaleFactor());
-  return TRUE; // Assume success always
-}
-
-void QgsVectorLayer::draw(QPainter * p,
-                          const QgsRect& viewExtent,
-                          const QgsMapToPixel * theMapToPixelTransform,
-                          const QgsCoordinateTransform* ct,
-                          bool drawingToEditingCanvas,
-                          double widthScale,
-                          double symbolScale)
-{
   if (mRenderer)
   {
     // painter is active (begin has been called
@@ -757,26 +738,32 @@
     /* Scale factor of the marker image*/
     /* We set this to the symbolScale, and if it is NOT changed, */
     /* we don't have to do another scaling here */
-    double markerScaleFactor =  symbolScale;
+    double markerScaleFactor = renderContext.scaleFactor();
     
     if(mEditable)
     {
       // Destroy all cached geometries and clear the references to them
       deleteCachedGeometries();
     }
- 
-    mDataProvider->updateFeatureCount();
-    int totalFeatures = mDataProvider->featureCount();
-    int featureCount = 0;
-    QgsFeature fet;
 
-    QgsAttributeList attributes = mRenderer->classificationAttributes();
-    mDataProvider->select(attributes, viewExtent);
+  mDataProvider->updateFeatureCount();
+  int totalFeatures = mDataProvider->featureCount();
+  int featureCount = 0;
+  QgsFeature fet;
+  
+  QgsAttributeList attributes = mRenderer->classificationAttributes();
+  mDataProvider->select(attributes, renderContext.extent());  
 
-    try
+  try
     {
       while (mDataProvider->getNextFeature(fet))
       {
+
+	if(renderContext.renderingStopped())
+	  {
+	    break;
+	  }
+
         // XXX Something in our draw event is triggering an additional draw event when resizing [TE 01/26/06]
         // XXX Calling this will begin processing the next draw event causing image havoc and recursion crashes.
         //qApp->processEvents(); //so we can trap for esc press
@@ -833,12 +820,12 @@
 
 	//QgsDebugMsg(QString("markerScale before renderFeature(): %1").arg(markerScaleFactor));
 	// markerScalerFactore reflects the wanted scaling of the marker
-        mRenderer->renderFeature(p, fet, &marker, &markerScaleFactor, sel, widthScale );
+        mRenderer->renderFeature(renderContext.painter(), fet, &marker, &markerScaleFactor, sel, renderContext.scaleFactor());
 	// markerScalerFactore now reflects the actual scaling of the marker that the render performed.
 	//QgsDebugMsg(QString("markerScale after renderFeature(): %1").arg(markerScaleFactor));
 
-        double scale = symbolScale / markerScaleFactor;
-        drawFeature(p,fet,theMapToPixelTransform,ct, &marker, scale, drawingToEditingCanvas);
+        double scale = renderContext.scaleFactor() / markerScaleFactor;
+        drawFeature(renderContext.painter() , fet, &(renderContext.mapToPixel()), renderContext.coordTransform(), &marker, scale, renderContext.drawEditingInformation());
 
         ++featureCount;
       }
@@ -852,12 +839,12 @@
           bool sel = mSelectedFeatureIds.contains((*it).featureId());
 	  QgsDebugMsg(QString("markerScale before renderFeature(): %1").arg(markerScaleFactor));
 	  // markerScalerFactore reflects the wanted scaling of the marker
-          mRenderer->renderFeature(p, *it, &marker, &markerScaleFactor, 
-              sel, widthScale);
+          mRenderer->renderFeature(renderContext.painter(), *it, &marker, &markerScaleFactor, 
+				   sel, renderContext.scaleFactor());
 	  // markerScalerFactore now reflects the actual scaling of the marker that the render performed.
 	  QgsDebugMsg(QString("markerScale after renderFeature(): %1").arg(markerScaleFactor));
 
-          double scale = symbolScale / markerScaleFactor;
+          double scale = renderContext.scaleFactor() / markerScaleFactor;
     
           if (mChangedGeometries.contains((*it).featureId()))
           {
@@ -866,7 +853,7 @@
           
           // give a deep copy of the geometry to mCachedGeometry because it will be erased at each redraw
           mCachedGeometries.insert((*it).featureId(), QgsGeometry(*((*it).geometry())) );
-          drawFeature(p,*it,theMapToPixelTransform,ct, &marker,scale, drawingToEditingCanvas);
+          drawFeature(renderContext.painter(), *it, &(renderContext.mapToPixel()), renderContext.coordTransform(), &marker, scale, renderContext.drawEditingInformation());
         }
       }
 
@@ -878,18 +865,16 @@
       msg += cse.what();
       QgsLogger::warning(msg);
     }
-    QgsDebugMsg("Total features processed is " + QString::number(featureCount));
-    // XXX Something in our draw event is triggering an additional draw event when resizing [TE 01/26/06]
-    // XXX Calling this will begin processing the next draw event causing image havoc and recursion crashes.
-    //qApp->processEvents();
+
   }
   else
   {
     QgsLogger::warning("QgsRenderer is null in QgsVectorLayer::draw()");
   }
+
+  return TRUE; // Assume success always
 }
 
-
 void QgsVectorLayer::deleteCachedGeometries()
 {
   // Destroy any cached geometries

Modified: branches/rendercontext-branch/src/core/qgsvectorlayer.h
===================================================================
--- branches/rendercontext-branch/src/core/qgsvectorlayer.h	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/core/qgsvectorlayer.h	2008-03-22 10:25:59 UTC (rev 8261)
@@ -342,18 +342,6 @@
   /** Draws the layer labels using coordinate transformation */
   void drawLabels(QgsRenderContext& renderContext);
 
-  /** \brief Draws the layer using coordinate transformation
-   *  \param widthScale line width scale
-   *  \param symbolScale symbol scale
-   */
-  void draw(QPainter * p,
-            const QgsRect& viewExtent,
-            const QgsMapToPixel * cXf,
-            const QgsCoordinateTransform* ct,
-            bool drawingToEditingCanvas,
-            double widthScale,
-            double symbolScale);
-
   /** \brief Draws the layer labels using coordinate transformation
    *  \param scale size scale, applied to all values in pixels
    */

Modified: branches/rendercontext-branch/src/gui/qgsmapcanvas.cpp
===================================================================
--- branches/rendercontext-branch/src/gui/qgsmapcanvas.cpp	2008-03-22 06:54:29 UTC (rev 8260)
+++ branches/rendercontext-branch/src/gui/qgsmapcanvas.cpp	2008-03-22 10:25:59 UTC (rev 8261)
@@ -760,7 +760,19 @@
   
   lastSize = e->size();
 
-  if (isAlreadyIn || mDrawing) return;
+  if (isAlreadyIn || mDrawing)
+    {
+      //cancel current render progress
+      if(mMapRender)
+	{
+	  QgsRenderContext* theRenderContext = mMapRender->renderContext();
+	  if(theRenderContext)
+	    {
+	      theRenderContext->setRenderingStopped(true);
+	    }
+	}
+      return;
+    }
   isAlreadyIn = true;
 
   while (lastSize != QSize(-1,-1))
@@ -1014,6 +1026,15 @@
 void QgsMapCanvas::setRenderFlag(bool theFlag)
 {
   mRenderFlag = theFlag;
+  if(mMapRender)
+    {
+      QgsRenderContext* rc = mMapRender->renderContext();
+      if(rc)
+	{
+	  rc->setRenderingStopped(!theFlag);
+	}
+    }
+
   if(mRenderFlag)
     {
       refresh();



More information about the QGIS-commit mailing list