KissCount/lib/libkdchart/src/KDChartLayoutItems.h

474 lines
17 KiB
C
Raw Normal View History

2012-01-28 15:54:17 +01:00
/****************************************************************************
** 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 <QBrush>
#include <QFont>
#include <QFontMetricsF>
#include <QLayout>
#include <QLayoutItem>
#include <QPen>
#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 */