cabana: click on legend to show/hide series (#27231)

* click on legend to show/hide series

* update axis y

* add move icon
old-commit-hash: f9de6a0dd8
beeps
Dean Lee 2 years ago committed by GitHub
parent c1b3ff34ea
commit bd2e71260e
  1. 27
      tools/cabana/chartswidget.cc
  2. 4
      tools/cabana/chartswidget.h

@ -317,6 +317,9 @@ ChartView::ChartView(QWidget *parent) : QChartView(nullptr, parent) {
background->setPen(Qt::NoPen); background->setPen(Qt::NoPen);
background->setZValue(chart->zValue() - 1); background->setZValue(chart->zValue() - 1);
move_icon = new QGraphicsPixmapItem(utils::icon("grip-horizontal"), chart);
move_icon->setToolTip(tr("Drag and drop to combine charts"));
QToolButton *remove_btn = new QToolButton(); QToolButton *remove_btn = new QToolButton();
remove_btn->setIcon(utils::icon("x")); remove_btn->setIcon(utils::icon("x"));
remove_btn->setAutoRaise(true); remove_btn->setAutoRaise(true);
@ -460,6 +463,7 @@ void ChartView::resizeEvent(QResizeEvent *event) {
int x = event->size().width() - close_btn_proxy->size().width() - 11; int x = event->size().width() - close_btn_proxy->size().width() - 11;
close_btn_proxy->setPos(x, 8); close_btn_proxy->setPos(x, 8);
manage_btn_proxy->setPos(x - manage_btn_proxy->size().width() - 5, 8); manage_btn_proxy->setPos(x - manage_btn_proxy->size().width() - 5, 8);
move_icon->setPos(11, 8);
} }
void ChartView::updatePlotArea(int left) { void ChartView::updatePlotArea(int left) {
@ -472,8 +476,12 @@ void ChartView::updatePlotArea(int left) {
} }
void ChartView::updateTitle() { void ChartView::updateTitle() {
for (QLegendMarker *marker : chart()->legend()->markers()) {
QObject::connect(marker, &QLegendMarker::clicked, this, &ChartView::handleMarkerClicked, Qt::UniqueConnection);
}
for (auto &s : sigs) { for (auto &s : sigs) {
s.series->setName(QString("<b>%1</b> <font color=\"gray\">%2 %3</font>").arg(s.sig->name.c_str()).arg(msgName(s.msg_id)).arg(s.msg_id)); auto decoration = s.series->isVisible() ? "none" : "line-through";
s.series->setName(QString("<span style=\"text-decoration:%1\"><b>%2</b><font color=\"gray\">%3 %4</font></span>").arg(decoration).arg(s.sig->name.c_str()).arg(msgName(s.msg_id)).arg(s.msg_id));
} }
} }
@ -578,6 +586,8 @@ void ChartView::updateAxisY() {
double min = std::numeric_limits<double>::max(); double min = std::numeric_limits<double>::max();
double max = std::numeric_limits<double>::lowest(); double max = std::numeric_limits<double>::lowest();
for (auto &s : sigs) { for (auto &s : sigs) {
if (!s.series->isVisible()) continue;
auto first = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; }); auto first = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; });
auto last = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->max(), [](auto &p, double x) { return p.x() < x; }); auto last = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->max(), [](auto &p, double x) { return p.x() < x; });
for (auto it = first; it != last; ++it) { for (auto it = first; it != last; ++it) {
@ -634,8 +644,7 @@ void ChartView::leaveEvent(QEvent *event) {
} }
void ChartView::mousePressEvent(QMouseEvent *event) { void ChartView::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton && !chart()->plotArea().contains(event->pos()) && if (event->button() == Qt::LeftButton && move_icon->sceneBoundingRect().contains(event->pos())) {
!manage_btn_proxy->geometry().contains(event->pos()) && !close_btn_proxy->geometry().contains(event->pos())) {
QMimeData *mimeData = new QMimeData; QMimeData *mimeData = new QMimeData;
mimeData->setData(mime_type, QByteArray::number((qulonglong)this)); mimeData->setData(mime_type, QByteArray::number((qulonglong)this));
QDrag *drag = new QDrag(this); QDrag *drag = new QDrag(this);
@ -810,6 +819,18 @@ void ChartView::setSeriesType(QAbstractSeries::SeriesType type) {
} }
} }
void ChartView::handleMarkerClicked() {
auto marker = qobject_cast<QLegendMarker *>(sender());
Q_ASSERT(marker);
if (sigs.size() > 1) {
auto series = marker->series();
series->setVisible(!series->isVisible());
marker->setVisible(true);
updateAxisY();
updateTitle();
}
}
// SeriesSelector // SeriesSelector
SeriesSelector::SeriesSelector(QWidget *parent) { SeriesSelector::SeriesSelector(QWidget *parent) {

@ -5,9 +5,11 @@
#include <QGridLayout> #include <QGridLayout>
#include <QLabel> #include <QLabel>
#include <QListWidget> #include <QListWidget>
#include <QGraphicsPixmapItem>
#include <QGraphicsProxyWidget> #include <QGraphicsProxyWidget>
#include <QSlider> #include <QSlider>
#include <QtCharts/QChartView> #include <QtCharts/QChartView>
#include <QtCharts/QLegendMarker>
#include <QtCharts/QLineSeries> #include <QtCharts/QLineSeries>
#include <QtCharts/QScatterSeries> #include <QtCharts/QScatterSeries>
#include <QtCharts/QValueAxis> #include <QtCharts/QValueAxis>
@ -56,6 +58,7 @@ private slots:
void signalUpdated(const Signal *sig); void signalUpdated(const Signal *sig);
void signalRemoved(const Signal *sig); void signalRemoved(const Signal *sig);
void manageSeries(); void manageSeries();
void handleMarkerClicked();
private: private:
QList<ChartView::SigItem>::iterator removeItem(const QList<ChartView::SigItem>::iterator &it); QList<ChartView::SigItem>::iterator removeItem(const QList<ChartView::SigItem>::iterator &it);
@ -80,6 +83,7 @@ private:
QValueAxis *axis_x; QValueAxis *axis_x;
QValueAxis *axis_y; QValueAxis *axis_y;
QVector<QPointF> track_pts; QVector<QPointF> track_pts;
QGraphicsPixmapItem *move_icon;
QGraphicsProxyWidget *close_btn_proxy; QGraphicsProxyWidget *close_btn_proxy;
QGraphicsProxyWidget *manage_btn_proxy; QGraphicsProxyWidget *manage_btn_proxy;
QGraphicsRectItem *background; QGraphicsRectItem *background;

Loading…
Cancel
Save