2020-08-31 04:03:41 +08:00
|
|
|
#ifndef TRACEPLOT_H
|
|
|
|
#define TRACEPLOT_H
|
|
|
|
|
|
|
|
#include <QWidget>
|
|
|
|
#include "tracemodel.h"
|
|
|
|
#include <QMenu>
|
|
|
|
#include <QContextMenuEvent>
|
|
|
|
#include <QTime>
|
2020-11-23 05:24:49 +08:00
|
|
|
#include <QLabel>
|
2020-12-05 06:49:52 +08:00
|
|
|
#include "savable.h"
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2020-12-05 06:49:52 +08:00
|
|
|
class TracePlot : public QWidget, public Savable
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
2020-12-05 06:49:52 +08:00
|
|
|
enum class Type {
|
|
|
|
SmithChart,
|
|
|
|
XYPlot,
|
|
|
|
};
|
|
|
|
|
2020-11-06 20:05:09 +08:00
|
|
|
TracePlot(TraceModel &model, QWidget *parent = nullptr);
|
2020-08-31 04:03:41 +08:00
|
|
|
~TracePlot();
|
|
|
|
|
|
|
|
virtual void enableTrace(Trace *t, bool enabled);
|
|
|
|
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
2020-11-06 20:05:09 +08:00
|
|
|
virtual void updateSpan(double min, double max);
|
2020-12-05 06:49:52 +08:00
|
|
|
virtual Type getType() = 0;
|
2020-08-31 04:03:41 +08:00
|
|
|
|
|
|
|
static std::set<TracePlot *> getPlots();
|
|
|
|
|
|
|
|
signals:
|
|
|
|
void doubleClicked(QWidget *w);
|
|
|
|
void deleted(TracePlot*);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
static constexpr int MinUpdateInterval = 100;
|
|
|
|
// need to be called in derived class constructor
|
2020-11-06 20:05:09 +08:00
|
|
|
void initializeTraceInfo();
|
2020-08-31 04:03:41 +08:00
|
|
|
void contextMenuEvent(QContextMenuEvent *event) override;
|
2020-11-22 07:41:42 +08:00
|
|
|
void paintEvent(QPaintEvent *event) override;
|
2020-11-06 20:05:09 +08:00
|
|
|
virtual void updateContextMenu(){};
|
2020-11-22 07:41:42 +08:00
|
|
|
virtual void replot(){update();};
|
|
|
|
virtual void draw(QPainter& p) = 0;
|
2021-02-22 20:39:47 +08:00
|
|
|
virtual bool supported(Trace *t) = 0;
|
2020-08-31 04:03:41 +08:00
|
|
|
std::map<Trace*, bool> traces;
|
|
|
|
QMenu *contextmenu;
|
2021-05-15 02:34:23 +08:00
|
|
|
QPoint contextmenuClickpoint; // mouse coordinates when the contextmenu was invoked
|
2020-08-31 04:03:41 +08:00
|
|
|
QTime lastUpdate;
|
2021-05-15 02:34:23 +08:00
|
|
|
QTimer replotTimer;
|
2020-08-31 04:03:41 +08:00
|
|
|
bool markedForDeletion;
|
|
|
|
static std::set<TracePlot*> plots;
|
|
|
|
|
2020-11-23 04:25:41 +08:00
|
|
|
virtual QPoint markerToPixel(TraceMarker *m) = 0;
|
2021-05-15 02:34:23 +08:00
|
|
|
virtual double nearestTracePoint(Trace *t, QPoint pixel, double *distance = nullptr) = 0;
|
2020-11-22 21:38:52 +08:00
|
|
|
void mousePressEvent(QMouseEvent *event) override;
|
2020-11-23 05:24:49 +08:00
|
|
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
2020-11-22 21:38:52 +08:00
|
|
|
void mouseMoveEvent(QMouseEvent *event) override;
|
2020-11-23 05:24:49 +08:00
|
|
|
void leaveEvent(QEvent *event) override;
|
2020-11-22 21:38:52 +08:00
|
|
|
|
2021-04-25 21:46:34 +08:00
|
|
|
TraceMarker *markerAtPosition(QPoint p, bool onlyMovable = false);
|
|
|
|
|
2021-05-15 02:34:23 +08:00
|
|
|
void createMarkerAtPosition(QPoint p);
|
|
|
|
|
2020-11-22 07:41:42 +08:00
|
|
|
// handle trace drops
|
2021-02-22 20:39:47 +08:00
|
|
|
virtual bool dropSupported(Trace *t) = 0;
|
2020-11-22 07:41:42 +08:00
|
|
|
void dragEnterEvent(QDragEnterEvent *event) override;
|
|
|
|
void dropEvent(QDropEvent *event) override;
|
2020-11-22 21:38:52 +08:00
|
|
|
void dragLeaveEvent(QDragLeaveEvent *event) override;
|
|
|
|
virtual void traceDropped(Trace *t, QPoint position){ Q_UNUSED(t) Q_UNUSED(position)};
|
2020-11-23 05:24:49 +08:00
|
|
|
virtual QString mouseText(QPoint pos) {Q_UNUSED(pos) return QString();};
|
2020-11-22 07:41:42 +08:00
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
protected slots:
|
|
|
|
void newTraceAvailable(Trace *t);
|
|
|
|
void traceDeleted(Trace *t);
|
|
|
|
void triggerReplot();
|
2020-11-29 05:34:40 +08:00
|
|
|
void checkIfStillSupported(Trace *t);
|
2020-08-31 04:03:41 +08:00
|
|
|
virtual void markerAdded(TraceMarker *m);
|
|
|
|
virtual void markerRemoved(TraceMarker *m);
|
2021-05-14 22:18:43 +08:00
|
|
|
virtual bool xCoordinateVisible(double x) = 0;
|
2020-11-06 20:05:09 +08:00
|
|
|
protected:
|
2020-11-22 07:41:42 +08:00
|
|
|
static constexpr unsigned int marginTop = 20;
|
|
|
|
static constexpr unsigned int marginBottom = 0;
|
|
|
|
static constexpr unsigned int marginLeft = 0;
|
|
|
|
static constexpr unsigned int marginRight = 0;
|
2021-05-14 22:18:43 +08:00
|
|
|
|
|
|
|
static constexpr unsigned int marginMarkerData = 150;
|
|
|
|
|
2020-11-06 20:05:09 +08:00
|
|
|
double sweep_fmin, sweep_fmax;
|
|
|
|
TraceModel &model;
|
2020-11-22 21:38:52 +08:00
|
|
|
TraceMarker *selectedMarker;
|
|
|
|
|
|
|
|
bool dropPending;
|
|
|
|
QPoint dropPosition;
|
|
|
|
Trace *dropTrace;
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2020-11-23 05:24:49 +08:00
|
|
|
QLabel *cursorLabel;
|
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // TRACEPLOT_H
|