statistics: draw legend as a QSGNode

In order not to waste CPU by constantly rerendering the chart,
we must use these weird OpenGL QSGNode things. The interface
is appallingly low-level and unfriendly.

As a first test, try to convert the legend. Create a wrapper
class that represents a rectangular item with a texture
and that will certainly need some (lots of) optimization.

Make sure that all low-level QSG-objects are only accessed
in the rendering thread. This means that the wrapper has
to maintain a notion of "dirtiness" of the state. I.e.
which part of the QSG-objects have to be modified.

From the low-level wrapper derive a class that draws a rounded
rectangle for every resize. The child class of that must then
paint on the rectangle after every resize.

That looks all not very fortunate, but it displays a
legend and will make it possible to move the legend
without and drawing operations, only shifting around
an OpenGL surface.

The render thread goes through all chart-items and
rerenders them if dirty. Currently, on deletion
of these items, this list is not reset. I.e. currently
it is not supported to remove individual items.
Only the full scene can be cleared!

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2021-01-12 15:20:05 +01:00 committed by bstoeger
parent 9be23b5f3f
commit 2b961414d7
8 changed files with 284 additions and 91 deletions

View file

@ -3,34 +3,34 @@
#ifndef STATS_LEGEND_H
#define STATS_LEGEND_H
#include "backend-shared/roundrectitem.h"
#include "chartitem.h"
#include <memory>
#include <vector>
#include <QFont>
class QGraphicsScene;
class QGraphicsSceneMouseEvent;
class QFontMetrics;
class Legend : public RoundRectItem {
class Legend : public ChartRectItem {
public:
Legend(const std::vector<QString> &names);
Legend(StatsView &view, const std::vector<QString> &names);
void hover(QPointF pos);
void resize(); // called when the chart size changes.
private:
// Each entry is a text besides a rectangle showing the color
struct Entry {
std::unique_ptr<QGraphicsRectItem> rect;
std::unique_ptr<QGraphicsSimpleTextItem> text;
QString name;
QBrush rectBrush;
QPointF pos;
double width;
Entry(const QString &name, int idx, int numBins, QGraphicsItem *parent);
Entry(const QString &name, int idx, int numBins, const QFontMetrics &fm);
};
int displayedItems;
double width;
double height;
QFont font;
int fontHeight;
std::vector<Entry> entries;
void updatePosition();
void hide();
};