diff options
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 117 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodel.h | 17 | ||||
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 18 | ||||
| -rw-r--r-- | src/kitemviews/private/kfileitemmodeldirlister.cpp | 40 | ||||
| -rw-r--r-- | src/kitemviews/private/kfileitemmodeldirlister.h | 43 |
5 files changed, 103 insertions, 132 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index ffd933d25..bf2597903 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -11,10 +11,10 @@ #include "dolphin_generalsettings.h" #include "dolphin_detailsmodesettings.h" #include "dolphindebug.h" -#include "private/kfileitemmodeldirlister.h" #include "private/kfileitemmodelsortalgorithm.h" -#include <kio_version.h> +#include <KDirLister> +#include <KIO/Job> #include <KLocalizedString> #include <KUrlMimeData> @@ -34,6 +34,7 @@ KFileItemModel::KFileItemModel(QObject* parent) : KItemModelBase("text", parent), m_dirLister(nullptr), m_sortDirsFirst(true), + m_sortHiddenLast(false), m_sortRole(NameRole), m_sortingProgressPercent(-1), m_roles(), @@ -53,7 +54,8 @@ KFileItemModel::KFileItemModel(QObject* parent) : loadSortingSettings(); - m_dirLister = new KFileItemModelDirLister(this); + m_dirLister = new KDirLister(this); + m_dirLister->setAutoErrorHandlingEnabled(false); m_dirLister->setDelayedMimeTypes(true); const QWidget* parentWidget = qobject_cast<QWidget*>(parent); @@ -61,23 +63,17 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_dirLister->setMainWindow(parentWidget->window()); } - connect(m_dirLister, &KFileItemModelDirLister::started, this, &KFileItemModel::directoryLoadingStarted); + connect(m_dirLister, &KCoreDirLister::started, this, &KFileItemModel::directoryLoadingStarted); connect(m_dirLister, QOverload<>::of(&KCoreDirLister::canceled), this, &KFileItemModel::slotCanceled); - connect(m_dirLister, &KFileItemModelDirLister::itemsAdded, this, &KFileItemModel::slotItemsAdded); - connect(m_dirLister, &KFileItemModelDirLister::itemsDeleted, this, &KFileItemModel::slotItemsDeleted); - connect(m_dirLister, &KFileItemModelDirLister::refreshItems, this, &KFileItemModel::slotRefreshItems); + connect(m_dirLister, &KCoreDirLister::itemsAdded, this, &KFileItemModel::slotItemsAdded); + connect(m_dirLister, &KCoreDirLister::itemsDeleted, this, &KFileItemModel::slotItemsDeleted); + connect(m_dirLister, &KCoreDirLister::refreshItems, this, &KFileItemModel::slotRefreshItems); connect(m_dirLister, QOverload<>::of(&KCoreDirLister::clear), this, &KFileItemModel::slotClear); - connect(m_dirLister, &KFileItemModelDirLister::infoMessage, this, &KFileItemModel::infoMessage); - connect(m_dirLister, &KFileItemModelDirLister::errorMessage, this, &KFileItemModel::errorMessage); - connect(m_dirLister, &KFileItemModelDirLister::percent, this, &KFileItemModel::directoryLoadingProgress); + connect(m_dirLister, &KCoreDirLister::infoMessage, this, &KFileItemModel::infoMessage); + connect(m_dirLister, &KCoreDirLister::jobError, this, &KFileItemModel::slotListerError); + connect(m_dirLister, &KCoreDirLister::percent, this, &KFileItemModel::directoryLoadingProgress); connect(m_dirLister, QOverload<const QUrl&, const QUrl&>::of(&KCoreDirLister::redirection), this, &KFileItemModel::directoryRedirection); - connect(m_dirLister, &KFileItemModelDirLister::urlIsFileError, this, &KFileItemModel::urlIsFileError); - -#if KIO_VERSION < QT_VERSION_CHECK(5, 79, 0) - connect(m_dirLister, QOverload<const QUrl&>::of(&KCoreDirLister::completed), this, &KFileItemModel::slotCompleted); -#else connect(m_dirLister, &KCoreDirLister::listingDirCompleted, this, &KFileItemModel::slotCompleted); -#endif // Apply default roles that should be determined resetRoles(); @@ -212,6 +208,19 @@ bool KFileItemModel::sortDirectoriesFirst() const return m_sortDirsFirst; } +void KFileItemModel::setSortHiddenLast(bool hiddenLast) +{ + if (hiddenLast != m_sortHiddenLast) { + m_sortHiddenLast = hiddenLast; + resortAllItems(); + } +} + +bool KFileItemModel::sortHiddenLast() const +{ + return m_sortHiddenLast; +} + void KFileItemModel::setShowHiddenFiles(bool show) { m_dirLister->setShowingDotFiles(show); @@ -1758,6 +1767,17 @@ bool KFileItemModel::lessThan(const ItemData* a, const ItemData* b, const QColla } } + // Show hidden files and folders last + if (m_sortHiddenLast) { + const bool isHiddenA = a->item.isHidden(); + const bool isHiddenB = b->item.isHidden(); + if (isHiddenA && !isHiddenB) { + return false; + } else if (!isHiddenA && isHiddenB) { + return true; + } + } + if (m_sortDirsFirst || (DetailsModeSettings::directorySizeCount() && m_sortRole == SizeRole)) { const bool isDirA = a->item.isDir(); const bool isDirB = b->item.isDir(); @@ -1796,6 +1816,11 @@ void KFileItemModel::sort(const QList<KFileItemModel::ItemData*>::iterator &begi int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const QCollator& collator) const { + // This function must never return 0, because that would break stable + // sorting, which leads to all kinds of bugs. + // See: https://bugs.kde.org/show_bug.cgi?id=433247 + // If two items have equal sort values, let the fallbacks at the bottom of + // the function handle it. const KFileItem& itemA = a->item; const KFileItem& itemB = b->item; @@ -1813,29 +1838,21 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const auto valueA = a->values.value("count"); auto valueB = b->values.value("count"); if (valueA.isNull()) { - if (valueB.isNull()) { - result = 0; - break; - } else { - result = -1; - break; + if (!valueB.isNull()) { + return -1; } } else if (valueB.isNull()) { - result = +1; - break; + return +1; } else { if (valueA.toLongLong() < valueB.toLongLong()) { - result = -1; - break; + return -1; } else if (valueA.toLongLong() > valueB.toLongLong()) { - result = +1; - break; - } else { - result = 0; - break; + return +1; } } + break; } + KIO::filesize_t sizeA = 0; if (itemA.isDir()) { sizeA = a->values.value("size").toULongLong(); @@ -1848,12 +1865,10 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const } else { sizeB = itemB.size(); } - if (sizeA > sizeB) { - result = +1; - } else if (sizeA < sizeB) { - result = -1; - } else { - result = 0; + if (sizeA < sizeB) { + return -1; + } else if (sizeA > sizeB) { + return +1; } break; } @@ -1862,9 +1877,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1); const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1); if (dateTimeA < dateTimeB) { - result = -1; + return -1; } else if (dateTimeA > dateTimeB) { - result = +1; + return +1; } break; } @@ -1873,9 +1888,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1); const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1); if (dateTimeA < dateTimeB) { - result = -1; + return -1; } else if (dateTimeA > dateTimeB) { - result = +1; + return +1; } break; } @@ -1884,9 +1899,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const const QDateTime dateTimeA = a->values.value("deletiontime").toDateTime(); const QDateTime dateTimeB = b->values.value("deletiontime").toDateTime(); if (dateTimeA < dateTimeB) { - result = -1; + return -1; } else if (dateTimeA > dateTimeB) { - result = +1; + return +1; } break; } @@ -1907,9 +1922,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const const QString roleValueA = a->values.value(role).toString(); const QString roleValueB = b->values.value(role).toString(); if (!roleValueA.isEmpty() && roleValueB.isEmpty()) { - result = -1; + return -1; } else if (roleValueA.isEmpty() && !roleValueB.isEmpty()) { - result = +1; + return +1; } else if (isRoleValueNatural(m_sortRole)) { result = stringCompare(roleValueA, roleValueB, collator); } else { @@ -2517,3 +2532,15 @@ bool KFileItemModel::isConsistent() const return true; } + +void KFileItemModel::slotListerError(KIO::Job *job) +{ + if (job->error() == KIO::ERR_IS_FILE) { + if (auto *listJob = qobject_cast<KIO::ListJob *>(job)) { + Q_EMIT urlIsFileError(listJob->url()); + } + } else { + const QString errorString = job->errorString(); + Q_EMIT errorMessage(!errorString.isEmpty() ? errorString : i18nc("@info:status", "Unknown error.")); + } +} diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index acf4b761c..161f6a0e2 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -20,9 +20,14 @@ #include <functional> -class KFileItemModelDirLister; +class KDirLister; + class QTimer; +namespace KIO { + class Job; +} + /** * @brief KItemModelBase implementation for KFileItems. * @@ -80,6 +85,12 @@ public: void setSortDirectoriesFirst(bool dirsFirst); bool sortDirectoriesFirst() const; + /** + * Sets a separate sorting with hidden files and folders last (true) or not (false). + */ + void setSortHiddenLast(bool hiddenLast); + bool sortHiddenLast() const; + void setShowHiddenFiles(bool show); bool showHiddenFiles() const; @@ -270,6 +281,7 @@ private Q_SLOTS: void slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& items); void slotClear(); void slotSortingChoiceChanged(); + void slotListerError(KIO::Job *job); void dispatchPendingItemsToInsert(); @@ -458,11 +470,12 @@ private: bool isConsistent() const; private: - KFileItemModelDirLister* m_dirLister; + KDirLister *m_dirLister = nullptr; QCollator m_collator; bool m_naturalSorting; bool m_sortDirsFirst; + bool m_sortHiddenLast; RoleType m_sortRole; int m_sortingProgressPercent; // Value of directorySortingProgress() signal diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 9c527fa17..175181271 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -226,8 +226,22 @@ void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVect void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { const KItemListStyleOption& option = view->styleOption(); - const qreal height = option.padding * 2 + qMax(option.iconSize, option.fontMetrics.height()); - logicalHeightHints.fill(height); + + float zoomLevel = 1; + if (option.iconSize >= KIconLoader::SizeEnormous) { + zoomLevel = 2; + } else if (option.iconSize >= KIconLoader::SizeHuge) { + zoomLevel = 1.8; + } else if (option.iconSize >= KIconLoader::SizeLarge) { + zoomLevel = 1.6; + } else if (option.iconSize >= KIconLoader::SizeMedium) { + zoomLevel = 1.4; + } else if (option.iconSize >= KIconLoader::SizeSmallMedium) { + zoomLevel = 1.2; + } + + const qreal contentHeight = qMax<qreal>(option.iconSize, zoomLevel * option.fontMetrics.height()); + logicalHeightHints.fill(contentHeight + 2 * option.padding); logicalWidthHint = -1.0; } diff --git a/src/kitemviews/private/kfileitemmodeldirlister.cpp b/src/kitemviews/private/kfileitemmodeldirlister.cpp deleted file mode 100644 index eb860a2b9..000000000 --- a/src/kitemviews/private/kfileitemmodeldirlister.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006-2012 Peter Penz <[email protected]> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "kfileitemmodeldirlister.h" - -#include <KLocalizedString> -#include <KIO/Job> -#include <kio_version.h> - -KFileItemModelDirLister::KFileItemModelDirLister(QObject* parent) : - KDirLister(parent) -{ -#if KIO_VERSION < QT_VERSION_CHECK(5, 82, 0) - setAutoErrorHandlingEnabled(false, nullptr); -#else - setAutoErrorHandlingEnabled(false); -#endif -} - -KFileItemModelDirLister::~KFileItemModelDirLister() -{ -} - -void KFileItemModelDirLister::handleError(KIO::Job* job) -{ - if (job->error() == KIO::ERR_IS_FILE) { - Q_EMIT urlIsFileError(url()); - } else { - const QString errorString = job->errorString(); - if (errorString.isEmpty()) { - Q_EMIT errorMessage(i18nc("@info:status", "Unknown error.")); - } else { - Q_EMIT errorMessage(errorString); - } - } -} - diff --git a/src/kitemviews/private/kfileitemmodeldirlister.h b/src/kitemviews/private/kfileitemmodeldirlister.h deleted file mode 100644 index 563695975..000000000 --- a/src/kitemviews/private/kfileitemmodeldirlister.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2006-2012 Peter Penz <[email protected]> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#ifndef KFILEITEMMODELDIRLISTER_H -#define KFILEITEMMODELDIRLISTER_H - -#include "dolphin_export.h" - -#include <KDirLister> - -#include <QUrl> - -/** - * @brief Extends the class KDirLister by emitting a signal when an - * error occurred instead of showing an error dialog. - * KDirLister::autoErrorHandlingEnabled() is set to false. - */ -class DOLPHIN_EXPORT KFileItemModelDirLister : public KDirLister -{ - Q_OBJECT - -public: - explicit KFileItemModelDirLister(QObject* parent = nullptr); - ~KFileItemModelDirLister() override; - -Q_SIGNALS: - /** Is emitted whenever an error has occurred. */ - void errorMessage(const QString& msg); - - /** - * Is emitted when the URL of the directory lister represents a file. - * In this case no signal errorMessage() will be emitted. - */ - void urlIsFileError(const QUrl& url); - -protected: - void handleError(KIO::Job* job) override; -}; - -#endif |
