/**************************************************************************** ** Copyright (C) 2001-2011 Klaralvdalens Datakonsult AB. All rights reserved. ** ** This file is part of the KD Chart library. ** ** Licensees holding valid commercial KD Chart licenses may use this file in ** accordance with the KD Chart Commercial License Agreement provided with ** the Software. ** ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 and version 3 as published by the ** Free Software Foundation and appearing in the file LICENSE.GPL.txt included. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** Contact info@kdab.com if any conditions of this licensing are not ** clear to you. ** **********************************************************************/ #ifndef KDCHARTLAYOUTITEMS_H #define KDCHARTLAYOUTITEMS_H #include #include #include #include #include #include #include "KDChartTextAttributes.h" #include "KDChartMarkerAttributes.h" class QPainter; class KDTextDocument; QPointF rotatedPoint( const QPointF& pt, qreal rotation, const QPointF& center = QPointF() ); QRectF rotatedRect( const QRectF& pt, qreal rotation, const QPointF& center = QPointF() ); namespace KDChart { class AbstractDiagram; class PaintContext; /** * Base class for all layout items of KD Chart * \internal */ class KDCHART_EXPORT AbstractLayoutItem : public QLayoutItem { public: AbstractLayoutItem( Qt::Alignment itemAlignment = 0 ) : QLayoutItem( itemAlignment ), mParent( 0 ), mParentLayout( 0 ) {} /** * Default impl: just call paint. * * Derived classes like KDChart::AbstractArea are providing * additional action here. */ virtual void paintAll( QPainter& painter ); virtual void paint( QPainter* ) = 0; virtual void paintCtx( PaintContext* context ); virtual void setParentWidget( QWidget* widget ); virtual void sizeHintChanged()const; void setParentLayout( QLayout* lay ) { mParentLayout = lay; } QLayout* parentLayout() { return mParentLayout; } void removeFromParentLayout() { if( mParentLayout ){ if( widget() ) mParentLayout->removeWidget( widget() ); else mParentLayout->removeItem( this ); } } protected: QWidget* mParent; QLayout* mParentLayout; }; /** * Layout item showing a text *\internal */ class KDCHART_EXPORT TextLayoutItem : public AbstractLayoutItem { public: TextLayoutItem(); TextLayoutItem( const QString& text, const TextAttributes& attributes, const QObject* autoReferenceArea, KDChartEnums::MeasureOrientation autoReferenceOrientation, Qt::Alignment alignment = 0 ); void setAutoReferenceArea( const QObject* area ); const QObject* autoReferenceArea() const; void setText(const QString & text); QString text() const; void setTextAlignment( Qt::Alignment ); Qt::Alignment textAlignment() const; void setTextAttributes( const TextAttributes& a ); TextAttributes textAttributes() const; /** pure virtual in QLayoutItem */ virtual bool isEmpty() const; /** pure virtual in QLayoutItem */ virtual Qt::Orientations expandingDirections() const; /** pure virtual in QLayoutItem */ virtual QSize maximumSize() const; /** pure virtual in QLayoutItem */ virtual QSize minimumSize() const; /** pure virtual in QLayoutItem */ virtual QSize sizeHint() const; /** pure virtual in QLayoutItem */ virtual void setGeometry( const QRect& r ); /** pure virtual in QLayoutItem */ virtual QRect geometry() const; virtual QSize sizeHintAndRotatedCorners( QPoint& topLeftPt, QPoint& topRightPt, QPoint& bottomRightPt, QPoint& bottomLeftPt) const; virtual QSize sizeHintUnrotated() const; virtual bool intersects( const TextLayoutItem& other, const QPointF& myPos, const QPointF& otherPos ) const; virtual bool intersects( const TextLayoutItem& other, const QPoint& myPos, const QPoint& otherPos ) const; virtual qreal realFontSize() const; virtual QFont realFont() const; virtual void paint( QPainter* ); private: QPolygon rotatedCorners() const; bool realFontWasRecalculated() const; QSize unrotatedSizeHint( QFont fnt = QFont() ) const; QSize calcSizeHint( QFont fnt, QPoint& topLeftPt, QPoint& topRightPt, QPoint& bottomRightPt, QPoint& bottomLeftPt ) const; qreal fitFontSizeToGeometry() const; QRect mRect; QString mText; Qt::Alignment mTextAlignment; TextAttributes mAttributes; const QObject* mAutoReferenceArea; KDChartEnums::MeasureOrientation mAutoReferenceOrientation; mutable QSize cachedSizeHint; mutable QPoint cachedTopLeft; mutable QPoint cachedTopRight; mutable QPoint cachedBottomRight; mutable QPoint cachedBottomLeft; mutable qreal cachedFontSize; mutable QFont cachedFont; }; class KDCHART_EXPORT TextBubbleLayoutItem : public AbstractLayoutItem { public: TextBubbleLayoutItem(); TextBubbleLayoutItem( const QString& text, const TextAttributes& attributes, const QObject* autoReferenceArea, KDChartEnums::MeasureOrientation autoReferenceOrientation, Qt::Alignment alignment = 0 ); ~TextBubbleLayoutItem(); void setAutoReferenceArea( const QObject* area ); const QObject* autoReferenceArea() const; void setText(const QString & text); QString text() const; void setTextAttributes( const TextAttributes& a ); TextAttributes textAttributes() const; /** pure virtual in QLayoutItem */ virtual bool isEmpty() const; /** pure virtual in QLayoutItem */ virtual Qt::Orientations expandingDirections() const; /** pure virtual in QLayoutItem */ virtual QSize maximumSize() const; /** pure virtual in QLayoutItem */ virtual QSize minimumSize() const; /** pure virtual in QLayoutItem */ virtual QSize sizeHint() const; /** pure virtual in QLayoutItem */ virtual void setGeometry( const QRect& r ); /** pure virtual in QLayoutItem */ virtual QRect geometry() const; virtual void paint( QPainter* painter ); protected: int borderWidth() const; private: TextLayoutItem* const m_text; }; /** * Layout item showing a data point marker * \internal */ class KDCHART_EXPORT MarkerLayoutItem : public AbstractLayoutItem { public: MarkerLayoutItem( AbstractDiagram* diagram, const MarkerAttributes& marker, const QBrush& brush, const QPen& pen, Qt::Alignment alignment = 0 ); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); static void paintIntoRect( QPainter* painter, const QRect& rect, AbstractDiagram* diagram, const MarkerAttributes& marker, const QBrush& brush, const QPen& pen ); private: AbstractDiagram* mDiagram; QRect mRect; MarkerAttributes mMarker; QBrush mBrush; QPen mPen; }; /** * Layout item showing a coloured line * \internal */ class KDCHART_EXPORT LineLayoutItem : public AbstractLayoutItem { public: LineLayoutItem( AbstractDiagram* diagram, int length, const QPen& pen, Qt::Alignment alignment = 0 ); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); static void paintIntoRect( QPainter* painter, const QRect& rect, const QPen& pen ); private: AbstractDiagram* mDiagram; int mLength; QPen mPen; QRect mRect; }; /** * Layout item showing a coloured line and a data point marker * \internal */ class KDCHART_EXPORT LineWithMarkerLayoutItem : public AbstractLayoutItem { public: LineWithMarkerLayoutItem( AbstractDiagram* diagram, int lineLength, const QPen& linePen, int markerOffs, const MarkerAttributes& marker, const QBrush& markerBrush, const QPen& markerPen, Qt::Alignment alignment = 0 ); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); private: AbstractDiagram* mDiagram; QRect mRect; int mLineLength; QPen mLinePen; int mMarkerOffs; MarkerAttributes mMarker; QBrush mMarkerBrush; QPen mMarkerPen; }; /** * Layout item showing a horizontal line * \internal */ class KDCHART_EXPORT HorizontalLineLayoutItem : public AbstractLayoutItem { public: HorizontalLineLayoutItem(); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); private: QRect mRect; }; /** * Layout item showing a vertial line * \internal */ class KDCHART_EXPORT VerticalLineLayoutItem : public AbstractLayoutItem { public: VerticalLineLayoutItem(); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); private: QRect mRect; }; /** * @brief An empty layout item * \internal * * The AutoSpacerLayoutItem is automatically put into each corner cell of * the planeLayout grid: one of its reference-layouts is a QVBoxLayout (for * the top, or bottom axes resp.), the other one is a QHBoxLayout (for the * left/right sided axes). * * The spacer reserves enough space so all of the AbstractAreas contained * in the two reference-layouts can display not only their in-bounds * content but also their overlapping content reaching out of their area. * * KD Chart's layouting is applying this schema: \verbatim +------------------+-------------------------+-----------------+ | +--------------+ | +---------------------+ | +-------------+ | | | | | | QVBoxLayout for | | | | | | | AUTO | | | the top axis/axes | | | AUTO | | | | SPACER | | +---------------------+ | | SPACER | | | | ITEM | | | | | | ITEM | | | | | | | | | | | | | +--------------+ | +---------------------+ | +-------------+ | +------------------+-------------------------+-----------------+ | +--------+-----+ | +---------------------+ | +-------+-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | QHBox- | | | | | | | Right | | | | | Layout | | | | | | | | | | | | | | | | | | | axes | | | | | for | | | | | | | | | | | | | | | | | | | layout| | | | | the | | | | DIAGRAM(s) | | | | | | | | | | | | | | | | | | | | left | | | | | | | | | | | | | | | | | | | | | | | | axis | | | | | | | | | | | | or | | | | | | | | | | | | axes | | | | | | | | | | | | | | | | | | | | | | | +--------+-----+ | +---------------------+ | +-------+-----+ | +------------------+-------------------------+-----------------+ | +--------------+ | +---------------------+ | +-------------+ | | | | | | QVBoxLayout for | | | | | | | AUTO | | | the bottom axes | | | AUTO | | | | SPACER | | +---------------------+ | | SPACER | | | | ITEM | | | | | | ITEM | | | | | | | | | | | | | +--------------+ | +---------------------+ | +-------------+ | +------------------+-------------------------+-----------------+ \endverbatim * * A typical use case is an Abscissa axis with long labels: \verbatim 2 -| | 1 -| | 0 -+------------------------------------ | | | | | Monday Tuesday Wednesday Thursday Friday \endverbatim * The last letters of the word "Friday" would have been * cut off in previous versions of KD Chart - that is * if you did not call KDChart::Chart::setGlobalLeading(). * * Now the word will be shown completely because there * is an auto-spacer-item taking care for the additional * space needed in the lower/right corner. */ class KDCHART_EXPORT AutoSpacerLayoutItem : public AbstractLayoutItem { public: AutoSpacerLayoutItem( bool layoutIsAtTopPosition, QHBoxLayout *rightLeftLayout, bool layoutIsAtLeftPosition, QVBoxLayout *topBottomLayout ); virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect& r ); virtual QSize sizeHint() const; virtual void paint( QPainter* ); private: QRect mRect; bool mLayoutIsAtTopPosition; QHBoxLayout *mRightLeftLayout; bool mLayoutIsAtLeftPosition; QVBoxLayout *mTopBottomLayout; mutable QBrush mCommonBrush; mutable QSize mCachedSize; }; } #endif /* KDCHARTLAYOUTITEMS_H */