diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index 49ee3c5bd0..4285c8a7f4 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -11,7 +11,9 @@ #include #include #include +#include #include +#include #include "tools/cabana/chart/chartswidget.h" @@ -40,6 +42,7 @@ ChartView::ChartView(const std::pair &x_range, ChartsWidget *par QObject::connect(axis_y, &QValueAxis::rangeChanged, [this]() { resetChartCache(); }); QObject::connect(axis_y, &QAbstractAxis::titleTextChanged, [this]() { resetChartCache(); }); + QObject::connect(window()->windowHandle(), &QWindow::screenChanged, [this]() { resetChartCache(); }); QObject::connect(dbc(), &DBCManager::signalRemoved, this, &ChartView::signalRemoved); QObject::connect(dbc(), &DBCManager::signalUpdated, this, &ChartView::signalUpdated); @@ -382,39 +385,42 @@ void ChartView::leaveEvent(QEvent *event) { QChartView::leaveEvent(event); } -QPixmap getBlankShadowPixmap(const QSize &size, int extent) { +QPixmap getBlankShadowPixmap(const QPixmap &px, int radius) { QGraphicsDropShadowEffect *e = new QGraphicsDropShadowEffect; e->setColor(QColor(40, 40, 40, 245)); - e->setOffset(0, 2); - e->setBlurRadius(10); + e->setOffset(0, 0); + e->setBlurRadius(radius); + + qreal dpr = px.devicePixelRatio(); + QPixmap blank(px.size()); + blank.setDevicePixelRatio(dpr); + blank.fill(Qt::white); QGraphicsScene scene; - QGraphicsPixmapItem item; - QPixmap src(size); - src.fill(Qt::white); - item.setPixmap(src); + QGraphicsPixmapItem item(blank); item.setGraphicsEffect(e); scene.addItem(&item); - QImage target(src.size() + QSize(extent * 2, extent * 2), QImage::Format_ARGB32); - target.fill(Qt::transparent); - QPainter p(&target); - scene.render(&p, QRectF(), QRectF(-extent, -extent, src.width() + extent * 2, src.height() + extent * 2)); - return QPixmap::fromImage(target); + + QPixmap shadow(px.size() + QSize(radius * dpr * 2, radius * dpr * 2)); + shadow.setDevicePixelRatio(dpr); + shadow.fill(Qt::transparent); + QPainter p(&shadow); + scene.render(&p, {QPoint(), shadow.size() / dpr}, item.boundingRect().adjusted(-radius, -radius, radius, radius)); + return shadow; } static QPixmap getDropPixmap(const QPixmap &src) { static QPixmap shadow_px; - const int extent = 10; - if (shadow_px.size() != src.size() + QSize(extent * 2, extent * 2)) { - shadow_px = getBlankShadowPixmap(src.size(), extent); + const int radius = 10; + if (shadow_px.size() != src.size() + QSize(radius * 2, radius * 2)) { + shadow_px = getBlankShadowPixmap(src, radius); } QPixmap px = shadow_px; QPainter p(&px); - int delta_w = px.width() - src.width(); - int delta_h = px.height() - src.height(); - p.drawPixmap(QPoint(delta_w / 2, delta_h / 2), src); + QRectF target_rect(QPointF(radius, radius), src.size() / src.devicePixelRatio()); + p.drawPixmap(target_rect.topLeft(), src); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); - p.fillRect(delta_w / 2, delta_h / 2, src.width(), src.height(), QColor(0, 0, 0, 200)); + p.fillRect(target_rect, QColor(0, 0, 0, 200)); return px; } @@ -422,7 +428,7 @@ void ChartView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton && move_icon->sceneBoundingRect().contains(event->pos())) { QMimeData *mimeData = new QMimeData; mimeData->setData(CHART_MIME_TYPE, QByteArray::number((qulonglong)this)); - QPixmap px = grab().scaledToWidth(CHART_MIN_WIDTH, Qt::SmoothTransformation); + QPixmap px = grab().scaledToWidth(CHART_MIN_WIDTH * viewport()->devicePixelRatio(), Qt::SmoothTransformation); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(getDropPixmap(px)); @@ -614,7 +620,7 @@ void ChartView::paintEvent(QPaintEvent *event) { p.setRenderHints(QPainter::Antialiasing); drawBackground(&p, viewport()->rect()); scene()->setSceneRect(viewport()->rect()); - scene()->render(&p); + scene()->render(&p, viewport()->rect()); } QPainter painter(viewport());