[QGIS Commit] r8546 -
branches/advanced_printing_branch/src/app/composer
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri May 30 11:40:39 EDT 2008
Author: mhugent
Date: 2008-05-30 11:40:39 -0400 (Fri, 30 May 2008)
New Revision: 8546
Modified:
branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposermap.h
branches/advanced_printing_branch/src/app/composer/qgscomposervectorlegend.cpp
Log:
Prevent crashes if composer map is in render mode
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp 2008-05-30 11:10:29 UTC (rev 8545)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp 2008-05-30 15:40:39 UTC (rev 8546)
@@ -42,7 +42,7 @@
#endif
QgsComposerMap::QgsComposerMap ( QgsComposition *composition, int id, int x, int y, int width, int height )
- : /*QWidget(),*/ QgsComposerItem(x, y, width,height,0)
+ : QgsComposerItem(x, y, width,height,0)
{
mComposition = composition;
mId = id;
@@ -53,7 +53,6 @@
mCacheUpdated = false;
mCalculate = Scale;
- //mPlotStyle = QgsComposition::Preview;
setPlotStyle ( QgsComposition::Preview );
mDrawing = false;
@@ -81,55 +80,15 @@
mMapCanvas = mComposition->mapCanvas();
mName = QString(tr("Map %1").arg(mId));
- init();
readSettings();
- recalculate();
// Add to scene
mComposition->canvas()->addItem(this);
QGraphicsRectItem::show();
}
-void QgsComposerMap::init ()
-{
- mNumCachedLayers = 0;
- mSelected = false;
- mUserExtent = mMapCanvas->extent();
- mDrawing = false;
-
- // Cache
- mCacheUpdated = false;
-
- // Calculate
- //mCalculateComboBox->insertItem( tr("Extent (calculate scale)"), Scale );
- //mCalculateComboBox->insertItem( tr("Scale (calculate extent)"), Extent );
- mCalculate = Scale;
-
- setPlotStyle ( QgsComposition::Preview );
-
- // Preview style
- mPreviewMode = Cache;
- //mPreviewModeComboBox->insertItem ( tr("Cache"), Cache );
- //mPreviewModeComboBox->insertItem ( tr("Render"), Render );
- //mPreviewModeComboBox->insertItem ( tr("Rectangle"), Rectangle );
- //mPreviewModeComboBox->setCurrentItem ( Cache );
-
- mWidthScale = 1.0 / mComposition->scale();
- mSymbolScale = 0.5;
- mFontScale = 1.0;
-
- mFrame = true;
-
- QGraphicsRectItem::setZValue(20);
-
- connect ( mMapCanvas, SIGNAL(layersChanged()), this, SLOT(mapCanvasChanged()) );
-}
-
QgsComposerMap::~QgsComposerMap()
{
-#ifdef QGISDEBUG
- std::cerr << "QgsComposerMap::~QgsComposerMap" << std::endl;
-#endif
}
/* This function is called by paint() and cache() to render the map. It does not override any functions
@@ -168,54 +127,62 @@
mMapCanvas->freeze(false);
}
-void QgsComposerMap::setUserExtent ( QgsRect const & rect )
-{
- mUserExtent = rect;
- recalculate();
-
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
-}
-
void QgsComposerMap::cache ( void )
{
- int w = rect().width();
- int h = rect().height();
-
- mCachePixmap = QPixmap( w, h );
- double mupp = mExtent.width() / w;
+ int w = rect().width() * horizontalViewScaleFactor();
+ int h = rect().height() * horizontalViewScaleFactor();
- // WARNING: ymax in QgsMapToPixel is device height!!!
- QgsMapToPixel transform(mupp, h, mExtent.yMin(), mExtent.xMin() );
-
- mCachePixmap.fill(QColor(255,255,255));
+ if(w > 3000) //limit size of image for better performance
+ {
+ w = 3000;
+ }
- QPainter p(&mCachePixmap);
-
- draw( &p, mExtent, QSize(w, h), mCachePixmap.logicalDpiX());
- p.end();
+ if(h > 3000)
+ {
+ h = 3000;
+ }
+
+ mCachePixmap = QPixmap( w, h );
+ double mupp = mExtent.width() / w;
- mNumCachedLayers = mMapCanvas->layerCount();
- mCacheUpdated = true;
+ // WARNING: ymax in QgsMapToPixel is device height!!!
+ QgsMapToPixel transform(mupp, h, mExtent.yMin(), mExtent.xMin() );
+
+ mCachePixmap.fill(QColor(255,255,255));
+
+ QPainter p(&mCachePixmap);
+
+ draw( &p, mExtent, QSize(w, h), mCachePixmap.logicalDpiX());
+ p.end();
+
+ mNumCachedLayers = mMapCanvas->layerCount();
+ mCacheUpdated = true;
}
void QgsComposerMap::paint ( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget)
{
-
if ( mDrawing )
{
return;
}
+
mDrawing = true;
- painter->setClipRect (QRectF( 0, 0, QGraphicsRectItem::rect().width(), QGraphicsRectItem::rect().height() ));
+ QRectF thisPaintRect = QRectF( 0, 0, QGraphicsRectItem::rect().width(), QGraphicsRectItem::rect().height());
+ painter->save();
+ painter->setClipRect (thisPaintRect);
-#ifdef QGISDEBUG
- std::cout << "QgsComposerMapt::paint mPlotStyle = " << plotStyle()
- << " mPreviewMode = " << mPreviewMode << std::endl;
-#endif
+ double currentScaleFactorX = horizontalViewScaleFactor();
+
+ if( plotStyle() == QgsComposition::Preview && mPreviewMode == Render /*&& screen resolution different than last time*/)
+ {
+ if(currentScaleFactorX != mLastScaleFactorX)
+ {
+ mCacheUpdated = false;
+ }
+ }
- if ( plotStyle() == QgsComposition::Preview && mPreviewMode == Cache )
+ if ( plotStyle() == QgsComposition::Preview && mPreviewMode != Rectangle)
{ // Draw from cache
if ( !mCacheUpdated || mMapCanvas->layerCount() != mNumCachedLayers )
{
@@ -224,9 +191,6 @@
// Scale so that the cache fills the map rectangle
double scale = 1.0 * QGraphicsRectItem::rect().width() / mCachePixmap.width();
-#ifdef QGISDEBUG
- std::cout << "scale = " << scale << std::endl;
-#endif
painter->save();
@@ -237,18 +201,14 @@
painter->restore();
}
- else if ( (plotStyle() == QgsComposition::Preview && mPreviewMode == Render) ||
- plotStyle() == QgsComposition::Print ||
- plotStyle() == QgsComposition::Postscript )
+ else if ( plotStyle() == QgsComposition::Print ||
+ plotStyle() == QgsComposition::Postscript)
{
- QgsDebugMsg("render")
-
- QPaintDevice* thePaintDevice = painter->device();
+ QPaintDevice* thePaintDevice = painter->device();
if(!thePaintDevice)
{
return;
}
-
QRectF bRect = boundingRect();
QSize theSize(bRect.width(), bRect.height());
@@ -261,44 +221,12 @@
drawSelectionBoxes(painter);
}
+ painter->restore();
+
+ mLastScaleFactorX = currentScaleFactorX;
mDrawing = false;
}
-/*
-void QgsComposerMap::sizeChanged ( void )
-{
- int w, h;
- w = mComposition->fromMM ( mWidthLineEdit->text().toDouble() );
- h = mComposition->fromMM ( mHeightLineEdit->text().toDouble() );
-
- QGraphicsRectItem::setRect(0, 0, w, h);
- recalculate();
-
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
-
- writeSettings();
- }*/
-
-/*
-void QgsComposerMap::on_mWidthLineEdit_editingFinished ( void ) { sizeChanged(); }
-void QgsComposerMap::on_mHeightLineEdit_editingFinished ( void ) { sizeChanged(); }
-
-void QgsComposerMap::on_mCalculateComboBox_activated( int )
-{
- mCalculate = mCalculateComboBox->currentItem();
-
- if ( mCalculate == Scale )
- {
- recalculate();
- mCacheUpdated = false;
- QGraphicsRectItem::scene()->update();
- mComposition->emitMapChanged ( mId );
- }
- setOptions();
- writeSettings();
- }*/
-
double QgsComposerMap::scaleFromUserScale ( double us )
{
double s=0;
@@ -338,184 +266,17 @@
return us;
}
-/*
-void QgsComposerMap::on_mScaleLineEdit_editingFinished()
-{
-#ifdef QGISDEBUG
- std::cout << "QgsComposerMap::on_mScaleLineEdit_editingFinished" << std::endl;
-#endif
- mCalculate = mCalculateComboBox->currentItem();
- mUserScale = mScaleLineEdit->text().toDouble();
-
- mScale = scaleFromUserScale ( mUserScale );
-
- recalculate();
-
- mCacheUpdated = false;
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
-
- writeSettings();
- mComposition->emitMapChanged ( mId );
- }*/
-
- /*
-void QgsComposerMap::scaleChanged ( void )
-{
- mWidthScale = mWidthScaleLineEdit->text().toDouble();
- mSymbolScale = mSymbolScaleLineEdit->text().toDouble();
- mFontScale = mFontScaleLineEdit->text().toDouble();
-
- mCacheUpdated = false;
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
-
- writeSettings();
- mComposition->emitMapChanged ( mId );
- }*/
-
-/*
-void QgsComposerMap::on_mFontScaleLineEdit_editingFinished ( void ) { scaleChanged(); }
-void QgsComposerMap::on_mSymbolScaleLineEdit_editingFinished ( void ) { scaleChanged(); }
-void QgsComposerMap::on_mWidthScaleLineEdit_editingFinished ( void ) { scaleChanged(); }
-*/
-
void QgsComposerMap::mapCanvasChanged ( void )
{
-#ifdef QGISDEBUG
- std::cout << "QgsComposerMap::canvasChanged" << std::endl;
-#endif
mCacheUpdated = false;
QGraphicsRectItem::update();
}
-/*
-void QgsComposerMap::on_mPreviewModeComboBox_activated ( int i )
-{
- mPreviewMode = (PreviewMode) i;
- writeSettings();
- }*/
-void QgsComposerMap::recalculate ( void )
-{
-#ifdef QGISDEBUG
- std::cout << "QgsComposerMap::recalculate mCalculate = " << mCalculate << std::endl;
-#endif
- if ( mCalculate == Scale )
- {
- // Calculate scale from extent and rectangle
- double xscale = QGraphicsRectItem::rect().width() / mUserExtent.width();
- double yscale = QGraphicsRectItem::rect().height() / mUserExtent.height();
- mExtent = mUserExtent;
- if ( xscale < yscale )
- {
- mScale = xscale;
- // extend y
- double d = ( 1. * QGraphicsRectItem::rect().height() / mScale - mUserExtent.height() ) / 2 ;
- mExtent.setYmin ( mUserExtent.yMin() - d );
- mExtent.setYmax ( mUserExtent.yMax() + d );
- }
- else
- {
- mScale = yscale;
- // extend x
- double d = ( 1.* QGraphicsRectItem::rect().width() / mScale - mUserExtent.width() ) / 2 ;
- mExtent.setXmin ( mUserExtent.xMin() - d );
- mExtent.setXmax ( mUserExtent.xMax() + d );
- }
- mUserScale = userScaleFromScale ( mScale );
- }
- else
- {
- // Calculate extent
- double xc = ( mUserExtent.xMax() + mUserExtent.xMin() ) / 2;
- double yc = ( mUserExtent.yMax() + mUserExtent.yMin() ) / 2;
-
- double width = QGraphicsRectItem::rect().width() / mScale;
- double height = QGraphicsRectItem::rect().height() / mScale;
-
- mExtent.setXmin ( xc - width/2 );
- mExtent.setXmax ( xc + width/2 );
- mExtent.setYmin ( yc - height/2 );
- mExtent.setYmax ( yc + height/2 );
- }
-
-#ifdef QGISDEBUG
- std::cout << "mUserExtent = " << mUserExtent.stringRep().toLocal8Bit().data() << std::endl;
- std::cout << "mScale = " << mScale << std::endl;
- std::cout << "mExtent = " << mExtent.stringRep().toLocal8Bit().data() << std::endl;
-#endif
-
- //setOptions();
- mCacheUpdated = false;
-}
-
-/*
-void QgsComposerMap::on_mFrameCheckBox_clicked ( )
-{
- mFrame = mFrameCheckBox->isChecked();
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
-
- writeSettings();
- }*/
-
- /*
-void QgsComposerMap::setOptions ( void )
-{
-#ifdef QGISDEBUG
- std::cout << "QgsComposerMap::setOptions" << std::endl;
-#endif
-
- //mNameLabel->setText ( mName );
-
- //mCalculateComboBox->setCurrentItem( mCalculate );
-
- //mWidthLineEdit->setText ( QString("%1").arg( mComposition->toMM((int)QGraphicsRectItem::rect().width()), 0,'g') );
- //mHeightLineEdit->setText ( QString("%1").arg( mComposition->toMM((int)QGraphicsRectItem::rect().height()),0,'g') );
-
- // Scale
- switch ( mComposition->mapCanvas()->mapUnits() ) {
- case QGis::METERS :
- case QGis::FEET :
- //mScaleLineEdit->setText ( QString("%1").arg((int)mUserScale) );
- break;
- case QGis::DEGREES :
- case QGis::UNKNOWN :
- //mScaleLineEdit->setText ( QString("%1").arg(mUserScale,0,'f') );
- break;
- }
- if ( mCalculate == Scale ) {
- //mScaleLineEdit->setEnabled(false);
- } else {
- //mScaleLineEdit->setEnabled(true);
- }
-
- mWidthScaleLineEdit->setText ( QString("%1").arg(mWidthScale,0,'g',2) );
- mSymbolScaleLineEdit->setText ( QString("%1").arg(mSymbolScale,0,'g',2) );
- mFontScaleLineEdit->setText ( QString("%1").arg(mFontScale,0,'g',2) );
-
- mFrameCheckBox->setChecked ( mFrame );
-
- mPreviewModeComboBox->setCurrentItem( mPreviewMode );
- }*/
-
-/*
-void QgsComposerMap::on_mSetCurrentExtentButton_clicked ( void )
-{
- mUserExtent = mMapCanvas->extent();
- recalculate();
- QGraphicsRectItem::update();
- QGraphicsRectItem::scene()->update();
- setOptions();
- writeSettings();
- mComposition->emitMapChanged ( mId );
- }*/
-
bool QgsComposerMap::selected( void )
{
return mSelected;
@@ -546,10 +307,6 @@
return mName;
}
-double QgsComposerMap::widthScale (void ) { return mWidthScale ; }
-double QgsComposerMap::symbolScale (void ) { return mSymbolScale ; }
-double QgsComposerMap::fontScale (void ) { return mFontScale ; }
-
bool QgsComposerMap::writeSettings ( void )
{
QString path;
@@ -575,10 +332,6 @@
QgsProject::instance()->writeEntry( "Compositions", path+"scale", mUserScale );
- QgsProject::instance()->writeEntry( "Compositions", path+"widthscale", mWidthScale );
- QgsProject::instance()->writeEntry( "Compositions", path+"symbolscale", mSymbolScale );
- QgsProject::instance()->writeEntry( "Compositions", path+"fontscale", mFontScale );
-
QgsProject::instance()->writeEntry( "Compositions", path+"frame", mFrame );
QgsProject::instance()->writeEntry( "Compositions", path+"previewmode", mPreviewMode );
@@ -615,16 +368,10 @@
mUserScale = QgsProject::instance()->readDoubleEntry( "Compositions", path+"scale", 1000., &ok);
mScale = scaleFromUserScale ( mUserScale );
-
- mWidthScale = QgsProject::instance()->readDoubleEntry("Compositions", path+"widthscale", 1., &ok);
- mSymbolScale = QgsProject::instance()->readDoubleEntry("Compositions", path+"symbolscale", 1., &ok);
- mFontScale = QgsProject::instance()->readDoubleEntry("Compositions", path+"fontscale", 1., &ok);
mFrame = QgsProject::instance()->readBoolEntry("Compositions", path+"frame", true, &ok);
mPreviewMode = (PreviewMode) QgsProject::instance()->readNumEntry("Compositions", path+"previewmode", Cache, &ok);
-
- recalculate();
return true;
}
@@ -682,3 +429,17 @@
{
//soon...
}
+
+double QgsComposerMap::horizontalViewScaleFactor() const
+{
+ double result = 1;
+ if(scene())
+ {
+ QList<QGraphicsView*> viewList = scene()->views();
+ if(viewList.size() > 0)
+ {
+ result = viewList.at(0)->transform().m11();
+ }
+ }
+ return result;
+}
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposermap.h
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposermap.h 2008-05-30 11:10:29 UTC (rev 8545)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposermap.h 2008-05-30 15:40:39 UTC (rev 8546)
@@ -63,7 +63,6 @@
void init ( void );
// Reimplement QgsComposerItem:
- //void setSelected( bool s );
bool selected( void );
QWidget *options ( void );
bool writeSettings ( void );
@@ -123,30 +122,7 @@
void setCacheUpdated ( bool u = false );
public slots:
- // Called by GUI if with or height was changed
- //void on_mWidthLineEdit_editingFinished ( void );
- //void on_mHeightLineEdit_editingFinished ( void );
- // Set User extent to current map extent
- //void on_mSetCurrentExtentButton_clicked ( void );
-
- // Called by GUI if calculate has changed
- //void on_mCalculateComboBox_activated ( int i );
-
- // Called by GUI if map scale has changed
- //void on_mScaleLineEdit_editingFinished ( void );
-
- // Called by GUI if with scale was changed
- //void on_mFontScaleLineEdit_editingFinished ( void );
- //void on_mSymbolScaleLineEdit_editingFinished ( void );
- //void on_mWidthScaleLineEdit_editingFinished ( void );
-
- // Frame settings changed
- //void on_mFrameCheckBox_clicked ( void );
-
- // Called by GUI if preview style was changed
- //void on_mPreviewModeComboBox_activated ( int i );
-
// Called if map canvas has changed
void mapCanvasChanged ( );
@@ -155,11 +131,6 @@
void extentChanged();
private:
- // Called by GUI if with or height was changed
- //void sizeChanged ( void );
-
- // Called by GUI if with scale was changed
- //void scaleChanged ( void );
// Pointer to composition
QgsComposition *mComposition;
@@ -202,15 +173,6 @@
// Resize schema
Calculate mCalculate;
-
- // Line width scale
- double mWidthScale;
-
- // Symbol scale
- double mSymbolScale;
-
- // Font size scale from screen pixels to typographic points
- double mFontScale;
/** \brief Preview style */
PreviewMode mPreviewMode;
@@ -224,6 +186,9 @@
/** \brief set to true if in state of drawing, other requests are to draw are returned */
bool mDrawing;
+ /**Store last scale factor to avoid unnecessary repaints in case preview mode is 'Render'*/
+ double mLastScaleFactorX;
+
/** \brief calculate mScale from mUserScale */
double scaleFromUserScale ( double us );
@@ -234,6 +199,10 @@
void setNewExtent(const QgsRect& extent);
/**Sets new scale and changes only mExtent*/
void setNewScale(double scaleDenominator);
+
+ /**Returns the zoom factor of the graphics view. If no
+ graphics view exists, the default 1 is returned*/
+ double horizontalViewScaleFactor() const;
};
#endif
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposervectorlegend.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposervectorlegend.cpp 2008-05-30 11:10:29 UTC (rev 8545)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposervectorlegend.cpp 2008-05-30 15:40:39 UTC (rev 8546)
@@ -151,6 +151,8 @@
std::cout << "QgsComposerVectorLegend::render p = " << p << std::endl;
#endif
+#if 0
+
// Painter can be 0, create dummy to avoid many if below
QPainter *painter = NULL;
QPixmap *pixmap = NULL;
@@ -288,12 +290,12 @@
itemLabels.resize(sectionItemsCount);
}
- double widthScale = map->widthScale() * mComposition->scale();
+ // double widthScale = map->widthScale() * mComposition->scale();
if ( plotStyle() == QgsComposition::Preview && mPreviewMode == Render ) {
widthScale *= mComposition->viewScale();
}
- double scale = map->symbolScale() * mComposition->scale();
+ //double scale = map->symbolScale() * mComposition->scale();
int icnt = 0;
for ( QList<QgsSymbol*>::iterator it = symbols.begin(); it != symbols.end(); ++it ) {
@@ -377,7 +379,7 @@
QgsSymbol* sym = (*it);
QPen pen = sym->pen();
- double widthScale = map->widthScale();
+ //double widthScale = map->widthScale();
pen.setWidthF( ( widthScale * pen.widthF() ) );
pen.setCapStyle(Qt::FlatCap); //make sure that the line doesn't extend past its endpoints
@@ -466,6 +468,7 @@
}
return QRectF ( 0, 0, width, height);
+#endif //0
}
void QgsComposerVectorLegend::cache ( void )
More information about the QGIS-commit
mailing list