20 #include "KChartPolarDiagram.h" 21 #include "KChartPolarDiagram_p.h" 23 #include "KChartPaintContext.h" 24 #include "KChartPainterSaver_p.h" 25 #include "KChartMath_p.h" 31 PolarDiagram::Private::Private() :
32 rotateCircularLabels( false ),
33 closeDatasets( false )
37 PolarDiagram::Private::~Private() {}
47 PolarDiagram::~PolarDiagram()
52 void PolarDiagram::init()
54 setShowDelimitersAtPosition( Position::Unknown,
false );
55 setShowDelimitersAtPosition( Position::Center,
false );
56 setShowDelimitersAtPosition( Position::NorthWest,
false );
57 setShowDelimitersAtPosition( Position::North,
true );
58 setShowDelimitersAtPosition( Position::NorthEast,
false );
59 setShowDelimitersAtPosition( Position::West,
false );
60 setShowDelimitersAtPosition( Position::East,
false );
61 setShowDelimitersAtPosition( Position::SouthWest,
false );
62 setShowDelimitersAtPosition( Position::South,
true );
63 setShowDelimitersAtPosition( Position::SouthEast,
false );
64 setShowDelimitersAtPosition( Position::Floating,
false );
66 setShowLabelsAtPosition( Position::Unknown,
false );
67 setShowLabelsAtPosition( Position::Center,
false );
68 setShowLabelsAtPosition( Position::NorthWest,
false );
69 setShowLabelsAtPosition( Position::North,
true );
70 setShowLabelsAtPosition( Position::NorthEast,
false );
71 setShowLabelsAtPosition( Position::West,
false );
72 setShowLabelsAtPosition( Position::East,
false );
73 setShowLabelsAtPosition( Position::SouthWest,
false );
74 setShowLabelsAtPosition( Position::South,
true );
75 setShowLabelsAtPosition( Position::SouthEast,
false );
76 setShowLabelsAtPosition( Position::Floating,
false );
83 newDiagram->d->showDelimitersAtPosition = d->showDelimitersAtPosition;
84 newDiagram->d->showLabelsAtPosition = d->showLabelsAtPosition;
85 newDiagram->d->rotateCircularLabels = d->rotateCircularLabels;
86 newDiagram->d->closeDatasets = d->closeDatasets;
93 const int rowCount = model()->rowCount(rootIndex());
94 const int colCount = model()->columnCount(rootIndex());
96 qreal xMax = colCount;
97 qreal yMin = 0, yMax = 0;
98 for (
int iCol=0; iCol<colCount; ++iCol ) {
99 for (
int iRow=0; iRow< rowCount; ++iRow ) {
100 qreal value = model()->data( model()->index( iRow, iCol, rootIndex() ) ).toReal();
101 yMax = qMax( yMax, value );
102 yMin = qMin( yMin, value );
116 ctx.setPainter ( &painter );
117 ctx.setRectangle(
QRectF ( 0, 0, width(), height() ) );
134 qreal dummy1, dummy2;
135 paint( ctx,
true, dummy1, dummy2 );
136 paint( ctx,
false, dummy1, dummy2 );
140 bool calculateListAndReturnScale,
141 qreal& newZoomX, qreal& newZoomY )
145 if ( !checkInvariants(
true) )
147 d->reverseMapper.clear();
149 const int rowCount = model()->rowCount( rootIndex() );
150 const int colCount = model()->columnCount( rootIndex() );
152 if ( calculateListAndReturnScale ) {
154 d->labelPaintCache.clear();
156 for (
int iCol = 0; iCol < colCount; ++iCol ) {
157 for (
int iRow=0; iRow < rowCount; ++iRow ) {
158 QModelIndex index = model()->index( iRow, iCol, rootIndex() );
159 const qreal value = model()->
data( index ).
toReal();
160 QPointF point = coordinatePlane()->translate(
163 d->addLabel( &d->labelPaintCache, index,
nullptr,
PositionPoints( point ),
164 Position::Center, Position::Center, value );
168 newZoomX = coordinatePlane()->zoomFactorX();
169 newZoomY = coordinatePlane()->zoomFactorY();
171 if ( d->labelPaintCache.paintReplay.count() ) {
173 const qreal oldZoomX = newZoomX;
174 const qreal oldZoomY = newZoomY;
177 d->paintDataValueTextsAndMarkers( ctx, d->labelPaintCache,
true,
true, &txtRectF );
179 const QRect curRect = coordinatePlane()->geometry();
180 const qreal gapX = qMin( txtRect.
left() - curRect.
left(), curRect.
right() - txtRect.
right() );
181 const qreal gapY = qMin( txtRect.
top() - curRect.
top(), curRect.
bottom() - txtRect.
bottom() );
183 newZoomX = oldZoomX * ( 1.0 + ( gapX - 1.0 ) / curRect.
width() );
186 newZoomY = oldZoomY * ( 1.0 + ( gapY - 1.0 ) / curRect.
height() );
191 for (
int iCol = 0; iCol < colCount; ++iCol ) {
196 QBrush brush = d->datasetAttrs( iCol, KChart::DatasetBrushRole ).value<
QBrush>();
198 for (
int iRow = 0; iRow < rowCount; ++iRow ) {
199 QModelIndex index = model()->index( iRow, iCol, rootIndex() );
200 const qreal value = model()->
data( index ).
toReal();
201 QPointF point = coordinatePlane()->translate(
QPointF( value, iRow ) )
203 polygon.append( point );
206 if ( closeDatasets() && !polygon.isEmpty() ) {
208 polygon.append( polygon.first() );
211 PainterSaver painterSaver( ctx->painter() );
214 QPen p = d->datasetAttrs( iCol, KChart::DatasetPenRole ).value<
QPen >();
217 ctx->painter()->
setPen( PrintingParameters::scalePen( p ) );
221 d->paintDataValueTextsAndMarkers( ctx, d->labelPaintCache,
true );
233 return model()->rowCount(rootIndex());
239 return model() ? model()->rowCount(rootIndex()) : 0.0;
251 qWarning() <<
"Deprecated PolarDiagram::setZeroDegreePosition() called, setting ignored.";
256 qWarning() <<
"Deprecated PolarDiagram::zeroDegreePosition() called.";
260 void PolarDiagram::setRotateCircularLabels(
bool rotateCircularLabels )
262 d->rotateCircularLabels = rotateCircularLabels;
265 bool PolarDiagram::rotateCircularLabels()
const 267 return d->rotateCircularLabels;
272 d->closeDatasets = closeDatasets;
275 bool PolarDiagram::closeDatasets()
const 277 return d->closeDatasets;
280 void PolarDiagram::setShowDelimitersAtPosition(
Position position,
281 bool showDelimiters )
283 d->showDelimitersAtPosition[position.
value()] = showDelimiters;
286 void PolarDiagram::setShowLabelsAtPosition(
Position position,
289 d->showLabelsAtPosition[position.
value()] = showLabels;
292 bool PolarDiagram::showDelimitersAtPosition(
Position position )
const 294 return d->showDelimitersAtPosition[position.
value()];
297 bool PolarDiagram::showLabelsAtPosition(
Position position )
const 299 return d->showLabelsAtPosition[position.
value()];
KChartEnums::PositionValue value() const
Returns an integer value corresponding to this Position.
Qt::PenStyle style() const const
QRect toRect() const const
void resize(const QSizeF &area) override
void paint(PaintContext *paintContext) override
void setRenderHint(QPainter::RenderHint hint, bool on)
void drawPolyline(const QPointF *points, int pointCount)
Defines a position, using compass terminology.
void setCloseDatasets(bool closeDatasets)
Close each of the data series by connecting the last point to its respective start point...
qreal valueTotals() const override
void paint(QPainter *) override
reimpl
void setZeroDegreePosition(int degrees)
Stores the absolute target points of a Position.
Stores information about painting diagrams.
void setPen(const QColor &color)
QPointF topLeft() const const
void setBrush(const QBrush &brush)
qreal numberOfValuesPerDataset() const override
int zeroDegreePosition() const
qreal numberOfGridRings() const override
virtual void resize(const QSizeF &area)
Called by the widget's sizeEvent.
QVariant data(int role) const const
const QPair< QPointF, QPointF > calculateDataBoundaries() const override
Base class for diagrams based on a polar coordinate system.
qreal toReal(bool *ok) const const
virtual PolarDiagram * clone() const
Creates an exact copy of this diagram.
PolarDiagram defines a common polar diagram.