DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
QDynExpLineGraph.h
Go to the documentation of this file.
1// This file is part of DynExp.
2
8#pragma once
9
10#include <qqml.h>
11#include <QtGraphs/QBarCategoryAxis>
12#include <QtGraphs/QBarSet>
13#include <QtGraphs/QBarSeries>
14#include <QtGraphs/QLineSeries>
15#include <QtGraphs/QValueAxis>
16
17#include "../Modules/GraphUtil.h"
18
19namespace DynExpQuick
20{
22 {
24
25 QString Name;
26 bool Visible = true;
27
28 std::shared_ptr<QBarSeries> BarSeries;
29 std::shared_ptr<QLineSeries> LineSeries;
30
31 QBarSet* BarSet;
32 };
33
34 class DynExpLineGraphPlotModel : public QAbstractListModel
35 {
36 Q_OBJECT
37
38 public:
39 enum Roles { NameRole = Qt::UserRole + 1, VisibleRole, NumSamplesRole, ColorRole };
40
41 DynExpLineGraphPlotModel(QObject* Parent = nullptr) : QAbstractListModel(Parent) {}
43
44 size_t InsertSeries(QString Name, QColor Color);
45 void RemoveSeries(size_t Index);
46 size_t GetNumSeries() const noexcept { return PlotSeries.size(); }
47 QStringList GetSeriesNames() const;
48
49 size_t GetIndex(QString Name) const;
50 const DynExpLineGraphPlotSeries& GetSeries(size_t Index) const;
52
53 bool IsAnyLineSeriesVisible() const;
54
55 void SeriesChanged(size_t Index);
56
57 private:
58 QHash<int, QByteArray> roleNames() const override;
59 Qt::ItemFlags flags(const QModelIndex&) const override;
60 int rowCount(const QModelIndex&) const override;
61
62 QVariant data(const QModelIndex& index, int role) const override;
63 bool setData(const QModelIndex& index, const QVariant& value, int role) override;
64
65 std::vector<DynExpLineGraphPlotSeries> PlotSeries;
66 };
67
68 class DynExpLineGraphBackend : public QObject
69 {
70 Q_OBJECT
71 QML_ELEMENT
72
75 Q_PROPERTY(QPointF HoveredPoint READ GetHoveredPoint NOTIFY qhoveredPointChanged)
77 Q_PROPERTY(QBarCategoryAxis* XCategoryAxis READ GetXCategoryAxis CONSTANT)
78 Q_PROPERTY(QValueAxis* XValueAxis READ GetXValueAxis CONSTANT)
79 Q_PROPERTY(QValueAxis* YValueAxis READ GetYValueAxis CONSTANT)
80
81 public:
82 DynExpLineGraphBackend(QObject* parent = nullptr);
84
85 auto GetPlotModel() const noexcept { return &PlotModel; }
86 auto GetPlotModel() noexcept { return &PlotModel; }
87 QPointF GetCursorPosition() const noexcept { return CursorPosition; }
88 void SetCursorPosition(QPointF CursorPosition) noexcept;
89 QPointF GetHoveredPoint() const noexcept { return HoveredPoint; }
90 void SetHoveredPoint(QPointF HoveredPoint) noexcept;
91 QPointF GetHoveredSample() const noexcept { return HoveredSample; }
92 void SetHoveredSample(QPointF HoveredSample) noexcept;
93
94 const auto* GetXCategoryAxis() const noexcept { return XCategoryAxis.get(); }
95 auto* GetXCategoryAxis() noexcept { return XCategoryAxis.get(); }
96 const auto* GetXValueAxis() const noexcept { return XValueAxis.get(); }
97 auto* GetXValueAxis() noexcept { return XValueAxis.get(); }
98 const auto* GetYValueAxis() const noexcept { return YValueAxis.get(); }
99 auto* GetYValueAxis() noexcept { return YValueAxis.get(); }
100
101 void InsertSeries(QString Name, QColor Color = {});
102 void RemoveSeries(QString Name);
103 const DynExpLineGraphPlotSeries& UpdateSeries(size_t Index, const QList<QPointF>& Samples,
104 const DynExpModule::Graph::LineGraphPlotInfo& PlotInfo, bool UpdateSamples = true);
105 size_t GetNumSeries() const noexcept { return static_cast<size_t>(PlotModel.GetNumSeries()); }
106 const auto& GetSeries(size_t Index) const { return PlotModel.GetSeries(Index); }
107 auto& GetSeries(size_t Index) { return PlotModel.GetSeries(Index); }
108
109 void SeriesChanged(size_t Index) { PlotModel.SeriesChanged(Index); }
110
112 bool Autoscale = true, bool UpdateAxes = true);
113
114 signals:
115 void onSampleClicked(QPointF);
116
117 // to QML
118 void qinsertSeries(QBarSeries*, QLineSeries*);
119 void qremoveSeries(QBarSeries*, QLineSeries*);
120 void qdataChanged(bool);
122 void qhoveredPointChanged(QPointF);
124
125 private:
127 QPointF CursorPosition;
128 QPointF HoveredPoint;
129 QPointF HoveredSample;
130
131 const std::unique_ptr<QBarCategoryAxis> XCategoryAxis;
132 const std::unique_ptr<QValueAxis> XValueAxis;
133 const std::unique_ptr<QValueAxis> YValueAxis;
134 };
135}
const DynExpLineGraphPlotSeries & UpdateSeries(size_t Index, const QList< QPointF > &Samples, const DynExpModule::Graph::LineGraphPlotInfo &PlotInfo, bool UpdateSamples=true)
const auto * GetXCategoryAxis() const noexcept
const std::unique_ptr< QBarCategoryAxis > XCategoryAxis
QPointF GetHoveredPoint() const noexcept
void UpdateData(DynExpModule::Graph::LineGraphPlotInfo &PlotInfo, bool Autoscale=true, bool UpdateAxes=true)
QML_ELEMENTDynExpLineGraphPlotModel * PlotModel
QPointF GetHoveredSample() const noexcept
const auto * GetYValueAxis() const noexcept
QPointF GetCursorPosition() const noexcept
const std::unique_ptr< QValueAxis > YValueAxis
void SetHoveredPoint(QPointF HoveredPoint) noexcept
void SetHoveredSample(QPointF HoveredSample) noexcept
const auto * GetXValueAxis() const noexcept
void qremoveSeries(QBarSeries *, QLineSeries *)
void SetCursorPosition(QPointF CursorPosition) noexcept
void qinsertSeries(QBarSeries *, QLineSeries *)
void InsertSeries(QString Name, QColor Color={})
const std::unique_ptr< QValueAxis > XValueAxis
const auto & GetSeries(size_t Index) const
const DynExpLineGraphPlotSeries & GetSeries(size_t Index) const
DynExpLineGraphPlotModel(QObject *Parent=nullptr)
std::vector< DynExpLineGraphPlotSeries > PlotSeries
QHash< int, QByteArray > roleNames() const override
Qt::ItemFlags flags(const QModelIndex &) const override
size_t InsertSeries(QString Name, QColor Color)
QVariant data(const QModelIndex &index, int role) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
int rowCount(const QModelIndex &) const override
std::shared_ptr< QLineSeries > LineSeries
std::shared_ptr< QBarSeries > BarSeries