##// END OF EJS Templates
Added parametric zoom on QChart....
Added parametric zoom on QChart. Signed-off-by: jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r2854:46147b040d06
r2900:7532b52dd10c
Show More
scatterchartitem.cpp
293 lines | 9.7 KiB | text/x-c | CppLexer
Miikka Heikkinen
Updated license...
r2854 /****************************************************************************
Titta Heikkala
Updated license headers...
r2845 **
Miikka Heikkinen
Updated license...
r2854 ** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
Titta Heikkala
Updated license headers...
r2845 **
Miikka Heikkinen
Updated license...
r2854 ** This file is part of the Qt Charts module of the Qt Toolkit.
Titta Heikkala
Updated license headers...
r2845 **
Miikka Heikkinen
Updated license...
r2854 ** $QT_BEGIN_LICENSE:GPL$
Titta Heikkala
Updated license headers...
r2845 ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
Miikka Heikkinen
Updated license...
r2854 ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
Titta Heikkala
Updated license headers...
r2845 **
** $QT_END_LICENSE$
**
Miikka Heikkinen
Updated license...
r2854 ****************************************************************************/
Jani Honkonen
Add license headers
r794
Titta Heikkala
Fix include syntax...
r2714 #include <private/scatterchartitem_p.h>
#include <QtCharts/QScatterSeries>
#include <private/qscatterseries_p.h>
#include <private/chartpresenter_p.h>
#include <private/abstractdomain_p.h>
#include <QtCharts/QChart>
#include <QtGui/QPainter>
#include <QtWidgets/QGraphicsScene>
#include <QtCore/QDebug>
#include <QtWidgets/QGraphicsSceneMouseEvent>
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_BEGIN_NAMESPACE
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Miikka Heikkinen
Add Polar chart support...
r2483 ScatterChartItem::ScatterChartItem(QScatterSeries *series, QGraphicsItem *item)
Michal Klocek
Refactors internals...
r2273 : XYChart(series,item),
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_series(series),
m_items(this),
m_visible(true),
m_shape(QScatterSeries::MarkerShapeRectangle),
Titta Heikkala
Added possibility to show series value...
r2689 m_size(15),
m_pointLabelsVisible(false),
Titta Heikkala
Fix order of initialization...
r2695 m_pointLabelsFormat(series->pointLabelsFormat()),
Titta Heikkala
Added possibility to show series value...
r2689 m_pointLabelsFont(series->pointLabelsFont()),
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 m_pointLabelsColor(series->pointLabelsColor()),
Titta Heikkala
Added option to set labels clipping...
r2815 m_pointLabelsClipping(true),
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 m_mousePressed(false)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QObject::connect(m_series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdated()));
Tero Ahola
Added notifiers for scatter properties
r1349 QObject::connect(m_series, SIGNAL(visibleChanged()), this, SLOT(handleUpdated()));
Tero Ahola
Added opacity property to QAbstractSeries
r2067 QObject::connect(m_series, SIGNAL(opacityChanged()), this, SLOT(handleUpdated()));
Titta Heikkala
Added possibility to show series value...
r2689 QObject::connect(series, SIGNAL(pointLabelsFormatChanged(QString)),
this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsVisibilityChanged(bool)),
this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsFontChanged(QFont)), this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsColorChanged(QColor)), this, SLOT(handleUpdated()));
Titta Heikkala
Added option to set labels clipping...
r2815 QObject::connect(series, SIGNAL(pointLabelsClippingChanged(bool)), this, SLOT(handleUpdated()));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
setZValue(ChartPresenter::ScatterSeriesZValue);
setFlags(QGraphicsItem::ItemClipsChildrenToShape);
handleUpdated();
Michal Klocek
Adds missing scatter intercation implementation...
r541 m_items.setHandlesChildEvents(false);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
QRectF ScatterChartItem::boundingRect() const
{
return m_rect;
}
void ScatterChartItem::createPoints(int count)
{
for (int i = 0; i < count; ++i) {
Michal Klocek
Release compilation fixes
r689 QGraphicsItem *item = 0;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
switch (m_shape) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case QScatterSeries::MarkerShapeCircle: {
item = new CircleMarker(0, 0, m_size, m_size, this);
Jani Honkonen
more coding style fixes for src-folder...
r2104 const QRectF &rect = item->boundingRect();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 item->setPos(-rect.width() / 2, -rect.height() / 2);
break;
Jani Honkonen
src folder: another massive victory for coding style police
r2131 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 case QScatterSeries::MarkerShapeRectangle:
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 item = new RectangleMarker(0, 0, m_size, m_size, this);
item->setPos(-m_size / 2, -m_size / 2);
break;
default:
qWarning() << "Unsupported marker type";
Michal Klocek
Refactor xychartitem -> xychart
r1218 break;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
m_items.addToGroup(item);
}
}
void ScatterChartItem::deletePoints(int count)
{
QList<QGraphicsItem *> items = m_items.childItems();
for (int i = 0; i < count; ++i) {
Jani Honkonen
more coding style fixes for src-folder...
r2104 QGraphicsItem *item = items.takeLast();
Michal Klocek
Bugfixes for scatter series...
r1763 m_markerMap.remove(item);
delete(item);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
}
Michal Klocek
Bugfixes for scatter series...
r1763 void ScatterChartItem::markerSelected(QGraphicsItem *marker)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Miikka Heikkinen
Add Polar chart support...
r2483 emit XYChart::clicked(m_markerMap[marker]);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Marek Rosa
Added hovered support to scatter series
r2261 void ScatterChartItem::markerHovered(QGraphicsItem *marker, bool state)
{
Miikka Heikkinen
Add Polar chart support...
r2483 emit XYChart::hovered(m_markerMap[marker], state);
Marek Rosa
Added hovered support to scatter series
r2261 }
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 void ScatterChartItem::markerPressed(QGraphicsItem *marker)
{
emit XYChart::pressed(m_markerMap[marker]);
}
void ScatterChartItem::markerReleased(QGraphicsItem *marker)
{
emit XYChart::released(m_markerMap[marker]);
}
void ScatterChartItem::markerDoubleClicked(QGraphicsItem *marker)
{
emit XYChart::doubleClicked(m_markerMap[marker]);
}
Michal Klocek
Refactors animation handling for xyseries
r1217 void ScatterChartItem::updateGeometry()
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 if (m_series->useOpenGL()) {
if (m_items.childItems().count())
deletePoints(m_items.childItems().count());
Miikka Heikkinen
Use empty rect for gl series instead of small dummy rect...
r2830 if (!m_rect.isEmpty()) {
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 prepareGeometryChange();
Miikka Heikkinen
Use empty rect for gl series instead of small dummy rect...
r2830 // Changed signal seems to trigger even with empty region
m_rect = QRectF();
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 }
update();
return;
}
Michal Klocek
Refactors animation handling for xyseries
r1217
const QVector<QPointF>& points = geometryPoints();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (points.size() == 0) {
Marek Rosa
XYSeries model support refactored
r1085 deletePoints(m_items.childItems().count());
Marek Rosa
Added support for adding and removing data with model. Updated the example
r545 return;
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Bugfixes for unnesery geometry changes
r869 int diff = m_items.childItems().size() - points.size();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (diff > 0)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 deletePoints(diff);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 else if (diff < 0)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 createPoints(-diff);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (diff != 0)
handleUpdated();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Jani Honkonen
more coding style fixes for src-folder...
r2104 QList<QGraphicsItem *> items = m_items.childItems();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Refactors internals...
r2273 QRectF clipRect(QPointF(0,0),domain()->size());
Titta Heikkala
Fix zooming in crash...
r2603 // Only zoom in if the clipRect fits inside int limits. QWidget::update() uses
// a region that has to be compatible with QRect.
if (clipRect.height() <= INT_MAX
&& clipRect.width() <= INT_MAX) {
QVector<bool> offGridStatus = offGridStatusVector();
const int seriesLastIndex = m_series->count() - 1;
for (int i = 0; i < points.size(); i++) {
QGraphicsItem *item = items.at(i);
const QPointF &point = points.at(i);
const QRectF &rect = item->boundingRect();
// During remove animation series may have different number of points,
// so ensure we don't go over the index. Animation handling itself ensures that
// if there is actually no points in the series, then it won't generate a fake point,
// so we can be assured there is always at least one point in m_series here.
// Note that marker map values can be technically incorrect during the animation,
// if it was caused by an insert, but this shouldn't be a problem as the points are
// fake anyway. After remove animation stops, geometry is updated to correct one.
m_markerMap[item] = m_series->at(qMin(seriesLastIndex, i));
Titta Heikkala
Add possibility to set reverse values to axes...
r2781 QPointF position;
if (seriesPrivate()->reverseXAxis())
position.setX(domain()->size().width() - point.x() - rect.width() / 2);
else
position.setX(point.x() - rect.width() / 2);
if (seriesPrivate()->reverseYAxis())
position.setY(domain()->size().height() - point.y() - rect.height() / 2);
else
position.setY(point.y() - rect.height() / 2);
item->setPos(position);
Titta Heikkala
Fix zooming in crash...
r2603
if (!m_visible || offGridStatus.at(i))
item->setVisible(false);
else
item->setVisible(true);
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Titta Heikkala
Fix zooming in crash...
r2603 prepareGeometryChange();
m_rect = clipRect;
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
void ScatterChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Tero Ahola
Squashed bunch of warnings
r611 Q_UNUSED(option)
Q_UNUSED(widget)
Titta Heikkala
Added possibility to show series value...
r2689
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 if (m_series->useOpenGL())
return;
Titta Heikkala
Added possibility to show series value...
r2689 QRectF clipRect = QRectF(QPointF(0, 0), domain()->size());
painter->save();
painter->setClipRect(clipRect);
Titta Heikkala
Fix point label position for QXYSeries...
r2696 if (m_pointLabelsVisible) {
Titta Heikkala
Added option to set labels clipping...
r2815 if (m_pointLabelsClipping)
painter->setClipping(true);
else
painter->setClipping(false);
Titta Heikkala
Fix point label position for QXYSeries...
r2696 m_series->d_func()->drawSeriesPointLabels(painter, m_points,
m_series->markerSize() / 2
+ m_series->pen().width());
}
Titta Heikkala
Added possibility to show series value...
r2689
painter->restore();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 void ScatterChartItem::setPen(const QPen &pen)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (QGraphicsItem *item , m_items.childItems())
Michal Klocek
Bugfixes for scatter series...
r1763 static_cast<QAbstractGraphicsShapeItem*>(item)->setPen(pen);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 void ScatterChartItem::setBrush(const QBrush &brush)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (QGraphicsItem *item , m_items.childItems())
Michal Klocek
Bugfixes for scatter series...
r1763 static_cast<QAbstractGraphicsShapeItem*>(item)->setBrush(brush);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
void ScatterChartItem::handleUpdated()
{
int count = m_items.childItems().count();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (count == 0)
return;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Tero Ahola
Fixed isVisible implementation in XY series
r1346 bool recreate = m_visible != m_series->isVisible()
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 || m_size != m_series->markerSize()
|| m_shape != m_series->markerShape();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Tero Ahola
Fixed isVisible implementation in XY series
r1346 m_visible = m_series->isVisible();
Tero Ahola
Scatter customization to QML api
r1276 m_size = m_series->markerSize();
m_shape = m_series->markerShape();
Tero Ahola
Added opacity property to QAbstractSeries
r2067 setOpacity(m_series->opacity());
Titta Heikkala
Added possibility to show series value...
r2689 m_pointLabelsFormat = m_series->pointLabelsFormat();
m_pointLabelsVisible = m_series->pointLabelsVisible();
m_pointLabelsFont = m_series->pointLabelsFont();
m_pointLabelsColor = m_series->pointLabelsColor();
Titta Heikkala
Added option to set labels clipping...
r2815 m_pointLabelsClipping = m_series->pointLabelsClipping();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Revert "TODOs removed from code. Undo me after release"...
r2407 if (recreate) {
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 deletePoints(count);
createPoints(count);
Tero Ahola
Scatter customization to QML api
r1276
// Updating geometry is now safe, because it won't call handleUpdated unless it creates/deletes points
updateGeometry();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
setPen(m_series->pen());
setBrush(m_series->brush());
Tero Ahola
Fixed scatter not updating on setBrush/setPen
r1305 update();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
#include "moc_scatterchartitem_p.cpp"
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_END_NAMESPACE