X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/64e40c1d934247fc9e1c2fa00761b2cb8d70a146..6e752f507a1dd82a40d4bd140457203842fc0c80:/src/kitemviews/kfileitemmodelrolesupdater.cpp diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 795b85a44..318936e8a 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -13,8 +13,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -67,6 +69,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) @@ -92,7 +95,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)); @@ -158,6 +161,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) { @@ -347,7 +369,7 @@ void KFileItemModelRolesUpdater::slotItemsInserted(const KItemRangeList &itemRan timer.start(); // Determine the sort role synchronously for as many items as possible. - if (m_resolvableRoles.contains(m_model->sortRole())) { + if (m_resolvableRoles.contains(m_model->sortRole()) || m_resolvableRoles.contains(m_model->groupRole())) { int insertedCount = 0; for (const KItemRange &range : itemRanges) { const int lastIndex = insertedCount + range.index + range.count - 1; @@ -536,15 +558,13 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem &item, const QPi const QStringList overlays = data["iconOverlays"].toStringList(); // Strangely KFileItem::overlays() returns empty string-values, so // we need to check first whether an overlay must be drawn at all. - // It is more efficient to do it here, as KIconLoader::drawOverlays() - // assumes that an overlay will be drawn and has some additional - // setup time. if (!scaledPixmap.isNull()) { for (const QString &overlay : overlays) { if (!overlay.isEmpty()) { // There is at least one overlay, draw all overlays above m_pixmap // and cancel the check - KIconLoader::global()->drawOverlays(overlays, scaledPixmap, KIconLoader::Desktop); + const QSize size = scaledPixmap.size(); + scaledPixmap = KIconUtils::addOverlays(scaledPixmap, overlays).pixmap(size); break; } } @@ -992,7 +1012,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()); @@ -1038,8 +1058,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; @@ -1197,13 +1217,13 @@ void KFileItemModelRolesUpdater::applySortRole(int index) QHash data; const KFileItem item = m_model->fileItem(index); - if (m_model->sortRole() == "type") { + if (m_model->sortRole() == "type" || m_model->groupRole() == "type") { if (!item.isMimeTypeKnown()) { item.determineMimeType(); } data.insert("type", item.mimeComment()); - } else if (m_model->sortRole() == "size" && item.isLocalFile() && item.isDir()) { + } else if ((m_model->sortRole() == "size" || m_model->groupRole() == "size") && item.isLocalFile() && item.isDir()) { startDirectorySizeCounting(item, index); return; } else { @@ -1267,11 +1287,11 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint) void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &item, int index) { - if (!item.isLocalFile()) { + if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::None || !item.isLocalFile()) { return; } - if (ContentDisplaySettings::directorySizeCount() || item.isSlow()) { + if (ContentDisplaySettings::directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount || item.isSlow()) { // fastpath no recursion necessary auto data = m_model->data(index); @@ -1286,8 +1306,6 @@ 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); @@ -1295,7 +1313,11 @@ void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &ite connect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); auto listJob = KIO::listDir(url, KIO::HideProgressInfo); - QObject::connect(listJob, &KIO::ListJob::entries, this, [this, index](const KJob * /*job*/, const KIO::UDSEntryList &list) { + 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; @@ -1315,14 +1337,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); } });