summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLukas Kosinski <lukasz@scythe-studio.com>2021-06-02 20:19:57 +0200
committerLukas Kosinski <lukasz@scythe-studio.com>2021-06-04 10:48:18 +0200
commitb69841fb16dd107454f7eead9e6e7b3db9ed4a2e (patch)
treead619784be8511bcb55286fcc877d370f8bbd145 /src
parent874052ad94c8bc95347c7cbde561094573e1d595 (diff)
Support for custom light markers for selected points added to QXYSeries
Light markers and normal points are rather not used together, so selectedLightMarker feature was added to QXYSeries to highlight selected points using custom QImage. Task-number: QTBUG-89445 Change-Id: I199a0fe21e486240c2674ec042307ecd64aa3a35 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/charts/linechart/linechartitem.cpp13
-rw-r--r--src/charts/scatterchart/scatterchartitem.cpp34
-rw-r--r--src/charts/splinechart/splinechartitem.cpp39
-rw-r--r--src/charts/splinechart/splinechartitem_p.h1
-rw-r--r--src/charts/xychart/qxyseries.cpp39
-rw-r--r--src/charts/xychart/qxyseries.h6
-rw-r--r--src/charts/xychart/qxyseries_p.h1
7 files changed, 118 insertions, 15 deletions
diff --git a/src/charts/linechart/linechartitem.cpp b/src/charts/linechart/linechartitem.cpp
index 7ed70b72..c2c3c694 100644
--- a/src/charts/linechart/linechartitem.cpp
+++ b/src/charts/linechart/linechartitem.cpp
@@ -452,6 +452,7 @@ void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
// Draw markers if a marker has been set (set to QImage() to disable)
if (!m_series->lightMarker().isNull()) {
const QImage &marker = m_series->lightMarker();
+ const QImage &selectedMarker = m_series->selectedLightMarker();
qreal markerHalfSize = m_markerSize / 2.0;
pointLabelsOffset = markerHalfSize;
@@ -470,11 +471,16 @@ void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
}
}
+ bool drawSelectedPoint = false;
+ if (m_series->isPointSelected(i)) {
+ drawPoint = true;
+ drawSelectedPoint = !selectedMarker.isNull();
+ }
if (drawPoint) {
const QRectF rect(m_linePoints[i].x() - markerHalfSize,
m_linePoints[i].y() - markerHalfSize,
m_markerSize, m_markerSize);
- painter->drawImage(rect, marker);
+ painter->drawImage(rect, drawSelectedPoint ? selectedMarker : marker);
}
}
}
@@ -519,6 +525,11 @@ void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
}
if (m_series->isPointSelected(i)) {
+ // Selected points are drawn regardless of m_pointsVisible settings and
+ // custom point configuration. However, they are not drawn if light markers
+ // are used. The reason of this is to avoid displaying selected point
+ // over selected light marker.
+ drawPoint = m_series->selectedLightMarker().isNull();
ptSize = ptSize * 1.5;
if (m_selectedColor.isValid())
painter->setBrush(m_selectedColor);
diff --git a/src/charts/scatterchart/scatterchartitem.cpp b/src/charts/scatterchart/scatterchartitem.cpp
index d178a575..3c9c8cfb 100644
--- a/src/charts/scatterchart/scatterchartitem.cpp
+++ b/src/charts/scatterchart/scatterchartitem.cpp
@@ -318,13 +318,35 @@ void ScatterChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *
// Draw markers if a marker has been set (set to QImage() to disable)
if (!m_series->lightMarker().isNull()) {
const QImage &marker = m_series->lightMarker();
- qreal markerHalfSize = m_markerSize / 2.;
+ const QImage &selectedMarker = m_series->selectedLightMarker();
+ qreal markerHalfSize = m_markerSize / 2.0;
+
+ for (int i = 0; i < m_points.size(); ++i) {
+ // Documentation of light markers says that points visibility and
+ // light markers are independent features. Therefore m_pointsVisible
+ // is not used here as light markers are drawn if lightMarker is not null.
+ // However points visibility configuration can be still used here.
+ bool drawPoint = true;
+ if (m_pointsConfiguration.contains(i)) {
+ const auto &conf = m_pointsConfiguration[i];
+
+ if (conf.contains(QXYSeries::PointConfiguration::Visibility)) {
+ drawPoint = m_pointsConfiguration[i][QXYSeries::PointConfiguration::Visibility]
+ .toBool();
+ }
+ }
- for (const auto &point : qAsConst(m_points)) {
- const QRectF rect(point.x() - markerHalfSize,
- point.y() - markerHalfSize,
- m_markerSize, m_markerSize);
- painter->drawImage(rect, marker);
+ bool drawSelectedPoint = false;
+ if (m_series->isPointSelected(i)) {
+ drawPoint = true;
+ drawSelectedPoint = !selectedMarker.isNull();
+ }
+ if (drawPoint) {
+ const QRectF rect(m_points[i].x() - markerHalfSize,
+ m_points[i].y() - markerHalfSize,
+ m_markerSize, m_markerSize);
+ painter->drawImage(rect, drawSelectedPoint ? selectedMarker : marker);
+ }
}
}
diff --git a/src/charts/splinechart/splinechartitem.cpp b/src/charts/splinechart/splinechartitem.cpp
index 65241762..7e0601e4 100644
--- a/src/charts/splinechart/splinechartitem.cpp
+++ b/src/charts/splinechart/splinechartitem.cpp
@@ -43,6 +43,7 @@ SplineChartItem::SplineChartItem(QSplineSeries *series, QGraphicsItem *item)
m_pointsVisible(false),
m_animation(0),
m_pointLabelsVisible(false),
+ m_markerSize(series->markerSize()),
m_pointLabelsFormat(series->pointLabelsFormat()),
m_pointLabelsFont(series->pointLabelsFont()),
m_pointLabelsColor(series->pointLabelsColor()),
@@ -68,6 +69,8 @@ SplineChartItem::SplineChartItem(QSplineSeries *series, QGraphicsItem *item)
this, &SplineChartItem::handleSeriesUpdated);
connect(series, &QXYSeries::pointLabelsClippingChanged,
this, &SplineChartItem::handleSeriesUpdated);
+ connect(series, &QLineSeries::selectedPointsChanged,
+ this, &SplineChartItem::handleSeriesUpdated);
handleSeriesUpdated();
}
@@ -446,6 +449,7 @@ void SplineChartItem::handleSeriesUpdated()
m_pointPen.setWidthF(2 * m_pointPen.width());
m_pointLabelsFormat = m_series->pointLabelsFormat();
m_pointLabelsVisible = m_series->pointLabelsVisible();
+ m_markerSize = m_series->markerSize();
m_pointLabelsFont = m_series->pointLabelsFont();
m_pointLabelsColor = m_series->pointLabelsColor();
bool labelClippingChanged = m_pointLabelsClipping != m_series->pointLabelsClipping();
@@ -504,15 +508,36 @@ void SplineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *o
// Draw markers if a marker has been set (set to QImage() to disable)
if (!m_series->lightMarker().isNull()) {
const QImage &marker = m_series->lightMarker();
- qreal markerSize = m_series->markerSize();
- qreal markerHalfSize = m_series->markerSize() / 2.0;
+ const QImage &selectedMarker = m_series->selectedLightMarker();
+ qreal markerHalfSize = m_markerSize / 2.0;
pointLabelsOffset = markerHalfSize;
- for (const auto &point : qAsConst(m_points)) {
- const QRectF rect(point.x() - markerHalfSize,
- point.y() - markerHalfSize,
- markerSize, markerSize);
- painter->drawImage(rect, marker);
+ for (int i = 0; i < m_points.size(); ++i) {
+ // Documentation of light markers says that points visibility and
+ // light markers are independent features. Therefore m_pointsVisible
+ // is not used here as light markers are drawn if lightMarker is not null.
+ // However points visibility configuration can be still used here.
+ bool drawPoint = true;
+ if (m_pointsConfiguration.contains(i)) {
+ const auto &conf = m_pointsConfiguration[i];
+
+ if (conf.contains(QXYSeries::PointConfiguration::Visibility)) {
+ drawPoint = m_pointsConfiguration[i][QXYSeries::PointConfiguration::Visibility]
+ .toBool();
+ }
+ }
+
+ bool drawSelectedPoint = false;
+ if (m_series->isPointSelected(i)) {
+ drawPoint = true;
+ drawSelectedPoint = !selectedMarker.isNull();
+ }
+ if (drawPoint) {
+ const QRectF rect(m_points[i].x() - markerHalfSize,
+ m_points[i].y() - markerHalfSize,
+ m_markerSize, m_markerSize);
+ painter->drawImage(rect, drawSelectedPoint ? selectedMarker : marker);
+ }
}
}
diff --git a/src/charts/splinechart/splinechartitem_p.h b/src/charts/splinechart/splinechartitem_p.h
index f1ab28ea..85667942 100644
--- a/src/charts/splinechart/splinechartitem_p.h
+++ b/src/charts/splinechart/splinechartitem_p.h
@@ -94,6 +94,7 @@ private:
SplineAnimation *m_animation;
bool m_pointLabelsVisible;
+ qreal m_markerSize;
QString m_pointLabelsFormat;
QFont m_pointLabelsFont;
QColor m_pointLabelsColor;
diff --git a/src/charts/xychart/qxyseries.cpp b/src/charts/xychart/qxyseries.cpp
index baadf2eb..9c30b1e4 100644
--- a/src/charts/xychart/qxyseries.cpp
+++ b/src/charts/xychart/qxyseries.cpp
@@ -1583,6 +1583,45 @@ const QImage &QXYSeries::lightMarker() const
}
/*!
+ Sets the image used for drawing markers on selected series's points to \a selectedLightMarker.
+
+ The default value is QImage(), meaning usual QXYSeries::lightMarker() will be painted.
+
+ This is an equivalent for QXYSeries::setSelectedColor() if you prefer light markers over
+ normal points, but you still want to distinguish selected points.
+
+ \sa QXYSeries::lightMarker(), QXYSeries::selectedColor(), QXYSeries::setPointSelected()
+ \since 6.2
+*/
+void QXYSeries::setSelectedLightMarker(const QImage &selectedLightMarker)
+{
+ Q_D(QXYSeries);
+ if (d->m_selectedLightMarker == selectedLightMarker)
+ return;
+
+ d->m_selectedLightMarker = selectedLightMarker;
+ emit d->seriesUpdated();
+ emit selectedLightMarkerChanged(d->m_selectedLightMarker);
+}
+
+/*!
+ Returns the image used for drawing markers on selected series's points.
+
+ The default value is QImage(), meaning usual QXYSeries::lightMarker() will be painted.
+
+ This is an equivalent for QXYSeries::selectedColor() if you prefer light markers over
+ normal points, but you still want to distinguish selected points.
+
+ \sa QXYSeries::lightMarker(), QXYSeries::selectedColor(), QXYSeries::setPointSelected()
+ \since 6.2
+*/
+const QImage &QXYSeries::selectedLightMarker() const
+{
+ Q_D(const QXYSeries);
+ return d->m_selectedLightMarker;
+}
+
+/*!
Sets the size of the marker used to render points in the series.
The default size is 15.0.
diff --git a/src/charts/xychart/qxyseries.h b/src/charts/xychart/qxyseries.h
index 498f69a2..9aeb6d8d 100644
--- a/src/charts/xychart/qxyseries.h
+++ b/src/charts/xychart/qxyseries.h
@@ -144,6 +144,9 @@ public:
void setLightMarker(const QImage &lightMarker);
const QImage &lightMarker() const;
+ void setSelectedLightMarker(const QImage &selectedLightMarker);
+ const QImage &selectedLightMarker() const;
+
void setMarkerSize(qreal size);
qreal markerSize() const;
@@ -192,7 +195,8 @@ Q_SIGNALS:
void pointsRemoved(int index, int count);
void penChanged(const QPen &pen);
void selectedPointsChanged();
- void lightMarkerChanged(const QImage &lightMarker);
+ Q_REVISION(6, 2) void lightMarkerChanged(const QImage &lightMarker);
+ Q_REVISION(6, 2) void selectedLightMarkerChanged(const QImage &selectedLightMarker);
Q_REVISION(6, 2) void bestFitLineVisibilityChanged(bool visible);
Q_REVISION(6, 2) void bestFitLinePenChanged(const QPen &pen);
Q_REVISION(6, 2) void bestFitLineColorChanged(const QColor &color);
diff --git a/src/charts/xychart/qxyseries_p.h b/src/charts/xychart/qxyseries_p.h
index 4c4440b7..8a92ce1c 100644
--- a/src/charts/xychart/qxyseries_p.h
+++ b/src/charts/xychart/qxyseries_p.h
@@ -96,6 +96,7 @@ protected:
QColor m_pointLabelsColor;
bool m_pointLabelsClipping;
QImage m_lightMarker;
+ QImage m_selectedLightMarker;
QPen m_bestFitLinePen;
bool m_bestFitLineVisible;
qreal m_markerSize;