#pragma once #include #include #include #include #include #include #include #include #include #include "tools/cabana/canmessages.h" #include "tools/cabana/dbcmanager.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 removeSeries(const QString &msg_id, const Signal *sig); bool hasSeries(const QString &msg_id, const Signal *sig) const; void updateSeries(const Signal *sig = nullptr); void setEventsRange(const std::pair &range); void setDisplayRange(double min, double max); struct SigItem { QString msg_id; uint8_t source = 0; uint32_t address = 0; const Signal *sig = nullptr; QLineSeries *series = nullptr; double min_y = 0; double max_y = 0; QVector vals; }; 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(); 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 mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *ev) override; void leaveEvent(QEvent *event) override; void resizeEvent(QResizeEvent *event) override; void adjustChartMargins(); void updateAxisY(); void updateTitle(); void updateFromSettings(); 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; std::pair events_range = {0, 0}; QList sigs; }; 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; } signals: void dock(bool floating); void rangeChanged(double min, double max, bool is_zommed); void seriesChanged(); private: void removeChart(ChartView *chart); void eventsMerged(); void updateState(); void updateDisplayRange(); void zoomIn(double min, double max); void zoomReset(); void updateToolBar(); void removeAll(); void showAllData(); bool eventFilter(QObject *obj, QEvent *event) override; ChartView *findChart(const QString &id, const Signal *sig); QLabel *title_label; QLabel *range_label; bool docking = true; QAction *show_all_values_btn; QAction *dock_btn; QAction *reset_zoom_btn; QAction *remove_all_btn; QVBoxLayout *charts_layout; QList charts; uint32_t max_chart_range = 0; bool is_zoomed = false; std::pair event_range; std::pair display_range; std::pair zoomed_range; bool use_dark_theme = false; }; 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; };