summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-01-14 12:33:03 +0100
committerGravatar bstoeger <32835590+bstoeger@users.noreply.github.com>2021-01-20 08:47:18 +0100
commitc74975632e4ed6a63773b893b164055e4b17920f (patch)
tree11da1489317009f04b898deff07b01e1e81ca7cb
parent218c844ad4fa3f562c375b97694025f6cdaa3ca1 (diff)
downloadsubsurface-c74975632e4ed6a63773b893b164055e4b17920f.tar.gz
statistics: draw background using a QSGRectangle node
Currently, the background was drawn as solid color onto the chart-scene. This is of course incompatible with doing the grid as QSGNodes. Therefore, make the scene image transparent and use a QSGRectangle as background color. We could also simply omit the background and show the widget's background. However, that would mean setting the background color in two seperate code paths (desktop and mobile). I found no way of directly setting the background of the QQuickItem. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--stats/statsview.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/stats/statsview.cpp b/stats/statsview.cpp
index 1e09a8cc5..29ee2d990 100644
--- a/stats/statsview.cpp
+++ b/stats/statsview.cpp
@@ -24,6 +24,7 @@
#include <QQuickItem>
#include <QQuickWindow>
#include <QSGImageNode>
+#include <QSGRectangleNode>
#include <QSGTexture>
// Constants that control the graph layouts
@@ -83,19 +84,29 @@ void StatsView::mouseReleaseEvent(QMouseEvent *)
class RootNode : public QSGNode
{
public:
- RootNode();
+ RootNode(QQuickWindow *w);
+ QSGRectangleNode *backgroundNode; // solid background
QSGImageNode *imageNode; // imageNode to plot QGRaphicsScene on. Remove in due course.
// We entertain one node per Z-level.
std::array<QSGNode *, (size_t)ChartZValue::Count> zNodes;
std::array<std::vector<ChartItem *>, (size_t)ChartZValue::Count> items;
};
-RootNode::RootNode()
+RootNode::RootNode(QQuickWindow *w)
{
+ // Add a background rectangle with a solid color. This could
+ // also be done on the widget level, but would have to be done
+ // separately for desktop and mobile, so do it here.
+ backgroundNode = w->createRectangleNode();
+ backgroundNode->setColor(backgroundColor);
+ appendChildNode(backgroundNode);
+
for (QSGNode *&zNode: zNodes) {
zNode = new QSGNode;
appendChildNode(zNode);
}
+ imageNode = w->createImageNode();
+ zNodes[(int)ChartZValue::Series]->appendChildNode(imageNode);
}
QSGNode *StatsView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
@@ -103,15 +114,13 @@ QSGNode *StatsView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNod
// The QtQuick drawing interface is utterly bizzare with a distinct 1980ies-style memory management.
// This is just a copy of what is found in Qt's documentation.
RootNode *n = static_cast<RootNode *>(oldNode);
- if (!n) {
- n = rootNode = new RootNode;
- n->imageNode = window()->createImageNode();
- n->zNodes[(int)ChartZValue::Series]->appendChildNode(n->imageNode);
- }
+ if (!n)
+ n = rootNode = new RootNode(window());
QRectF rect = boundingRect();
if (plotRect != rect) {
plotRect = rect;
+ rootNode->backgroundNode->setRect(rect);
plotAreaChanged(plotRect.size());
}
@@ -122,9 +131,9 @@ QSGNode *StatsView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNod
}
}
- img->fill(backgroundColor);
+ img->fill(Qt::transparent);
scene.render(painter.get());
- texture.reset(window()->createTextureFromImage(*img, QQuickWindow::TextureIsOpaque));
+ texture.reset(window()->createTextureFromImage(*img, QQuickWindow::TextureHasAlphaChannel));
n->imageNode->setTexture(texture.get());
n->imageNode->setRect(rect);
return n;
@@ -172,7 +181,7 @@ void StatsView::plotAreaChanged(const QSizeF &s)
int h = std::max(1, static_cast<int>(floor(s.height())));
scene.setSceneRect(QRectF(0, 0, static_cast<double>(w), static_cast<double>(h)));
painter.reset();
- img.reset(new QImage(w, h, QImage::Format_RGB32));
+ img.reset(new QImage(w, h, QImage::Format_ARGB32));
painter.reset(new QPainter(img.get()));
painter->setRenderHint(QPainter::Antialiasing);