QGIS API Documentation  2.0.1-Dufour
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgscomposermap.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgscomposermap.h
3  -------------------
4  begin : January 2005
5  copyright : (C) 2005 by Radim Blazek
6  email : [email protected]
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 #ifndef QGSCOMPOSERMAP_H
18 #define QGSCOMPOSERMAP_H
19 
20 //#include "ui_qgscomposermapbase.h"
21 #include "qgscomposeritem.h"
22 #include "qgsrectangle.h"
23 #include <QFont>
24 #include <QGraphicsRectItem>
25 
26 class QgsComposition;
27 class QgsMapRenderer;
28 class QgsMapToPixel;
29 class QDomNode;
30 class QDomDocument;
31 class QGraphicsView;
32 class QPainter;
33 class QgsFillSymbolV2;
34 class QgsLineSymbolV2;
35 class QgsVectorLayer;
36 
41 // NOTE: QgsComposerMapBase must be first, otherwise does not compile
42 class CORE_EXPORT QgsComposerMap : public QgsComposerItem
43 {
44  Q_OBJECT
45 
46  public:
48  QgsComposerMap( QgsComposition *composition, int x, int y, int width, int height );
50  QgsComposerMap( QgsComposition *composition );
51  virtual ~QgsComposerMap();
52 
54  virtual int type() const { return ComposerMap; }
55 
58  {
59  Cache = 0, // Use raster cache
60  Render, // Render the map
61  Rectangle // Display only rectangle
62  };
63 
64  enum GridStyle
65  {
66  Solid = 0, //solid lines
67  Cross //only draw line crossings
68  };
69 
71  {
72  InsideMapFrame = 0,
74  Disabled
75  };
76 
78  {
79  Horizontal = 0,
82  BoundaryDirection
83  };
84 
86  {
87  Decimal = 0,
89  DegreeMinuteSecond
90  };
91 
93  {
94  NoGridFrame = 0,
95  Zebra //black / white pattern
96  };
97 
99  enum Border
100  {
104  Top
105  };
106 
114  void draw( QPainter *painter, const QgsRectangle& extent, const QSizeF& size, double dpi, double* forceWidthScale = 0 );
115 
117  void paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget );
118 
120  void cache();
121 
123  int id() const {return mId;}
124 
126  bool isDrawing() const {return mDrawing;}
127 
129  void resize( double dx, double dy );
130 
134  void moveContent( double dx, double dy );
135 
140  void zoomContent( int delta, double x, double y );
141 
143  void setSceneRect( const QRectF& rectangle );
144 
146  double scale() const;
147 
149  void setNewScale( double scaleDenominator );
150 
152  void setNewExtent( const QgsRectangle& extent );
153 
154  PreviewMode previewMode() const {return mPreviewMode;}
155  void setPreviewMode( PreviewMode m );
156 
159  bool keepLayerSet() const {return mKeepLayerSet;}
162  void setKeepLayerSet( bool enabled ) {mKeepLayerSet = enabled;}
163 
166  QStringList layerSet() const {return mLayerSet;}
169  void setLayerSet( const QStringList& layerSet ) {mLayerSet = layerSet;}
171  void storeCurrentLayerSet();
172 
173  // Set cache outdated
174  void setCacheUpdated( bool u = false );
175 
176  QgsRectangle extent() const {return mExtent;}
177 
178  const QgsMapRenderer* mapRenderer() const {return mMapRenderer;}
179 
181  void setOffset( double xOffset, double yOffset );
182 
184  bool containsWMSLayer() const;
185 
187  bool containsAdvancedEffects() const;
188 
193  bool writeXML( QDomElement& elem, QDomDocument & doc ) const;
194 
199  bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
200 
203  void setGridEnabled( bool enabled ) {mGridEnabled = enabled;}
204  bool gridEnabled() const { return mGridEnabled; }
205 
208  void setGridStyle( GridStyle style ) {mGridStyle = style;}
209  GridStyle gridStyle() const { return mGridStyle; }
210 
213  void setGridIntervalX( double interval ) { mGridIntervalX = interval;}
214  double gridIntervalX() const { return mGridIntervalX; }
215 
218  void setGridIntervalY( double interval ) { mGridIntervalY = interval;}
219  double gridIntervalY() const { return mGridIntervalY; }
220 
223  void setGridOffsetX( double offset ) { mGridOffsetX = offset; }
224  double gridOffsetX() const { return mGridOffsetX; }
225 
228  void setGridOffsetY( double offset ) { mGridOffsetY = offset; }
229  double gridOffsetY() const { return mGridOffsetY; }
230 
233  void setGridPen( const QPen& p );
234  QPen gridPen() const;
235 
238  void setGridPenWidth( double w );
239 
242  void setGridPenColor( const QColor& c );
243 
246  void setGridAnnotationFont( const QFont& f ) { mGridAnnotationFont = f; }
247  QFont gridAnnotationFont() const { return mGridAnnotationFont; }
248 
251  void setAnnotationFontColor( const QColor& c ) {mGridAnnotationFontColor = c;}
254  QColor annotationFontColor() const {return mGridAnnotationFontColor;}
255 
258  void setGridAnnotationPrecision( int p ) {mGridAnnotationPrecision = p;}
259  int gridAnnotationPrecision() const {return mGridAnnotationPrecision;}
260 
263  void setShowGridAnnotation( bool show ) {mShowGridAnnotation = show;}
264  bool showGridAnnotation() const {return mShowGridAnnotation;}
265 
266  void setGridAnnotationPosition( GridAnnotationPosition p, QgsComposerMap::Border border );
267  GridAnnotationPosition gridAnnotationPosition( QgsComposerMap::Border border ) const;
268 
271  void setAnnotationFrameDistance( double d ) {mAnnotationFrameDistance = d;}
272  double annotationFrameDistance() const {return mAnnotationFrameDistance;}
273 
274  void setGridAnnotationDirection( GridAnnotationDirection d, QgsComposerMap::Border border );
275  GridAnnotationDirection gridAnnotationDirection( QgsComposerMap::Border border ) const;
276 
277  void setGridAnnotationFormat( GridAnnotationFormat f ) { mGridAnnotationFormat = f; }
278  GridAnnotationFormat gridAnnotationFormat() const { return mGridAnnotationFormat; }
279 
282  void setGridFrameStyle( GridFrameStyle style ) { mGridFrameStyle = style; }
283  GridFrameStyle gridFrameStyle() const { return mGridFrameStyle; }
284 
287  void setGridFrameWidth( double w ) { mGridFrameWidth = w; }
288  double gridFrameWidth() const { return mGridFrameWidth; }
289 
292  QRectF boundingRect() const;
295  void updateBoundingRect();
296 
299  void setCrossLength( double l ) {mCrossLength = l;}
300  double crossLength() {return mCrossLength;}
301 
302  void setMapRotation( double r );
303 
304  void updateItem();
305 
307  void setMapCanvas( QGraphicsView* canvas ) { mMapCanvas = canvas; }
308 
309  void setDrawCanvasItems( bool b ) { mDrawCanvasItems = b; }
310  bool drawCanvasItems() const { return mDrawCanvasItems; }
311 
313  double mapUnitsToMM() const;
314 
317  void setOverviewFrameMap( int mapId );
320  int overviewFrameMapId() const { return mOverviewFrameMapId; }
321 
322  void setOverviewFrameMapSymbol( QgsFillSymbolV2* symbol );
323  QgsFillSymbolV2* overviewFrameMapSymbol() { return mOverviewFrameMapSymbol; }
324 
326  QPainter::CompositionMode overviewBlendMode() const {return mOverviewBlendMode;}
328  void setOverviewBlendMode( QPainter::CompositionMode blendMode );
329 
331  bool overviewInverted() const {return mOverviewInverted;}
333  void setOverviewInverted( bool inverted );
334 
335  void setGridLineSymbol( QgsLineSymbolV2* symbol );
336  QgsLineSymbolV2* gridLineSymbol() { return mGridLineSymbol; }
337 
339  QPainter::CompositionMode gridBlendMode() const {return mGridBlendMode;}
341  void setGridBlendMode( QPainter::CompositionMode blendMode );
342 
345  void assignFreeId();
346 
347  signals:
348  void extentChanged();
349 
350  public slots:
351 
353  void updateCachedImage( );
355  void renderModeUpdateCachedImage();
356 
357  private:
358 
360  {
361  Longitude = 0,
362  Latitude
363  };
364 
365  // Pointer to map renderer of the QGIS main map. Note that QgsComposerMap uses a different map renderer,
366  //it just copies some properties from the main map renderer.
368 
370  int mId;
371 
372  // Map region in map units realy used for rendering
373  // It can be the same as mUserExtent, but it can be bigger in on dimension if mCalculate==Scale,
374  // so that full rectangle in paper is used.
376 
377  // Cache used in composer preview
378  QImage mCacheImage;
379 
380  // Is cache up to date
382 
385 
388 
390  bool mDrawing;
391 
393  double mXOffset;
395  double mYOffset;
396 
399 
401  QStringList mLayerSet;
402 
409  QPainter::CompositionMode mOverviewBlendMode;
411 
413  void connectUpdateSlot();
414 
416  void syncLayerSet();
417 
427  double mGridOffsetX;
429  double mGridOffsetY;
439  QPainter::CompositionMode mGridBlendMode;
440 
449 
452 
461 
463 
466 
470  double mCrossLength;
471  QGraphicsView* mMapCanvas;
474 
476  void drawGrid( QPainter* p );
477  void drawGridFrame( QPainter* p, const QList< QPair< double, QLineF > >& hLines, const QList< QPair< double, QLineF > >& vLines );
482  void drawCoordinateAnnotations( QPainter* p, const QList< QPair< double, QLineF > >& hLines, const QList< QPair< double, QLineF > >& vLines );
483  void drawCoordinateAnnotation( QPainter* p, const QPointF& pos, QString annotationString );
489  void drawAnnotation( QPainter* p, const QPointF& pos, int rotation, const QString& annotationText );
490  QString gridAnnotationString( double value, AnnotationCoordinate coord ) const;
493  int xGridLines( QList< QPair< double, QLineF > >& lines ) const;
496  int yGridLines( QList< QPair< double, QLineF > >& lines ) const;
498  QgsRectangle transformedExtent() const;
500  QPolygonF transformedMapPolygon() const;
501  double maxExtension() const;
505  void mapPolygon( QPolygonF& poly ) const;
507  void requestedExtent( QgsRectangle& extent ) const;
511  void transformShift( double& xShift, double& yShift ) const;
513  QPointF mapToItemCoords( const QPointF& mapCoords ) const;
515  Border borderForLineCoord( const QPointF& p ) const;
516 
517  void drawCanvasItems( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle );
518  void drawCanvasItem( QGraphicsItem* item, QPainter* painter, const QStyleOptionGraphicsItem* itemStyle );
519  QPointF composerMapPosForItem( const QGraphicsItem* item ) const;
520  void sortGridLinesOnBorders( const QList< QPair< double, QLineF > >& hLines, const QList< QPair< double, QLineF > >& vLines, QMap< double, double >& leftFrameEntries,
521  QMap< double, double >& rightFrameEntries, QMap< double, double >& topFrameEntries, QMap< double, double >& bottomFrameEntries ) const;
522  void drawGridFrameBorder( QPainter* p, const QMap< double, double >& borderPos, Border border );
523  void drawGridLine( const QLineF& line, QPainter* p );
524  void drawOverviewMapExtent( QPainter* p );
525  void createDefaultOverviewFrameSymbol();
526  void createDefaultGridLineSymbol();
527  void initGridAnnotationFormatFromProject();
528 };
529 
530 #endif