#pragma once #include #include #include #include #include #include #include #include #include #include "tools/cabana/chart/signalselector.h" #include "tools/cabana/dbc/dbcmanager.h" #include "tools/cabana/streams/abstractstream.h" const int CHART_MIN_WIDTH = 300; const QString CHART_MIME_TYPE = "application/x-cabanachartview"; class ChartView; class ChartsWidget; class ChartsContainer : public QWidget { public: ChartsContainer(ChartsWidget *parent); void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override { drawDropIndicator({}); } void drawDropIndicator(const QPoint &pt) { drop_indictor_pos = pt; update(); } void paintEvent(QPaintEvent *ev) override; ChartView *getDropAfter(const QPoint &pos) const; QGridLayout *charts_layout; ChartsWidget *charts_widget; QPoint drop_indictor_pos; }; class ChartsWidget : public QFrame { Q_OBJECT public: ChartsWidget(QWidget *parent = nullptr); void showChart(const MessageId &id, const cabana::Signal *sig, bool show, bool merge); inline bool hasSignal(const MessageId &id, const cabana::Signal *sig) { return findChart(id, sig) != nullptr; } public slots: void setColumnCount(int n); void removeAll(); void timeRangeChanged(const std::optional> &time_range); void setIsDocked(bool dock); signals: void toggleChartsDocking(); void seriesChanged(); void showTip(double seconds); private: QSize minimumSizeHint() const override; bool event(QEvent *event) override; void alignCharts(); void newChart(); ChartView *createChart(int pos = 0); void removeChart(ChartView *chart); void splitChart(ChartView *chart); QRect chartVisibleRect(ChartView *chart); void eventsMerged(const MessageEventsMap &new_events); void updateState(); void zoomReset(); void startAutoScroll(); void stopAutoScroll(); void doAutoScroll(); void updateToolBar(); void updateTabBar(); void setMaxChartRange(int value); void updateLayout(bool force = false); void settingChanged(); void showValueTip(double sec); bool eventFilter(QObject *obj, QEvent *event) override; void newTab(); void removeTab(int index); inline QList ¤tCharts() { return tab_charts[tabbar->tabData(tabbar->currentIndex()).toInt()]; } ChartView *findChart(const MessageId &id, const cabana::Signal *sig); QLabel *title_label; QLabel *range_lb; LogSlider *range_slider; QAction *range_lb_action; QAction *range_slider_action; bool is_docked = true; ToolButton *dock_btn; QToolBar *toolbar; QAction *undo_zoom_action; QAction *redo_zoom_action; QAction *reset_zoom_action; ToolButton *reset_zoom_btn; QUndoStack *zoom_undo_stack; ToolButton *remove_all_btn; QList charts; std::unordered_map> tab_charts; TabBar *tabbar; ChartsContainer *charts_container; QScrollArea *charts_scroll; uint32_t max_chart_range = 0; std::pair display_range; QAction *columns_action; int column_count = 1; int current_column_count = 0; int auto_scroll_count = 0; QTimer *auto_scroll_timer; QTimer *align_timer; int current_theme = 0; bool value_tip_visible_ = false; friend class ChartView; friend class ChartsContainer; }; class ZoomCommand : public QUndoCommand { public: ZoomCommand(std::pair range) : range(range), QUndoCommand() { prev_range = can->timeRange(); setText(QObject::tr("Zoom to %1-%2").arg(range.first, 0, 'f', 2).arg(range.second, 0, 'f', 2)); } void undo() override { can->setTimeRange(prev_range); } void redo() override { can->setTimeRange(range); } std::optional> prev_range, range; };