00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef QGSCOMPOSERITEM_H
00018 #define QGSCOMPOSERITEM_H
00019
00020 #include "qgscomposition.h"
00021 #include <QGraphicsRectItem>
00022 #include <QObject>
00023
00024 class QWidget;
00025 class QDomDocument;
00026 class QDomElement;
00027
00028 class QqsComposition;
00029
00033 class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
00034 {
00035 Q_OBJECT
00036 public:
00037
00039 enum MouseMoveAction
00040 {
00041 MoveItem,
00042 ResizeUp,
00043 ResizeDown,
00044 ResizeLeft,
00045 ResizeRight,
00046 ResizeLeftUp,
00047 ResizeRightUp,
00048 ResizeLeftDown,
00049 ResizeRightDown,
00050 NoAction
00051 };
00052
00053 enum ItemPositionMode
00054 {
00055 UpperLeft,
00056 UpperMiddle,
00057 UpperRight,
00058 MiddleLeft,
00059 Middle,
00060 MiddleRight,
00061 LowerLeft,
00062 LowerMiddle,
00063 LowerRight
00064 };
00065
00069 QgsComposerItem( QgsComposition* composition, bool manageZValue = true );
00077 QgsComposerItem( qreal x, qreal y, qreal width, qreal height, QgsComposition* composition, bool manageZValue = true );
00078 virtual ~QgsComposerItem();
00079
00081 virtual void setSelected( bool s );
00082
00084 virtual bool selected( void ) {return QGraphicsRectItem::isSelected();}
00085
00087 virtual bool writeSettings( void );
00088
00090 virtual bool readSettings( void );
00091
00093 virtual bool removeSettings( void );
00094
00096 void move( double dx, double dy );
00097
00101 virtual void moveContent( double dx, double dy ) { Q_UNUSED( dx ); Q_UNUSED( dy ); }
00102
00107 virtual void zoomContent( int delta, double x, double y ) { Q_UNUSED( delta ); Q_UNUSED( x ); Q_UNUSED( y ); }
00108
00110 void setItemPosition( double x, double y, ItemPositionMode itemPoint = UpperLeft );
00111
00114 void setItemPosition( double x, double y, double width, double height, ItemPositionMode itemPoint = UpperLeft );
00115
00118 virtual void setSceneRect( const QRectF& rectangle );
00119
00124 virtual bool writeXML( QDomElement& elem, QDomDocument & doc ) const = 0;
00125
00127 bool _writeXML( QDomElement& itemElem, QDomDocument& doc ) const;
00128
00133 virtual bool readXML( const QDomElement& itemElem, const QDomDocument& doc ) = 0;
00134
00136 bool _readXML( const QDomElement& itemElem, const QDomDocument& doc );
00137
00138
00139
00140 bool frame() const {return mFrame;}
00141 void setFrame( bool drawFrame ) {mFrame = drawFrame;}
00142
00144 virtual void addItem( QgsComposerItem* item ) { Q_UNUSED( item ); }
00145 virtual void removeItems() {}
00146
00147 const QgsComposition* composition() const {return mComposition;}
00148
00149
00150
00151
00154 void drawText( QPainter* p, double x, double y, const QString& text, const QFont& font ) const;
00155
00157 void drawText( QPainter* p, const QRectF& rect, const QString& text, const QFont& font, Qt::AlignmentFlag halignement = Qt::AlignLeft, Qt::AlignmentFlag valignement = Qt::AlignTop ) const;
00158
00160 double textWidthMillimeters( const QFont& font, const QString& text ) const;
00161
00163 double fontAscentMillimeters( const QFont& font ) const;
00164
00166 double pixelFontSize( double pointSize ) const;
00167
00169 QFont scaledFontPixelSize( const QFont& font ) const;
00170
00173 void setPositionLock( bool lock ) {mItemPositionLocked = lock;}
00174
00177 bool positionLock() const {return mItemPositionLocked;}
00178
00181 void updateCursor( const QPointF& itemPos );
00182
00183 double rotation() const {return mRotation;}
00184
00185 public slots:
00186 virtual void setRotation( double r );
00187 void repaint();
00188
00189 protected:
00190
00191 QgsComposition* mComposition;
00192
00193 QgsComposerItem::MouseMoveAction mCurrentMouseMoveAction;
00195 QPointF mMouseMoveStartPos;
00197 QPointF mLastMouseEventPos;
00198
00200 QGraphicsRectItem* mBoundingResizeRectangle;
00201
00203 bool mFrame;
00204
00207 bool mItemPositionLocked;
00208
00210 mutable double mLastValidViewScaleFactor;
00211
00213 double mRotation;
00214
00215
00216 virtual void mouseMoveEvent( QGraphicsSceneMouseEvent * event );
00217 virtual void mousePressEvent( QGraphicsSceneMouseEvent * event );
00218 virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event );
00219
00220 virtual void hoverMoveEvent( QGraphicsSceneHoverEvent * event );
00221
00223 Qt::CursorShape cursorForPosition( const QPointF& itemCoordPos );
00224
00226 QgsComposerItem::MouseMoveAction mouseMoveActionForPosition( const QPointF& itemCoordPos );
00227
00236 void changeItemRectangle( const QPointF& currentPosition, const QPointF& mouseMoveStartPos, const QGraphicsRectItem* originalItem, double dx, double dy, QGraphicsRectItem* changeItem );
00237
00239 virtual void drawSelectionBoxes( QPainter* p );
00240
00242 virtual void drawFrame( QPainter* p );
00243
00245 virtual void drawBackground( QPainter* p );
00246
00248 void drawArrowHead( QPainter* p, double x, double y, double angle, double arrowHeadWidth ) const;
00249
00251 double angle( const QPointF& p1, const QPointF& p2 ) const;
00252
00255 double rectHandlerBorderTolerance() const;
00256
00259 double lockSymbolSize() const;
00260
00264 double horizontalViewScaleFactor() const;
00265
00266
00267
00269 bool imageSizeConsideringRotation( double& width, double& height ) const;
00271 bool cornerPointOnRotatedAndScaledRect( double& x, double& y, double width, double height ) const;
00273 QPointF pointOnLineWithDistance( const QPointF& startPoint, const QPointF& directionPoint, double distance ) const;
00275 void sizeChangedByRotation( double& width, double& height );
00280 void rotate( double angle, double& x, double& y ) const;
00281
00282 signals:
00284 void rotationChanged( double newRotation );
00285 };
00286
00287 #endif