X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5360bc3ab328c8b1161b0c5df9c5785829a3e880..f9baca9288187cf9e9a58a3e8d4c2ad2155d6f46:/src/dolphinplacesmodelsingleton.cpp diff --git a/src/dolphinplacesmodelsingleton.cpp b/src/dolphinplacesmodelsingleton.cpp index 30ec1b9b6..c31ffc4c3 100644 --- a/src/dolphinplacesmodelsingleton.cpp +++ b/src/dolphinplacesmodelsingleton.cpp @@ -5,12 +5,101 @@ */ #include "dolphinplacesmodelsingleton.h" +#include "trash/dolphintrash.h" #include #include +#include + +DolphinPlacesModel::DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent) + : KFilePlacesModel(alternativeApplicationName, parent) +{ + connect(&Trash::instance(), &Trash::emptinessChanged, this, &DolphinPlacesModel::slotTrashEmptinessChanged); +} + +DolphinPlacesModel::~DolphinPlacesModel() = default; + +bool DolphinPlacesModel::panelsLocked() const +{ + return m_panelsLocked; +} + +void DolphinPlacesModel::setPanelsLocked(bool locked) +{ + if (m_panelsLocked == locked) { + return; + } + + m_panelsLocked = locked; + + if (rowCount() > 0) { + int lastPlace = rowCount() - 1; + + for (int i = 0; i < rowCount(); ++i) { + if (KFilePlacesModel::groupType(index(i, 0)) != KFilePlacesModel::PlacesType) { + lastPlace = i - 1; + break; + } + } + + Q_EMIT dataChanged(index(0, 0), index(lastPlace, 0), {KFilePlacesModel::GroupRole}); + } +} + +QVariant DolphinPlacesModel::data(const QModelIndex &index, int role) const +{ + switch (role) { + case Qt::DecorationRole: + if (isTrash(index)) { + if (m_isEmpty) { + return QIcon::fromTheme(QStringLiteral("user-trash")); + } else { + return QIcon::fromTheme(QStringLiteral("user-trash-full")); + } + } + break; + case KFilePlacesModel::GroupRole: { + // When panels are unlocked, avoid a double "Places" heading, + // one from the panel title bar, one from the places view section. + if (!m_panelsLocked) { + const auto groupType = KFilePlacesModel::groupType(index); + if (groupType == KFilePlacesModel::PlacesType) { + return QString(); + } + } + break; + } + } + + return KFilePlacesModel::data(index, role); +} + +void DolphinPlacesModel::slotTrashEmptinessChanged(bool isEmpty) +{ + if (m_isEmpty == isEmpty) { + return; + } + + // NOTE Trash::isEmpty() reads the config file whereas emptinessChanged is + // hooked up to whether a dirlister in trash:/ has any files and they disagree... + m_isEmpty = isEmpty; + + for (int i = 0; i < rowCount(); ++i) { + const QModelIndex index = this->index(i, 0); + if (isTrash(index)) { + Q_EMIT dataChanged(index, index, {Qt::DecorationRole}); + } + } +} + +bool DolphinPlacesModel::isTrash(const QModelIndex &index) const +{ + return url(index) == QUrl(QStringLiteral("trash:/")); +} + DolphinPlacesModelSingleton::DolphinPlacesModelSingleton() - : m_placesModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + applicationNameSuffix())) + : m_placesModel(new DolphinPlacesModel(KAboutData::applicationData().componentName() + applicationNameSuffix())) { } @@ -21,7 +110,7 @@ DolphinPlacesModelSingleton &DolphinPlacesModelSingleton::instance() return s_self; } -KFilePlacesModel *DolphinPlacesModelSingleton::placesModel() const +DolphinPlacesModel *DolphinPlacesModelSingleton::placesModel() const { return m_placesModel.data(); }