#endif
#include <QApplication>
+#include <QIcon>
#include <QPainter>
#include <QElapsedTimer>
#include <QTimer>
m_resolvableRoles(),
m_enabledPlugins(),
m_localFileSizePreviewLimit(0),
+ m_scanDirectories(true),
m_pendingSortRoleItems(),
m_pendingIndexes(),
m_pendingPreviewItems(),
return m_localFileSizePreviewLimit;
}
+void KFileItemModelRolesUpdater::setScanDirectories(bool enabled)
+{
+ m_scanDirectories = enabled;
+}
+
+bool KFileItemModelRolesUpdater::scanDirectories() const
+{
+ return m_scanDirectories;
+}
+
void KFileItemModelRolesUpdater::slotItemsInserted(const KItemRangeList& itemRanges)
{
QElapsedTimer timer;
QPixmap scaledPixmap = pixmap;
- if (!pixmap.hasAlpha()
+ if (!pixmap.hasAlpha() && !pixmap.isNull()
&& m_iconSize.width() > KIconLoader::SizeSmallMedium
&& m_iconSize.height() > KIconLoader::SizeSmallMedium) {
if (m_enlargeSmallPreviews) {
KPixmapModifier::applyFrame(scaledPixmap, m_iconSize);
}
}
- } else {
+ } else if (!pixmap.isNull()) {
KPixmapModifier::scale(scaledPixmap, m_iconSize * qApp->devicePixelRatio());
scaledPixmap.setDevicePixelRatio(qApp->devicePixelRatio());
}
// It is more efficient to do it here, as KIconLoader::drawOverlays()
// assumes that an overlay will be drawn and has some additional
// setup time.
- 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);
- break;
+ 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);
+ break;
+ }
}
}
if (getSizeRole) {
data.insert("count", count);
- if (size != -1) {
- data.insert("size", QVariant::fromValue(size));
- }
+ data.insert("size", QVariant::fromValue(size));
}
if (getIsExpandableRole) {
data.insert("isExpandable", count > 0);
}
+ disconnect(m_model, &KFileItemModel::itemsChanged,
+ this, &KFileItemModelRolesUpdater::slotItemsChanged);
m_model->setData(index, data);
+ connect(m_model, &KFileItemModel::itemsChanged,
+ this, &KFileItemModelRolesUpdater::slotItemsChanged);
}
}
}
QList<int> visibleChangedIndexes;
QList<int> invisibleChangedIndexes;
+ visibleChangedIndexes.reserve(m_changedItems.size());
+ invisibleChangedIndexes.reserve(m_changedItems.size());
- for (const KFileItem& item : qAsConst(m_changedItems)) {
+ auto changedItemsIt = m_changedItems.begin();
+ while (changedItemsIt != m_changedItems.end()) {
+ const auto& item = *changedItemsIt;
const int index = m_model->index(item);
if (index < 0) {
- m_changedItems.remove(item);
+ changedItemsIt = m_changedItems.erase(changedItemsIt);
continue;
}
+ ++changedItemsIt;
if (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex) {
visibleChangedIndexes.append(index);
data.insert("type", item.mimeComment());
} else if (m_model->sortRole() == "size" && item.isLocalFile() && item.isDir()) {
const QString path = item.localPath();
- m_directoryContentsCounter->scanDirectory(path);
+ if (m_scanDirectories) {
+ m_directoryContentsCounter->scanDirectory(path);
+ }
} else {
// Probably the sort role is a baloo role - just determine all roles.
data = rolesData(item);
data = rolesData(item);
}
- data.insert("iconName", item.iconName());
+ if (!item.iconName().isEmpty()) {
+ data.insert("iconName", item.iconName());
+ }
if (m_clearPreviews) {
data.insert("iconPixmap", QPixmap());
if (item.isLocalFile()) {
// Tell m_directoryContentsCounter that we want to count the items
// inside the directory. The result will be received in slotDirectoryContentsCountReceived.
- const QString path = item.localPath();
- m_directoryContentsCounter->scanDirectory(path);
+ if (m_scanDirectories) {
+ const QString path = item.localPath();
+ m_directoryContentsCounter->scanDirectory(path);
+ }
} else if (getSizeRole) {
data.insert("size", -1); // -1 indicates an unknown number of items
}
const int count = m_model->count();
QList<int> result;
- result.reserve(ResolveAllItemsLimit);
+ result.reserve(qMin(count, (m_lastVisibleIndex - m_firstVisibleIndex + 1) +
+ ResolveAllItemsLimit +
+ (2 * m_maximumVisibleItems)));
// Add visible items.
for (int i = m_firstVisibleIndex; i <= m_lastVisibleIndex; ++i) {
}
// Add items on the last page.
- const int beginLastPage = qMax(qMin(endExtendedVisibleRange + 1, count - 1), count - m_maximumVisibleItems);
+ const int beginLastPage = qMax(endExtendedVisibleRange + 1, count - m_maximumVisibleItems);
for (int i = beginLastPage; i < count; ++i) {
result.append(i);
}
// Add items on the first page.
- const int endFirstPage = qMin(qMax(beginExtendedVisibleRange - 1, 0), m_maximumVisibleItems);
- for (int i = 0; i <= endFirstPage; ++i) {
+ const int endFirstPage = qMin(beginExtendedVisibleRange, m_maximumVisibleItems);
+ for (int i = 0; i < endFirstPage; ++i) {
result.append(i);
}
--remainingItems;
}
- for (int i = beginExtendedVisibleRange - 1; i > endFirstPage && remainingItems > 0; --i) {
+ for (int i = beginExtendedVisibleRange - 1; i >= endFirstPage && remainingItems > 0; --i) {
result.append(i);
--remainingItems;
}