12 #include "KDChartPolarCoordinatePlane_p.h"
18 #include "KDChartPainterSaver_p.h"
29 #include <KDABLibFakes>
46 void PolarCoordinatePlane::init()
54 "PolarCoordinatePlane::addDiagram",
"Only polar"
55 "diagrams can be added to a polar coordinate plane!");
63 if (
d->coordinateTransformations.size() != diags.size()) {
68 Q_ASSERT(!
d->coordinateTransformations.isEmpty());
79 d->newZoomX = oldZoomX;
80 d->newZoomY = oldZoomY;
81 for (
int i = 0; i < diags.size(); i++) {
82 d->currentTransformation = &(
d->coordinateTransformations[i]);
87 polarDia->
paint(&ctx,
true, zoomX, zoomY);
88 d->newZoomX = qMin(
d->newZoomX, zoomX);
89 d->newZoomY = qMin(
d->newZoomY, zoomY);
93 if (
d->newZoomX != oldZoomX ||
d->newZoomY != oldZoomY) {
95 d->currentTransformation =
nullptr;
96 QMetaObject::invokeMethod(
this,
"adjustZoomAndRepaint", Qt::QueuedConnection);
103 d->currentTransformation = &
d->coordinateTransformations.first();
104 d->grid->drawGrid(&ctx);
107 for (
int i = 0; i < diags.size(); i++) {
108 d->currentTransformation = &(
d->coordinateTransformations[i]);
109 PainterSaver painterSaver(painter);
110 auto *polarDia =
dynamic_cast<PolarDiagram *
>(diags[i]);
112 qreal dummy1, dummy2;
113 polarDia->
paint(&ctx,
false, dummy1, dummy2);
115 diags[i]->paint(&ctx);
118 d->currentTransformation =
nullptr;
123 const qreal newZoom = qMin(
d->newZoomX,
d->newZoomY);
130 d->initialResizeEventReceived =
true;
143 d->contentRect = QRectF(1, 1, rect.width() - 3, rect.height() - 3);
146 :
d->coordinateTransformations.front().zoom;
149 d->coordinateTransformations.clear();
150 const auto constDiagrams =
diagrams();
153 Q_ASSERT(polarDiagram);
154 QPair<QPointF, QPointF> dataBoundariesPair = polarDiagram->dataBoundaries();
156 const qreal
angleUnit = 360 / polarDiagram->valueTotals();
158 const qreal radius = qAbs(dataBoundariesPair.first.y()) + dataBoundariesPair.second.y();
160 const qreal diagramWidth = radius * 2;
161 const qreal planeWidth =
d->contentRect.width();
162 const qreal planeHeight =
d->contentRect.height();
163 const qreal
radiusUnit = qMin(planeWidth, planeHeight) / diagramWidth;
165 QPointF coordinateOrigin = QPointF(planeWidth / 2, planeHeight / 2);
166 coordinateOrigin +=
d->contentRect.topLeft();
169 diagramTransposition.originTranslation = coordinateOrigin;
171 diagramTransposition.angleUnit =
angleUnit;
172 diagramTransposition.startPosition = oldStartPosition;
173 diagramTransposition.
zoom = zoom;
174 diagramTransposition.minValue = dataBoundariesPair.first.y() < 0 ? dataBoundariesPair.first.y() : 0.0;
175 d->coordinateTransformations.append(diagramTransposition);
182 Q_ASSERT_X(
d->currentTransformation !=
nullptr,
"PolarCoordinatePlane::translate",
183 "Only call translate() from within paint().");
184 return d->currentTransformation->translate(diagramPoint);
189 Q_ASSERT_X(
d->currentTransformation !=
nullptr,
"PolarCoordinatePlane::translate",
190 "Only call translate() from within paint().");
191 return d->currentTransformation->translatePolar(diagramPoint);
196 Q_ASSERT_X(
d->currentTransformation !=
nullptr,
"PolarCoordinatePlane::angleUnit",
197 "Only call angleUnit() from within paint().");
198 return d->currentTransformation->angleUnit;
203 Q_ASSERT_X(
d->currentTransformation !=
nullptr,
"PolarCoordinatePlane::radiusUnit",
204 "Only call radiusUnit() from within paint().");
205 return d->currentTransformation->radiusUnit;
210 if (
d->initialResizeEventReceived)
216 Q_ASSERT_X(
diagram(),
"PolarCoordinatePlane::setStartPosition",
217 "setStartPosition() needs a diagram to be associated to the plane.");
218 for (CoordinateTransformationList::iterator it =
d->coordinateTransformations.begin();
219 it !=
d->coordinateTransformations.end();
222 trans.startPosition = degrees;
228 return d->coordinateTransformations.isEmpty()
230 :
d->coordinateTransformations.first().startPosition;
235 return d->coordinateTransformations.isEmpty()
237 :
d->coordinateTransformations.first().zoom.xFactor;
242 return d->coordinateTransformations.isEmpty()
244 :
d->coordinateTransformations.first().zoom.yFactor;
255 for (CoordinateTransformationList::iterator it =
d->coordinateTransformations.begin();
256 it !=
d->coordinateTransformations.end();
265 for (CoordinateTransformationList::iterator it =
d->coordinateTransformations.begin();
266 it !=
d->coordinateTransformations.end();
275 return d->coordinateTransformations.isEmpty()
277 : QPointF(
d->coordinateTransformations.first().zoom.xCenter,
d->coordinateTransformations.first().zoom.yCenter);
282 for (CoordinateTransformationList::iterator it =
d->coordinateTransformations.begin();
283 it !=
d->coordinateTransformations.end();
305 d->gridAttributesCircular = a;
307 d->gridAttributesSagittal = a;
308 setHasOwnGridAttributes(circular,
true);
310 Q_EMIT propertiesChanged();
316 setHasOwnGridAttributes(circular,
false);
323 if (hasOwnGridAttributes(circular)) {
325 return d->gridAttributesCircular;
327 return d->gridAttributesSagittal;
329 return globalGridAttributes();
336 QPointF referencePointAtTop = plane->
translate(QPointF(1, 0));
337 QPointF temp = plane->
translate(QPointF(0, 0)) - referencePointAtTop;
338 const qreal offset = temp.y();
339 referencePointAtTop.setX(referencePointAtTop.x() - offset);
340 contentsRect.setTopLeft(referencePointAtTop);
341 contentsRect.setBottomRight(referencePointAtTop + QPointF(2.0 * offset, 2.0 * offset));
345 void KDChart::PolarCoordinatePlane::setHasOwnGridAttributes(
346 bool circular,
bool on)
349 d->hasOwnGridAttributesCircular = on;
351 d->hasOwnGridAttributesSagittal = on;
352 Q_EMIT propertiesChanged();
359 ?
d->hasOwnGridAttributesCircular
360 :
d->hasOwnGridAttributesSagittal;
QRect areaGeometry() const override
Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane,...
virtual void addDiagram(AbstractDiagram *diagram)
AbstractDiagramList diagrams()
AbstractDiagram * diagram()
QRect geometry() const override
AbstractDiagram defines the interface for diagram classes.
void layoutChanged(AbstractDiagram *)
Base class for diagrams based on a polar coordinate system.
A chart with one or more diagrams.
A set of attributes controlling the appearance of grids.
Stores information about painting diagrams.
void setPainter(QPainter *painter)
void setCoordinatePlane(AbstractCoordinatePlane *plane)
void setRectangle(const QRectF &rect)
const GridAttributes gridAttributes(bool circular) const
void setZoomFactorY(qreal factor) override
void layoutDiagrams() override
qreal startPosition() const
void addDiagram(AbstractDiagram *diagram) override
~PolarCoordinatePlane() override
void setZoomCenter(const QPointF ¢er) override
void setZoomFactorX(qreal factor) override
QPointF zoomCenter() const override
void resizeEvent(QResizeEvent *)
void adjustZoomAndRepaint()
void paint(QPainter *) override
DataDimensionsList getDataDimensionsList() const override
qreal zoomFactorX() const override
qreal zoomFactorY() const override
void setStartPosition(qreal degrees)
Specify the rotation of the coordinate plane.
const QPointF translate(const QPointF &diagramPoint) const override
bool hasOwnGridAttributes(bool circular) const
void setZoomFactors(qreal factorX, qreal factorY) override
PolarCoordinatePlane(Chart *parent=nullptr)
void setGridAttributes(bool circular, const GridAttributes &)
void resetGridAttributes(bool circular)
void slotLayoutChanged(AbstractDiagram *diagram)
const QPointF translatePolar(const QPointF &diagramPoint) const
PolarDiagram defines a common polar diagram.
void paint(PaintContext *paintContext) override
QList< AbstractDiagram * > AbstractDiagramList
QList< DataDimension > DataDimensionsList