12#include "KDChartCartesianCoordinatePlane_p.h"
17#include "KDChartAbstractDiagram_p.h"
21#include "KDChartPainterSaver_p.h"
24#include <KDABLibFakes>
26#include <QApplication>
27#include <QElapsedTimer>
37CartesianCoordinatePlane::Private::Private()
53void CartesianCoordinatePlane::init()
61 "CartesianCoordinatePlane::addDiagram",
"Only cartesian "
62 "diagrams can be added to a cartesian coordinate plane!");
73 if (
d->bPaintIsRunning) {
76 d->bPaintIsRunning =
true;
79 if (!
diags.isEmpty()) {
82 ctx.setCoordinatePlane(
this);
93 d->grid->drawGrid(&
ctx);
96 for (
int i = 0;
i <
diags.size();
i++) {
97 if (
diags[
i]->isHidden()) {
110 qDebug() <<
"Painting diagram" <<
i <<
"took" <<
stopWatch.elapsed() <<
"milliseconds";
114 d->bPaintIsRunning =
false;
130 const auto constDiagrams =
diagrams();
152 const QRectF &r,
unsigned int percentX,
unsigned int percentY)
const
211 if (!
ISNAN(
d->horizontalMin))
213 if (!
ISNAN(
d->horizontalMax))
217 if (!
ISNAN(
d->verticalMin))
219 if (!
ISNAN(
d->verticalMax))
226 dataBoundingRect,
d->autoAdjustHorizontalRangeToData,
d->autoAdjustVerticalRangeToData);
242 if (
dgr &&
dgr->referenceDiagram()) {
243 dgr =
dgr->referenceDiagram();
268 gaH.gridGranularitySequence(),
270 gaH.gridSubStepWidth()));
277 gaV.gridGranularitySequence(),
279 gaV.gridSubStepWidth()));
300 if (
d->dimensions.isEmpty())
336 Q_ASSERT_X(
d->dimensions.count() == 2,
"CartesianCoordinatePlane::layoutDiagrams",
337 "Error: gridDimensionsList() did not return exactly two dimensions.");
356 d->fixedDataCoordinateSpaceRelation = fixed;
357 d->fixedDataCoordinateSpaceRelationPinnedSize =
QSize();
363 return d->fixedDataCoordinateSpaceRelation;
376 return d->xAxisStartAtZero;
381 if (!
d->fixedDataCoordinateSpaceRelation) {
392 if (!
d->fixedDataCoordinateSpaceRelationPinnedSize.isValid()) {
393 d->fixedDataCoordinateSpaceRelationPinnedSize =
geometry.
size();
399 if (
d->fixedDataCoordinateSpaceRelationPinnedSize !=
geometry.
size()) {
407 d->fixedDataCoordinateSpaceRelationPinnedZoom.yCenter /
heightScaling);
409 bool changed =
false;
432 return d->coordinateTransformation.translateBack(
screenPoint);
437 if (
d->isometricScaling !=
isOn) {
438 d->isometricScaling =
isOn;
446 return d->isometricScaling;
451 if (
d->coordinateTransformation.zoom.xFactor ==
factor) {
454 d->coordinateTransformation.zoom.xFactor =
factor;
455 if (
d->autoAdjustGridToZoom) {
456 d->grid->setNeedRecalculate();
463 if (
d->coordinateTransformation.zoom.yFactor ==
factor) {
466 d->coordinateTransformation.zoom.yFactor =
factor;
467 if (
d->autoAdjustGridToZoom) {
468 d->grid->setNeedRecalculate();
475 if (
d->coordinateTransformation.zoom.center() == point) {
478 d->coordinateTransformation.zoom.setCenter(point);
479 if (
d->autoAdjustGridToZoom) {
480 d->grid->setNeedRecalculate();
519 return d->coordinateTransformation.zoom.center();
524 return d->coordinateTransformation.zoom.xFactor;
529 return d->coordinateTransformation.zoom.yFactor;
534 return d->coordinateTransformation.axesCalcModeY;
539 return d->coordinateTransformation.axesCalcModeX;
544 if (
d->coordinateTransformation.axesCalcModeY != mode ||
d->coordinateTransformation.axesCalcModeX != mode) {
545 d->coordinateTransformation.axesCalcModeY = mode;
546 d->coordinateTransformation.axesCalcModeX = mode;
549 const auto constDiagrams =
diagrams();
558 if (
d->coordinateTransformation.axesCalcModeY != mode) {
559 d->coordinateTransformation.axesCalcModeY = mode;
568 if (
d->coordinateTransformation.axesCalcModeX != mode) {
569 d->coordinateTransformation.axesCalcModeX = mode;
576inline bool fuzzyCompare(qreal a, qreal b)
578 if (ISNAN(a) && ISNAN(b))
580 if (qFuzzyIsNull(a) && qFuzzyIsNull(b))
582 return qFuzzyCompare(a, b);
590 d->autoAdjustHorizontalRangeToData = 100;
591 d->horizontalMin = range.first;
592 d->horizontalMax = range.second;
603 d->autoAdjustVerticalRangeToData = 100;
604 d->verticalMin = range.first;
605 d->verticalMax = range.second;
655 d->horizontalMin = 0.0;
656 d->horizontalMax = 0.0;
666 d->verticalMin = 0.0;
667 d->verticalMax = 0.0;
675 return d->autoAdjustHorizontalRangeToData;
680 return d->autoAdjustVerticalRangeToData;
688 d->gridAttributesHorizontal = a;
690 d->gridAttributesVertical = a;
691 setHasOwnGridAttributes(orientation,
true);
698 setHasOwnGridAttributes(orientation,
false);
706 return d->gridAttributesHorizontal;
708 return d->gridAttributesVertical;
714void CartesianCoordinatePlane::setHasOwnGridAttributes(
Qt::Orientation orientation,
bool on)
717 d->hasOwnGridAttributesHorizontal =
on;
719 d->hasOwnGridAttributesVertical =
on;
725 return orientation ==
Qt::Horizontal ?
d->hasOwnGridAttributesHorizontal
726 :
d->hasOwnGridAttributesVertical;
733 d->grid->setNeedRecalculate();
738#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && defined(Q_COMPILER_MANGLES_RETURN_TYPE)
744 return d->autoAdjustGridToZoom;
752 if (
diag !=
nullptr) {
757 if (p !=
nullptr && p !=
this) {
764 if (plane ==
this || painter ==
nullptr)
789 if (
d->reverseHorizontalPlane ==
reverse)
792 d->reverseHorizontalPlane =
reverse;
799 return d->reverseHorizontalPlane;
804 if (
d->reverseVerticalPlane ==
reverse)
814 return d->reverseVerticalPlane;
835 d->geometry = rectangle;
836 if (
d->isometricScaling) {
841 d->geometry.setHeight(
hfw);
849 const auto constDiagrams =
diagrams();
863 return d->isometricScaling;
878 if (
d->isometricScaling) {
880 sh =
d->geometry.size();
QRect areaGeometry() const override
Base class for diagrams based on a cartesian coordianate system.
Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane,...
void setGeometry(const QRect &r) override
QSize sizeHint() const override
virtual void addDiagram(AbstractDiagram *diagram)
void viewportCoordinateSystemChanged()
void setGridNeedsRecalculate()
GridAttributes globalGridAttributes() const
AbstractDiagramList diagrams()
AbstractDiagram * diagram()
DataDimensionsList gridDimensionsList()
QRect geometry() const override
AbstractDiagram defines the interface for diagram classes.
void layoutChanged(AbstractDiagram *)
const QPair< QPointF, QPointF > dataBoundaries() const
Return the bottom left and top right data point, that the diagram will display (unless the grid adjus...
virtual void resize(const QSizeF &area)=0
Cartesian coordinate plane.
QRectF visibleDataRange() const
void setAxesCalcModeX(AxesCalcMode mode)
DataDimensionsList getDataDimensionsList() const override
QRectF visibleDiagramArea() const
int heightForWidth(int w) const override
bool hasOwnGridAttributes(Qt::Orientation orientation) const
void setVerticalRange(const QPair< qreal, qreal > &range)
Set the boundaries of the visible value space displayed in vertical direction.
unsigned int autoAdjustVerticalRangeToData() const
Returns the maximal allowed percent of the vertical space covered by the coordinate plane that may be...
void adjustVerticalRangeToData()
void adjustHorizontalRangeToData()
CartesianCoordinatePlane(Chart *parent=nullptr)
unsigned int autoAdjustHorizontalRangeToData() const
Returns the maximal allowed percent of the horizontal space covered by the coordinate plane that may ...
void layoutDiagrams() override
bool hasHeightForWidth() const override
bool doesIsometricScaling() const
void setZoomFactorY(qreal factor) override
void setZoomFactors(qreal factorX, qreal factorY) override
bool isVerticalRangeReversed() const
void setGeometry(const QRect &r) override
void adjustRangesToData()
Adjust both, horizontal and vertical range settings to the ranges covered by the model's data values.
QPointF zoomCenter() const override
const QPointF translate(const QPointF &diagramPoint) const override
bool xAxisStartAtZero() const
bool hasFixedDataCoordinateSpaceRelation() const
bool doneSetZoomFactorX(qreal factor)
virtual QRectF calculateRawDataBoundingRect() const
void setAutoAdjustGridToZoom(bool autoAdjust)
QPair< qreal, qreal > horizontalRange() const
void paint(QPainter *) override
bool isHorizontalRangeReversed() const
void setVerticalRangeReversed(bool reverse)
QPair< qreal, qreal > verticalRange() const
AbstractCoordinatePlane * sharedAxisMasterPlane(QPainter *p=nullptr) override
void setZoomFactorX(qreal factor) override
Qt::Orientations expandingDirections() const override
void setAutoAdjustVerticalRangeToData(unsigned int percentEmpty=67)
Automatically adjust vertical range settings to the ranges covered by the model's values,...
void slotLayoutChanged(AbstractDiagram *)
const GridAttributes gridAttributes(Qt::Orientation orientation) const
void addDiagram(AbstractDiagram *diagram) override
void setXAxisStartAtZero(bool fixedStart)
void setHorizontalRangeReversed(bool reverse)
QRectF logicalArea() const
QSize sizeHint() const override
void setIsometricScaling(bool onOff)
void setAxesCalcModes(AxesCalcMode mode)
const QPointF translateBack(const QPointF &screenPoint) const
void setAutoAdjustHorizontalRangeToData(unsigned int percentEmpty=67)
Automatically adjust horizontal range settings to the ranges covered by the model's values,...
qreal zoomFactorX() const override
void setZoomCenter(const QPointF ¢er) override
QRectF adjustedToMaxEmptyInnerPercentage(const QRectF &r, unsigned int percentX, unsigned int percentY) const
void setFixedDataCoordinateSpaceRelation(bool fixed)
virtual QRectF drawingArea() const
void setHorizontalRange(const QPair< qreal, qreal > &range)
Set the boundaries of the visible value space displayed in horizontal direction.
QRectF diagramArea() const
bool doneSetZoomFactorY(qreal factor)
~CartesianCoordinatePlane() override
bool autoAdjustGridToZoom() const
QRectF getRawDataBoundingRectFromDiagrams() const
void resetGridAttributes(Qt::Orientation orientation)
AxesCalcMode axesCalcModeX() const
void setGridAttributes(Qt::Orientation orientation, const GridAttributes &)
void setAxesCalcModeY(AxesCalcMode mode)
AxesCalcMode axesCalcModeY() const
void handleFixedDataCoordinateSpaceRelation(const QRectF &geometry)
qreal zoomFactorY() const override
bool doneSetZoomCenter(const QPointF ¢er)
A chart with one or more diagrams.
Helper class for one dimension of data, e.g. for the rows in a data model, or for the labels of an ax...
A set of attributes controlling the appearance of grids.
Stores information about painting diagrams.
void setPainter(QPainter *painter)
bool isEmpty() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
T qobject_cast(QObject *object)
void scale(qreal sx, qreal sy)
void setClipRegion(const QRegion ®ion, Qt::ClipOperation operation)
void translate(const QPointF &offset)
QRect adjusted(int dx1, int dy1, int dx2, int dy2) const const
bool isValid() const const
QRectF adjusted(qreal dx1, qreal dy1, qreal dx2, qreal dy2) const const
qreal bottom() const const
QRectF intersected(const QRectF &rectangle) const const
QRectF normalized() const const
qreal right() const const
void setBottomLeft(const QPointF &position)
void setBottomRight(const QPointF &position)
void setTopLeft(const QPointF &position)