12 #include "KDChartAbstractCoordinatePlane_p.h"
17 #include <KDABLibFakes>
19 #include <QGridLayout>
20 #include <QMouseEvent>
21 #include <QRubberBand>
22 #include <QtCore/qmath.h>
28 AbstractCoordinatePlane::Private::Private()
46 void AbstractCoordinatePlane::init()
51 Qt::QueuedConnection);
78 if (
d->diagrams.count()) {
80 oldDiagram =
d->diagrams.first();
97 const int idx =
d->diagrams.indexOf(
diagram);
99 d->diagrams.removeAt(idx);
112 if (
d->diagrams.isEmpty()) {
115 return d->diagrams.first();
128 qCopy(
d->diagrams.begin(),
d->diagrams.end(), std::back_inserter(list));
138 d->gridAttributes = a;
144 return d->gridAttributes;
149 return d->grid->updateData(
this);
154 d->grid->setNeedRecalculate();
159 d->referenceCoordinatePlane = plane;
164 return d->referenceCoordinatePlane;
192 return Qt::Vertical | Qt::Horizontal;
199 return QSize(QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX);
204 return QSize(60, 60);
211 return maximumSize();
216 if (
d->geometry != r) {
219 Q_EMIT internal_geometryChanged(
d->geometry, r);
241 Q_EMIT needRelayout();
247 Q_EMIT needLayoutPlanes();
252 d->enableRubberBandZooming = enable;
254 if (!enable &&
d->rubberBand !=
nullptr) {
255 delete d->rubberBand;
256 d->rubberBand =
nullptr;
262 return d->enableRubberBandZooming;
267 if (
d->enableCornerSpacers == enable)
270 d->enableCornerSpacers = enable;
271 Q_EMIT needRelayout();
276 return d->enableCornerSpacers;
281 if (event->button() == Qt::LeftButton) {
282 if (
d->enableRubberBandZooming &&
d->rubberBand ==
nullptr)
283 d->rubberBand =
new QRubberBand(QRubberBand::Rectangle, qobject_cast<QWidget *>(parent()));
285 if (
d->rubberBand !=
nullptr) {
286 d->rubberBandOrigin =
event->pos();
287 d->rubberBand->setGeometry(QRect(event->pos(), QSize()));
288 d->rubberBand->show();
292 }
else if (event->button() == Qt::RightButton) {
293 if (
d->enableRubberBandZooming && !
d->rubberBandZoomConfigHistory.isEmpty()) {
296 setZoomFactorX(config.
xFactor);
297 setZoomFactorY(config.
yFactor);
298 setZoomCenter(config.
center());
300 QWidget *
const p = qobject_cast<QWidget *>(parent());
309 a->mousePressEvent(event);
315 if (event->button() == Qt::RightButton) {
318 mousePressEvent(event);
321 a->mouseDoubleClickEvent(event);
327 if (
d->rubberBand !=
nullptr) {
329 d->rubberBandZoomConfigHistory.push(
ZoomParameters(zoomFactorX(), zoomFactorY(), zoomCenter()));
332 const auto rubberWidth =
static_cast<qreal
>(
d->rubberBand->width());
333 const auto rubberHeight =
static_cast<qreal
>(
d->rubberBand->height());
335 if (rubberWidth > 0.0 && rubberHeight > 0.0) {
337 const qreal centerX = qFloor(
d->rubberBand->geometry().width() / 2.0 +
d->rubberBand->geometry().x());
338 const qreal centerY = qCeil(
d->rubberBand->geometry().height() / 2.0 +
d->rubberBand->geometry().y());
340 const qreal rubberCenterX =
static_cast<qreal
>(centerX - geometry().x());
341 const qreal rubberCenterY =
static_cast<qreal
>(centerY - geometry().y());
344 const qreal myWidth =
static_cast<qreal
>(geometry().width());
345 const qreal myHeight =
static_cast<qreal
>(geometry().height());
348 const qreal newCenterX = rubberCenterX / myWidth / zoomFactorX() + zoomCenter().x() - 0.5 / zoomFactorX();
349 const qreal newCenterY = rubberCenterY / myHeight / zoomFactorY() + zoomCenter().y() - 0.5 / zoomFactorY();
352 const qreal newZoomFactorX = zoomFactorX() * myWidth / rubberWidth;
353 const qreal newZoomFactorY = zoomFactorY() * myHeight / rubberHeight;
356 const QPointF newZoomCenter(newCenterX, newCenterY);
358 setZoomFactorX(newZoomFactorX);
359 setZoomFactorY(newZoomFactorY);
360 setZoomCenter(newZoomCenter);
363 d->rubberBand->parentWidget()->update();
364 delete d->rubberBand;
365 d->rubberBand =
nullptr;
371 a->mouseReleaseEvent(event);
377 if (
d->rubberBand !=
nullptr) {
378 const QRect normalized = QRect(
d->rubberBandOrigin, event->pos()).normalized();
379 d->rubberBand->setGeometry(normalized & geometry());
385 a->mouseMoveEvent(event);
389 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && defined(Q_COMPILER_MANGLES_RETURN_TYPE)
395 return d->isVisiblePoint(
this, point);
404 #if !defined(QT_NO_DEBUG_STREAM)
409 stream <<
"DataDimension("
410 <<
" start=" << r.
start
Definition of global enums.
static QString granularitySequenceToString(GranularitySequence sequence)
An area in the chart with a background, a frame, etc.
Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane,...
void setGeometry(const QRect &r) override
QSize sizeHint() const override
void destroyedCoordinatePlane(AbstractCoordinatePlane *)
virtual void addDiagram(AbstractDiagram *diagram)
virtual void layoutDiagrams()=0
virtual void mousePressEvent(QMouseEvent *event)
bool isCornerSpacersEnabled() const
void setGlobalGridAttributes(const GridAttributes &)
virtual void replaceDiagram(AbstractDiagram *diagram, AbstractDiagram *oldDiagram=nullptr)
virtual AbstractCoordinatePlane * sharedAxisMasterPlane(QPainter *p=nullptr)
bool isVisiblePoint(const QPointF &point) const
bool isRubberBandZoomingEnabled() const
virtual void mouseReleaseEvent(QMouseEvent *event)
bool isEmpty() const override
Qt::Orientations expandingDirections() const override
void setRubberBandZoomingEnabled(bool enable)
void setReferenceCoordinatePlane(AbstractCoordinatePlane *plane)
QSize minimumSize() const override
void setGridNeedsRecalculate()
virtual void mouseDoubleClickEvent(QMouseEvent *event)
void internal_geometryChanged(QRect, QRect)
GridAttributes globalGridAttributes() const
AbstractDiagramList diagrams()
AbstractDiagram * diagram()
void setParent(Chart *parent)
void geometryChanged(QRect, QRect)
void setCornerSpacersEnabled(bool enable)
DataDimensionsList gridDimensionsList()
AbstractCoordinatePlane * referenceCoordinatePlane() const
QSize maximumSize() const override
virtual void takeDiagram(AbstractDiagram *diagram)
~AbstractCoordinatePlane() override
virtual void mouseMoveEvent(QMouseEvent *event)
QRect geometry() const override
AbstractDiagram defines the interface for diagram classes.
virtual void setCoordinatePlane(AbstractCoordinatePlane *plane)
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...
AbstractCoordinatePlane::AxesCalcMode calcMode
KDChartEnums::GranularitySequence sequence
A set of attributes controlling the appearance of grids.
const QPointF center() const
QDebug operator<<(QDebug stream, const DataDimension &r)
QList< AbstractDiagram * > AbstractDiagramList
QList< DataDimension > DataDimensionsList
QList< const AbstractDiagram * > ConstAbstractDiagramList