#pragma once #include #include #include #include #include #include #include #include #include #include #include #include "tools/cabana/dbcmanager.h" #include "tools/cabana/streams/abstractstream.h" using namespace QtCharts; class ChartView : public QChartView { Q_OBJECT public: ChartView(QWidget *parent = nullptr); void addSeries(const QString &msg_id, const Signal *sig); void addSeries(const QList &series_list); void removeSeries(const QString &msg_id, const Signal *sig); bool hasSeries(const QString &msg_id, const Signal *sig) const; void updateSeries(const Signal *sig = nullptr, const std::vector *events = nullptr, bool clear = true); void updatePlot(double cur, double min, double max); void setPlotAreaLeftPosition(int pos); qreal getYAsixLabelWidth() const; struct SigItem { QString msg_id; uint8_t source = 0; uint32_t address = 0; const Signal *sig = nullptr; QLineSeries *series = nullptr; QVector vals; uint64_t last_value_mono_time = 0; }; signals: void seriesRemoved(const QString &id, const Signal *sig); void seriesAdded(const QString &id, const Signal *sig); void zoomIn(double min, double max); void zoomReset(); void remove(); void axisYUpdated(); private slots: void msgRemoved(uint32_t address); void msgUpdated(uint32_t address); void signalUpdated(const Signal *sig); void signalRemoved(const Signal *sig); void manageSeries(); private: QList::iterator removeSeries(const QList::iterator &it); void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *ev) override; void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; void leaveEvent(QEvent *event) override; void resizeEvent(QResizeEvent *event) override; void updateAxisY(); void updateTitle(); void drawForeground(QPainter *painter, const QRectF &rect) override; void applyNiceNumbers(qreal min, qreal max); qreal niceNumber(qreal x, bool ceiling); QValueAxis *axis_x; QValueAxis *axis_y; QPointF track_pt; QGraphicsProxyWidget *close_btn_proxy; QGraphicsProxyWidget *manage_btn_proxy; QList sigs; double cur_sec = 0; const QString mime_type = "application/x-cabanachartview"; }; class ChartsWidget : public QWidget { Q_OBJECT public: ChartsWidget(QWidget *parent = nullptr); void showChart(const QString &id, const Signal *sig, bool show, bool merge); inline bool hasSignal(const QString &id, const Signal *sig) { return findChart(id, sig) != nullptr; } public slots: void setColumnCount(int n); signals: void dock(bool floating); void rangeChanged(double min, double max, bool is_zommed); void seriesChanged(); private: void resizeEvent(QResizeEvent *event) override; void alignCharts(); void newChart(); ChartView * createChart(); void removeChart(ChartView *chart); void eventsMerged(); void updateState(); void zoomIn(double min, double max); void zoomReset(); void updateToolBar(); void removeAll(); void setMaxChartRange(int value); void updateLayout(); void settingChanged(); bool eventFilter(QObject *obj, QEvent *event) override; ChartView *findChart(const QString &id, const Signal *sig); QLabel *title_label; QLabel *range_lb; QSlider *range_slider; bool docking = true; QAction *dock_btn; QAction *reset_zoom_btn; QAction *remove_all_btn; QTimer *align_charts_timer; QGridLayout *charts_layout; QList charts; uint32_t max_chart_range = 0; bool is_zoomed = false; std::pair display_range; std::pair zoomed_range; bool use_dark_theme = false; QAction *columns_lb_action; QAction *columns_cb_action; QComboBox *columns_cb; int column_count = 1; const int CHART_MIN_WIDTH = 300; }; class SeriesSelector : public QDialog { Q_OBJECT public: SeriesSelector(QWidget *parent); void addSeries(const QString &id, const QString& msg_name, const QString &sig_name); QList series(); private slots: void msgSelected(int index); void addSignal(QListWidgetItem *item); private: QComboBox *msgs_combo; QListWidget *sig_list; QListWidget *chart_series; };