LibreVNA/Software/PC_Application/Traces/traceplot.h

114 lines
3.4 KiB
C
Raw Normal View History

#ifndef TRACEPLOT_H
#define TRACEPLOT_H
#include "tracemodel.h"
2021-10-21 19:00:34 +08:00
#include "savable.h"
#include <QMenu>
#include <QContextMenuEvent>
#include <QTime>
2020-11-23 05:24:49 +08:00
#include <QLabel>
2021-10-21 19:00:34 +08:00
#include <QWidget>
2020-12-05 06:49:52 +08:00
class TracePlot : public QWidget, public Savable
{
Q_OBJECT
public:
2020-12-05 06:49:52 +08:00
enum class Type {
SmithChart,
XYPlot,
2022-03-15 23:59:52 +08:00
Waterfall,
2020-12-05 06:49:52 +08:00
};
TracePlot(TraceModel &model, QWidget *parent = nullptr);
~TracePlot();
virtual void enableTrace(Trace *t, bool enabled);
void mouseDoubleClickEvent(QMouseEvent *event) override;
virtual void updateSpan(double min, double max);
2020-12-05 06:49:52 +08:00
virtual Type getType() = 0;
static std::set<TracePlot *> getPlots();
TraceModel &getModel() const;
public slots:
void updateGraphColors();
signals:
void doubleClicked(QWidget *w);
void deleted(TracePlot*);
protected:
static constexpr int MinUpdateInterval = 100;
// need to be called in derived class constructor
void initializeTraceInfo();
std::vector<Trace*> activeTraces();
// changes the graph settings to make it possible to display a specific trace. The trace is not aded yet
virtual bool configureForTrace(Trace *t) { Q_UNUSED(t) return false; }; // default implementation fails for all traces
void contextMenuEvent(QContextMenuEvent *event) override;
void paintEvent(QPaintEvent *event) override;
virtual void updateContextMenu(){};
virtual void replot(){update();};
virtual void draw(QPainter& p) = 0;
virtual bool supported(Trace *t) = 0;
std::map<Trace*, bool> traces;
QMenu *contextmenu;
2021-05-15 02:34:23 +08:00
QPoint contextmenuClickpoint; // mouse coordinates when the contextmenu was invoked
QTime lastUpdate;
2021-05-15 02:34:23 +08:00
QTimer replotTimer;
bool markedForDeletion;
static std::set<TracePlot*> plots;
virtual QPoint markerToPixel(Marker *m) = 0;
2021-05-15 02:34:23 +08:00
virtual double nearestTracePoint(Trace *t, QPoint pixel, double *distance = nullptr) = 0;
void mousePressEvent(QMouseEvent *event) override;
2020-11-23 05:24:49 +08:00
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
2020-11-23 05:24:49 +08:00
void leaveEvent(QEvent *event) override;
Marker *markerAtPosition(QPoint p, bool onlyMovable = false);
2021-05-15 02:34:23 +08:00
void createMarkerAtPosition(QPoint p);
// handle trace drops
2022-03-15 23:59:52 +08:00
virtual bool dropSupported(Trace *t);
void dragEnterEvent(QDragEnterEvent *event) override;
void dropEvent(QDropEvent *event) override;
void dragLeaveEvent(QDragLeaveEvent *event) override;
2022-03-15 23:59:52 +08:00
virtual void traceDropped(Trace *t, QPoint position);
2020-11-23 05:24:49 +08:00
virtual QString mouseText(QPoint pos) {Q_UNUSED(pos) return QString();};
protected slots:
void newTraceAvailable(Trace *t);
void traceDeleted(Trace *t);
void triggerReplot();
2020-11-29 05:34:40 +08:00
void checkIfStillSupported(Trace *t);
virtual void markerAdded(Marker *m);
virtual void markerRemoved(Marker *m);
2022-03-16 21:45:59 +08:00
virtual bool markerVisible(double x) = 0;
protected:
static constexpr unsigned int marginTop = 20;
static constexpr unsigned int marginBottom = 0;
static constexpr unsigned int marginLeft = 0;
static constexpr unsigned int marginRight = 0;
static constexpr unsigned int marginMarkerData = 150;
double sweep_fmin, sweep_fmax;
TraceModel &model;
Marker *selectedMarker;
// graph settings have been changed, check and possibly remove incompatible traces before next paint event
bool traceRemovalPending;
bool dropPending;
QPoint dropPosition;
Trace *dropTrace;
2020-11-23 05:24:49 +08:00
QLabel *cursorLabel;
};
#endif // TRACEPLOT_H