12 #include "KDChartTernaryCoordinatePlane_p.h"
19 #include "KDChartPainterSaver_p.h"
28 TernaryCoordinatePlane::Private::Private()
33 TernaryCoordinatePlane::TernaryCoordinatePlane(
Chart *parent)
42 void TernaryCoordinatePlane::init()
49 "TernaryCoordinatePlane::addDiagram",
"Only ternary "
50 "diagrams can be added to a ternary coordinate plane!");
58 QRectF diagramNativeRectangle(QPointF(0.0, 0.0),
62 diagramNativeRectangle.adjust(-margins.first.width(), -margins.first.height(),
63 margins.second.width(), margins.second.height());
68 QSizeF topleft(0.0, 0.0);
69 QSizeF bottomRight(0.0, 0.0);
70 const auto constDiagrams =
diagrams();
73 qobject_cast<AbstractTernaryDiagram *>(abstractDiagram);
75 const auto constAxes =
diagram->axes();
77 QPair<QSizeF, QSizeF> margin = axis->requiredMargins();
78 topleft = topleft.expandedTo(margin.first);
79 bottomRight = bottomRight.expandedTo(margin.second);
82 d->diagramRectContainer =
83 d->diagramRect.adjusted(topleft.width(),
86 -bottomRight.height());
91 QPointF zeroZeroPoint =
d->diagramRectContainer.bottomLeft();
92 qreal w =
d->diagramRectContainer.width();
93 qreal h =
d->diagramRectContainer.height();
99 usableWidth = h / diagramNativeRectangle.height();
101 zeroZeroPoint.setX(zeroZeroPoint.x() + (w - usableWidth) / 2);
105 usableHeight = diagramNativeRectangle.height() * w;
106 zeroZeroPoint.setY(zeroZeroPoint.y() - (h - usableHeight) / 2);
110 d->xUnit = usableWidth / diagramNativeRectangle.width();
111 d->yUnit = -usableHeight / diagramNativeRectangle.height();
116 qreal rightShift = -diagramNativeRectangle.x();
117 zeroZeroPoint += QPointF(rightShift *
d->xUnit, descent *
d->yUnit);
120 d->diagramRect.setBottomLeft(zeroZeroPoint);
121 d->diagramRect.setTopRight(QPointF(usableWidth, -usableHeight) + zeroZeroPoint);
126 return QPointF(
d->diagramRect.bottomLeft().x() + point.x() *
d->xUnit,
127 d->diagramRect.bottomLeft().y() + point.y() *
d->yUnit);
138 return QSizePolicy(QSizePolicy::MinimumExpanding,
139 QSizePolicy::MinimumExpanding);
144 PainterSaver s(painter);
146 painter->setRenderHint(QPainter::Antialiasing,
true);
149 if (!diags.isEmpty()) {
157 Q_ASSERT(
d->grid !=
nullptr);
158 d->grid->drawGrid(&ctx);
161 for (
int i = 0; i < diags.size(); i++) {
162 PainterSaver diagramPainterSaver(painter);
163 diags[i]->paint(&ctx);
175 auto *ternaryGrid =
static_cast<TernaryGrid *
>(
d->grid);
const qreal TriangleHeight
const qreal TriangleWidth
QRect areaGeometry() const override
Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane,...
virtual void addDiagram(AbstractDiagram *diagram)
AbstractDiagramList diagrams()
AbstractDiagram * diagram()
AbstractDiagram defines the interface for diagram classes.
Base class for diagrams based on a ternary coordinate plane.
A chart with one or more diagrams.
Stores information about painting diagrams.
void setPainter(QPainter *painter)
void setCoordinatePlane(AbstractCoordinatePlane *plane)
void setRectangle(const QRectF &rect)
void layoutDiagrams() override
DataDimensionsList getDataDimensionsList() const override
void paint(QPainter *) override
~TernaryCoordinatePlane() override
void addDiagram(AbstractDiagram *diagram) override
const QPointF translate(const QPointF &diagramPoint) const override
QSize minimumSizeHint() const
QSizePolicy sizePolicy() const
QPair< QSizeF, QSizeF > requiredMargins() const
QList< AbstractDiagram * > AbstractDiagramList
QList< DataDimension > DataDimensionsList