statistics: implement rectangle selection in scatter plot

Allow the user to select regions of the scatter plot using
a rectangular selection. When shift is pressed, do an
incremental selection.

Unfortunately, the list-selection code is so slow that this
becomes unusable for a large number of selected dives.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2021-02-01 23:17:04 +01:00 committed by Dirk Hohndel
parent e38b78b2aa
commit d63d4cd3c3
16 changed files with 207 additions and 36 deletions

View file

@ -112,23 +112,35 @@ private:
double borderWidth;
};
class ChartLineItem : public HideableChartItem<HideableQSGNode<QSGGeometryNode>> {
// Common data for line and rect items. Both are represented by two points.
class ChartLineItemBase : public HideableChartItem<HideableQSGNode<QSGGeometryNode>> {
public:
ChartLineItem(StatsView &v, ChartZValue z, QColor color, double width);
~ChartLineItem();
ChartLineItemBase(StatsView &v, ChartZValue z, QColor color, double width);
~ChartLineItemBase();
void setLine(QPointF from, QPointF to);
void render() override; // Only call on render thread!
private:
protected:
QPointF from, to;
QColor color;
double width;
bool horizontal;
bool positionDirty;
bool materialDirty;
std::unique_ptr<QSGFlatColorMaterial> material;
std::unique_ptr<QSGGeometry> geometry;
};
class ChartLineItem : public ChartLineItemBase {
public:
using ChartLineItemBase::ChartLineItemBase;
void render() override; // Only call on render thread!
};
// A simple rectangle without fill. Specified by any two opposing vertices.
class ChartRectLineItem : public ChartLineItemBase {
public:
using ChartLineItemBase::ChartLineItemBase;
void render() override; // Only call on render thread!
};
// A bar in a bar chart: a rectangle bordered by lines.
class ChartBarItem : public HideableChartProxyItem<QSGRectangleNode> {
public:
@ -185,6 +197,7 @@ public:
void render() override; // Only call on render thread!
QRectF getRect() const;
bool contains(QPointF point) const;
bool inRect(const QRectF &rect) const;
private:
QSGTexture *getTexture() const;
QRectF rect;