X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a1c5c5cf81b5d1f6b7a0aa10b8a981cb70c5b26c..815bb8d514d70d79ef5f3fd7fffa95850f761d55:/src/kitemviews/kfileitemmodelrolesupdater.cpp diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 6838d0861..0ff431ac9 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -10,10 +10,10 @@ #include "kfileitemmodel.h" #include "private/kdirectorycontentscounter.h" #include "private/kpixmapmodifier.h" -#include "qdir.h" #include #include +#include #include #include #include @@ -21,7 +21,7 @@ #include #include -#include "dolphin_detailsmodesettings.h" +#include "dolphin_contentdisplaysettings.h" #if HAVE_BALOO #include "private/kbaloorolesprovider.h" @@ -68,6 +68,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel *model, QO , m_finishedItems() , m_model(model) , m_iconSize() + , m_devicePixelRatio(1.0) , m_firstVisibleIndex(0) , m_lastVisibleIndex(-1) , m_maximumVisibleItems(50) @@ -93,7 +94,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel *model, QO { Q_ASSERT(model); - const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings"); + const KConfigGroup globalConfig(KSharedConfig::openConfig(), QStringLiteral("PreviewSettings")); m_enabledPlugins = globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()); m_localFileSizePreviewLimit = static_cast(globalConfig.readEntry("MaximumSize", 0)); @@ -120,8 +121,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel *model, QO m_directoryContentsCounter = new KDirectoryContentsCounter(m_model, this); connect(m_directoryContentsCounter, &KDirectoryContentsCounter::result, this, &KFileItemModelRolesUpdater::slotDirectoryContentsCountReceived); - const QString pluginNamespace = QStringLiteral("kf" QT_STRINGIFY(QT_VERSION_MAJOR)) + QStringLiteral("/overlayicon"); - const auto plugins = KPluginMetaData::findPlugins(pluginNamespace, {}, KPluginMetaData::AllowEmptyMetaData); + const auto plugins = KPluginMetaData::findPlugins(QStringLiteral("kf6/overlayicon"), {}, KPluginMetaData::AllowEmptyMetaData); for (const KPluginMetaData &data : plugins) { auto instance = QPluginLoader(data.fileName()).instance(); auto plugin = qobject_cast(instance); @@ -160,6 +160,25 @@ QSize KFileItemModelRolesUpdater::iconSize() const return m_iconSize; } +void KFileItemModelRolesUpdater::setDevicePixelRatio(qreal devicePixelRatio) +{ + if (m_devicePixelRatio != devicePixelRatio) { + m_devicePixelRatio = devicePixelRatio; + if (m_state == Paused) { + m_iconSizeChangedDuringPausing = true; + } else if (m_previewShown) { + // A dpr change requires the regenerating of all previews. + m_finishedItems.clear(); + startUpdating(); + } + } +} + +qreal KFileItemModelRolesUpdater::devicePixelRatio() const +{ + return m_devicePixelRatio; +} + void KFileItemModelRolesUpdater::setVisibleIndexRange(int index, int count) { if (index < 0) { @@ -907,7 +926,7 @@ void KFileItemModelRolesUpdater::startUpdating() m_pendingPreviewItems.clear(); m_pendingPreviewItems.reserve(indexes.count()); - for (int index : qAsConst(indexes)) { + for (int index : std::as_const(indexes)) { const KFileItem item = m_model->fileItem(index); if (!m_finishedItems.contains(item)) { m_pendingPreviewItems.append(item); @@ -994,7 +1013,7 @@ void KFileItemModelRolesUpdater::startPreviewJob() } KIO::PreviewJob *job = new KIO::PreviewJob(itemSubSet, cacheSize, &m_enabledPlugins); - + job->setDevicePixelRatio(m_devicePixelRatio); job->setIgnoreMaximumSize(itemSubSet.first().isLocalFile() && !itemSubSet.first().isSlow() && m_localFileSizePreviewLimit <= 0); if (job->uiDelegate()) { KJobWidgets::setWindow(job, qApp->activeWindow()); @@ -1040,8 +1059,8 @@ QPixmap KFileItemModelRolesUpdater::transformPreviewPixmap(const QPixmap &pixmap } } } else if (!pixmap.isNull()) { - KPixmapModifier::scale(scaledPixmap, m_iconSize * qApp->devicePixelRatio()); - scaledPixmap.setDevicePixelRatio(qApp->devicePixelRatio()); + KPixmapModifier::scale(scaledPixmap, m_iconSize * m_devicePixelRatio); + scaledPixmap.setDevicePixelRatio(m_devicePixelRatio); } return scaledPixmap; @@ -1172,11 +1191,11 @@ void KFileItemModelRolesUpdater::updateChangedItems() std::sort(visibleChangedIndexes.begin(), visibleChangedIndexes.end()); if (m_previewShown) { - for (int index : qAsConst(visibleChangedIndexes)) { + for (int index : std::as_const(visibleChangedIndexes)) { m_pendingPreviewItems.append(m_model->fileItem(index)); } - for (int index : qAsConst(invisibleChangedIndexes)) { + for (int index : std::as_const(invisibleChangedIndexes)) { m_pendingPreviewItems.append(m_model->fileItem(index)); } @@ -1269,7 +1288,11 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint) void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &item, int index) { - if (DetailsModeSettings::directorySizeCount() || item.isSlow() || !item.isLocalFile()) { + if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::None || !item.isLocalFile()) { + return; + } + + if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount || item.isSlow()) { // fastpath no recursion necessary auto data = m_model->data(index); @@ -1284,16 +1307,18 @@ void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &ite url = QUrl::fromLocalFile(item.localPath()); } - data.insert("isExpandable", false); - data.insert("count", 0); data.insert("size", -2); // invalid size, -1 means size unknown disconnect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); m_model->setData(index, data); connect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); - auto listJob = KIO::listDir(url); - QObject::connect(listJob, &KIO::ListJob::entries, this, [this, index](const KJob * /*job*/, const KIO::UDSEntryList &list) { + auto listJob = KIO::listDir(url, KIO::HideProgressInfo); + QObject::connect(listJob, &KIO::ListJob::entries, this, [this, item](const KJob * /*job*/, const KIO::UDSEntryList &list) { + int index = m_model->index(item); + if (index < 0) { + return; + } auto data = m_model->data(index); int origCount = data.value("count").toInt(); int entryCount = origCount; @@ -1313,14 +1338,21 @@ void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &ite ++entryCount; } - // count has changed - if (origCount < entryCount) { - QHash data; - data.insert("isExpandable", entryCount > 0); - data.insert("count", entryCount); + QHash newData; + QVariant expandable = data.value("isExpandable"); + if (expandable.isNull() || expandable.toBool() != (entryCount > 0)) { + // if expandable has changed + newData.insert("isExpandable", entryCount > 0); + } + if (origCount != entryCount) { + // count has changed + newData.insert("count", entryCount); + } + + if (!newData.isEmpty()) { disconnect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); - m_model->setData(index, data); + m_model->setData(index, newData); connect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); } }); @@ -1357,7 +1389,7 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte } QStringList overlays = item.overlays(); - for (KOverlayIconPlugin *it : qAsConst(m_overlayIconsPlugin)) { + for (KOverlayIconPlugin *it : std::as_const(m_overlayIconsPlugin)) { overlays.append(it->getOverlays(item.url())); } if (!overlays.isEmpty()) { @@ -1382,7 +1414,7 @@ void KFileItemModelRolesUpdater::slotOverlaysChanged(const QUrl &url, const QStr const int index = m_model->index(item); QHash data = m_model->data(index); QStringList overlays = item.overlays(); - for (KOverlayIconPlugin *it : qAsConst(m_overlayIconsPlugin)) { + for (KOverlayIconPlugin *it : std::as_const(m_overlayIconsPlugin)) { overlays.append(it->getOverlays(url)); } data.insert("iconOverlays", overlays); @@ -1496,3 +1528,5 @@ void KFileItemModelRolesUpdater::trimHoverSequenceLoadedItems() } } } + +#include "moc_kfileitemmodelrolesupdater.cpp"