You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.9 KiB
129 lines
3.9 KiB
#pragma once
|
|
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
|
|
#include <QGridLayout>
|
|
#include <QLabel>
|
|
#include <QScrollArea>
|
|
#include <QTimer>
|
|
#include <QUndoCommand>
|
|
#include <QUndoStack>
|
|
|
|
#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 setZoom(double min, double max);
|
|
|
|
signals:
|
|
void dock(bool floating);
|
|
void rangeChanged(double min, double max, bool is_zommed);
|
|
void seriesChanged();
|
|
|
|
private:
|
|
void resizeEvent(QResizeEvent *event) override;
|
|
bool event(QEvent *event) override;
|
|
void alignCharts();
|
|
void newChart();
|
|
ChartView *createChart();
|
|
void removeChart(ChartView *chart);
|
|
void splitChart(ChartView *chart);
|
|
QRect chartVisibleRect(ChartView *chart);
|
|
void eventsMerged();
|
|
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<ChartView *> ¤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 docking = true;
|
|
ToolButton *dock_btn;
|
|
|
|
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<ChartView *> charts;
|
|
std::unordered_map<int, QList<ChartView *>> tab_charts;
|
|
TabBar *tabbar;
|
|
ChartsContainer *charts_container;
|
|
QScrollArea *charts_scroll;
|
|
uint32_t max_chart_range = 0;
|
|
bool is_zoomed = false;
|
|
std::pair<double, double> display_range;
|
|
std::pair<double, double> zoomed_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;
|
|
friend class ZoomCommand;
|
|
friend class ChartView;
|
|
friend class ChartsContainer;
|
|
};
|
|
|
|
class ZoomCommand : public QUndoCommand {
|
|
public:
|
|
ZoomCommand(ChartsWidget *charts, std::pair<double, double> range) : charts(charts), range(range), QUndoCommand() {
|
|
prev_range = charts->is_zoomed ? charts->zoomed_range : charts->display_range;
|
|
setText(QObject::tr("Zoom to %1-%2").arg(range.first, 0, 'f', 1).arg(range.second, 0, 'f', 1));
|
|
}
|
|
void undo() override { charts->setZoom(prev_range.first, prev_range.second); }
|
|
void redo() override { charts->setZoom(range.first, range.second); }
|
|
ChartsWidget *charts;
|
|
std::pair<double, double> prev_range, range;
|
|
};
|
|
|