diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8eb5a0e9f..5d04cbabe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -83,6 +83,7 @@ target_sources(dolphinprivate PRIVATE kitemviews/private/kitemlistsmoothscroller.cpp kitemviews/private/kitemlistviewanimation.cpp kitemviews/private/kitemlistviewlayouter.cpp + kitemviews/private/kitemviewsutils.cpp kitemviews/private/kpixmapmodifier.cpp settings/applyviewpropsjob.cpp settings/viewmodes/viewmodesettings.cpp diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index 954e6ab88..d763fe287 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -9,6 +9,7 @@ #include "kfileitemlistwidget.h" #include "kfileitemmodel.h" #include "kfileitemmodelrolesupdater.h" +#include "private/kitemviewsutils.h" #include "private/kpixmapmodifier.h" #include @@ -157,7 +158,7 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet &indexes) const yCount = xCount; } - const qreal dpr = scene()->views()[0]->devicePixelRatio(); + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); // Draw the selected items into the grid cells. QPixmap dragPixmap(QSize(xCount * size + xCount, yCount * size + yCount) * dpr); dragPixmap.setDevicePixelRatio(dpr); @@ -255,6 +256,7 @@ void KFileItemListView::onModelChanged(KItemModelBase *current, KItemModelBase * if (current) { m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast(current), this); m_modelRolesUpdater->setIconSize(availableIconSize()); + m_modelRolesUpdater->setDevicePixelRatio(KItemViewsUtils::devicePixelRatio(this)); applyRolesToModel(); } @@ -414,6 +416,7 @@ void KFileItemListView::updateIconSize() } m_modelRolesUpdater->setIconSize(availableIconSize()); + m_modelRolesUpdater->setDevicePixelRatio(KItemViewsUtils::devicePixelRatio(this)); // Update the visible index range (which has most likely changed after the // icon size change) before unpausing m_modelRolesUpdater. diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 54e1fa50b..b3721aed9 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -10,6 +10,7 @@ #include "kfileitemmodel.h" #include "private/kfileitemclipboard.h" #include "private/kitemlistroleeditor.h" +#include "private/kitemviewsutils.h" #include "private/kpixmapmodifier.h" #include @@ -965,6 +966,7 @@ void KStandardItemListWidget::updatePixmapCache() const bool iconOnTop = (m_layout == IconsLayout); const KItemListStyleOption &option = styleOption(); const qreal padding = option.padding; + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); const int widgetIconSize = iconSize(); const int maxIconWidth = iconOnTop ? widgetSize.width() - 2 * padding : widgetIconSize; @@ -1025,7 +1027,7 @@ void KStandardItemListWidget::updatePixmapCache() } else if (m_pixmap.width() / m_pixmap.devicePixelRatio() != maxIconWidth || m_pixmap.height() / m_pixmap.devicePixelRatio() != maxIconHeight) { // A custom pixmap has been applied. Assure that the pixmap // is scaled to the maximum available size. - KPixmapModifier::scale(m_pixmap, QSize(maxIconWidth, maxIconHeight) * qApp->devicePixelRatio()); + KPixmapModifier::scale(m_pixmap, QSize(maxIconWidth, maxIconHeight) * dpr); } if (m_pixmap.isNull()) { @@ -1073,8 +1075,8 @@ void KStandardItemListWidget::updatePixmapCache() const int maxScaledIconHeight = scaledIconSize; m_scaledPixmapSize = m_pixmap.size(); - m_scaledPixmapSize.scale(maxScaledIconWidth * qApp->devicePixelRatio(), maxScaledIconHeight * qApp->devicePixelRatio(), Qt::KeepAspectRatio); - m_scaledPixmapSize = m_scaledPixmapSize / qApp->devicePixelRatio(); + m_scaledPixmapSize.scale(maxScaledIconWidth * dpr, maxScaledIconHeight * dpr, Qt::KeepAspectRatio); + m_scaledPixmapSize = m_scaledPixmapSize / dpr; if (iconOnTop) { // Center horizontally and align on bottom within the icon-area @@ -1171,7 +1173,7 @@ void KStandardItemListWidget::updateTextsCache() if (ratingSize.width() > availableWidth) { ratingSize.rwidth() = availableWidth; } - const qreal dpr = qApp->devicePixelRatio(); + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); m_rating = QPixmap(ratingSize.toSize() * dpr); m_rating.setDevicePixelRatio(dpr); m_rating.fill(Qt::transparent); @@ -1473,9 +1475,10 @@ void KStandardItemListWidget::updateAdditionalInfoTextColor() void KStandardItemListWidget::drawPixmap(QPainter *painter, const QPixmap &pixmap) { if (m_scaledPixmapSize != pixmap.size() / pixmap.devicePixelRatio()) { + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); QPixmap scaledPixmap = pixmap; - KPixmapModifier::scale(scaledPixmap, m_scaledPixmapSize * qApp->devicePixelRatio()); - scaledPixmap.setDevicePixelRatio(qApp->devicePixelRatio()); + KPixmapModifier::scale(scaledPixmap, m_scaledPixmapSize * dpr); + scaledPixmap.setDevicePixelRatio(dpr); painter->drawPixmap(m_pixmapPos, scaledPixmap); #ifdef KSTANDARDITEMLISTWIDGET_DEBUG @@ -1559,10 +1562,7 @@ void KStandardItemListWidget::closeRoleEditor() QPixmap KStandardItemListWidget::pixmapForIcon(const QString &name, const QStringList &overlays, int size, QIcon::Mode mode) const { static const QIcon fallbackIcon = QIcon::fromTheme(QStringLiteral("unknown")); - qreal dpr = qApp->devicePixelRatio(); - if (scene() && !scene()->views().isEmpty()) { - dpr = scene()->views().constFirst()->devicePixelRatioF(); - } + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); size *= dpr; diff --git a/src/kitemviews/private/kitemviewsutils.cpp b/src/kitemviews/private/kitemviewsutils.cpp new file mode 100644 index 000000000..9e343b6d0 --- /dev/null +++ b/src/kitemviews/private/kitemviewsutils.cpp @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2023 Kai Uwe Broulik + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "kitemviewsutils.h" + +#include +#include +#include +#include + +qreal KItemViewsUtils::devicePixelRatio(const QGraphicsItem *item) +{ + qreal dpr = qApp->devicePixelRatio(); + if (item->scene()) { + if (const auto views = item->scene()->views(); !views.isEmpty()) { + dpr = views.first()->devicePixelRatioF(); + } + } + return dpr; +} diff --git a/src/kitemviews/private/kitemviewsutils.h b/src/kitemviews/private/kitemviewsutils.h new file mode 100644 index 000000000..e9c8bd3e8 --- /dev/null +++ b/src/kitemviews/private/kitemviewsutils.h @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2023 Kai Uwe Broulik + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef KITEMVIEWSUTILS_H +#define KITEMVIEWSUTILS_H + +#include + +class QGraphicsItem; + +class KItemViewsUtils +{ +public: + static qreal devicePixelRatio(const QGraphicsItem *item); +}; + +#endif // KITEMVIEWSUTILS_H diff --git a/src/views/dolphinfileitemlistwidget.cpp b/src/views/dolphinfileitemlistwidget.cpp index 921baf73f..11c88d402 100644 --- a/src/views/dolphinfileitemlistwidget.cpp +++ b/src/views/dolphinfileitemlistwidget.cpp @@ -5,6 +5,7 @@ */ #include "dolphinfileitemlistwidget.h" +#include "../kitemviews/private/kitemviewsutils.h" #include "dolphindebug.h" @@ -77,7 +78,7 @@ void DolphinFileItemListWidget::refreshCache() setTextColor(color); } -QPixmap DolphinFileItemListWidget::overlayForState(KVersionControlPlugin::ItemVersion version, int size) +QPixmap DolphinFileItemListWidget::overlayForState(KVersionControlPlugin::ItemVersion version, int size) const { int overlayHeight = KIconLoader::SizeSmall; if (size >= KIconLoader::SizeEnormous) { @@ -122,7 +123,8 @@ QPixmap DolphinFileItemListWidget::overlayForState(KVersionControlPlugin::ItemVe break; } - return QIcon::fromTheme(iconName).pixmap(QSize(overlayHeight, overlayHeight)); + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); + return QIcon::fromTheme(iconName).pixmap(QSize(overlayHeight, overlayHeight), dpr); } #include "moc_dolphinfileitemlistwidget.cpp" diff --git a/src/views/dolphinfileitemlistwidget.h b/src/views/dolphinfileitemlistwidget.h index ac98666c8..92fc66fcc 100644 --- a/src/views/dolphinfileitemlistwidget.h +++ b/src/views/dolphinfileitemlistwidget.h @@ -29,7 +29,7 @@ protected: void refreshCache() override; private: - static QPixmap overlayForState(KVersionControlPlugin::ItemVersion version, int size); + QPixmap overlayForState(KVersionControlPlugin::ItemVersion version, int size) const; }; #endif