X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/cd2e64154fd5446a7e19aff4cb147efe2f2ba31e..a4efbfbfa69f04ed21fe703a11bb59416ef8a821:/src/kitemviews/kfileitemmodel.cpp diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 28e0876b9..f9bab74cd 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include Q_GLOBAL_STATIC(QRecursiveMutex, s_collatorMutex) @@ -99,13 +99,14 @@ KFileItemModel::KFileItemModel(QObject *parent) // for a lot of items within a quite small timeslot. To prevent expensive resortings the // resorting is postponed until the timer has been exceeded. m_resortAllItemsTimer = new QTimer(this); - m_resortAllItemsTimer->setInterval(500); + m_resortAllItemsTimer->setInterval(100); // 100 is a middle ground between sorting too frequently which makes the view unreadable + // and sorting too infrequently which leads to users seeing an outdated sort order. m_resortAllItemsTimer->setSingleShot(true); connect(m_resortAllItemsTimer, &QTimer::timeout, this, &KFileItemModel::resortAllItems); connect(GeneralSettings::self(), &GeneralSettings::sortingChoiceChanged, this, &KFileItemModel::slotSortingChoiceChanged); - setShowTrashMime(m_dirLister->showHiddenFiles()); + setShowTrashMime(m_dirLister->showHiddenFiles() || !GeneralSettings::hideXTrashFile()); } KFileItemModel::~KFileItemModel() @@ -239,31 +240,31 @@ bool KFileItemModel::sortHiddenLast() const return m_sortHiddenLast; } -void KFileItemModel::setShowTrashMime(bool show) +void KFileItemModel::setShowTrashMime(bool showTrashMime) { const auto trashMime = QStringLiteral("application/x-trash"); QStringList excludeFilter = m_filter.excludeMimeTypes(); - bool wasShown = !excludeFilter.contains(trashMime); - if (show) { - if (!wasShown) { - excludeFilter.removeAll(trashMime); - } - } else { - if (wasShown) { - excludeFilter.append(trashMime); - } + if (showTrashMime) { + excludeFilter.removeAll(trashMime); + } else if (!excludeFilter.contains(trashMime)) { + excludeFilter.append(trashMime); } - if (wasShown != show) { - setExcludeMimeTypeFilter(excludeFilter); + setExcludeMimeTypeFilter(excludeFilter); +} + +void KFileItemModel::scheduleResortAllItems() +{ + if (!m_resortAllItemsTimer->isActive()) { + m_resortAllItemsTimer->start(); } } void KFileItemModel::setShowHiddenFiles(bool show) { m_dirLister->setShowHiddenFiles(show); - setShowTrashMime(show); + setShowTrashMime(show || !GeneralSettings::hideXTrashFile()); m_dirLister->emitChanges(); if (show) { dispatchPendingItemsToInsert(); @@ -981,7 +982,7 @@ void KFileItemModel::resortAllItems() // been moved because of the resorting. QList oldUrls; oldUrls.reserve(itemCount); - for (const ItemData *itemData : qAsConst(m_itemData)) { + for (const ItemData *itemData : std::as_const(m_itemData)) { oldUrls.append(itemData->item.url()); } @@ -1226,7 +1227,7 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList &items) indexesToRemoveWithChildren.reserve(m_itemData.count()); const int itemCount = m_itemData.count(); - for (int index : qAsConst(indexesToRemove)) { + for (int index : std::as_const(indexesToRemove)) { indexesToRemoveWithChildren.append(index); const int parentLevel = expandedParentsCount(index); @@ -1644,7 +1645,7 @@ void KFileItemModel::prepareItemsForSorting(QList &itemDataList) case DeletionTimeRole: // These roles can be determined with retrieveData, and they have to be stored // in the QHash "values" for the sorting. - for (ItemData *itemData : qAsConst(itemDataList)) { + for (ItemData *itemData : std::as_const(itemDataList)) { if (itemData->values.isEmpty()) { itemData->values = retrieveData(itemData->item, itemData->parent); } @@ -1653,7 +1654,7 @@ void KFileItemModel::prepareItemsForSorting(QList &itemDataList) case TypeRole: // At least store the data including the file type for items with known MIME type. - for (ItemData *itemData : qAsConst(itemDataList)) { + for (ItemData *itemData : std::as_const(itemDataList)) { if (itemData->values.isEmpty()) { const KFileItem item = itemData->item; if (item.isDir() || item.isMimeTypeKnown()) { @@ -1725,7 +1726,8 @@ void KFileItemModel::emitItemsChangedAndTriggerResorting(const KItemRangeList &i // Trigger a resorting if necessary. Note that this can happen even if the sort // role has not changed at all because the file name can be used as a fallback. - if (changedRoles.contains(sortRole()) || changedRoles.contains(roleForType(NameRole))) { + if (changedRoles.contains(sortRole()) || changedRoles.contains(roleForType(NameRole)) + || (changedRoles.contains("count") && sortRole() == "size")) { // "count" is used in the "size" sort role, so this might require a resorting. for (const KItemRange &range : itemRanges) { bool needsResorting = false; @@ -1750,7 +1752,7 @@ void KFileItemModel::emitItemsChangedAndTriggerResorting(const KItemRangeList &i } if (needsResorting) { - m_resortAllItemsTimer->start(); + scheduleResortAllItems(); return; } } @@ -2850,3 +2852,5 @@ void KFileItemModel::slotListerError(KIO::Job *job) Q_EMIT errorMessage(!errorString.isEmpty() ? errorString : i18nc("@info:status", "Unknown error.")); } } + +#include "moc_kfileitemmodel.cpp"