X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ce7852fb2352155e4373f9a41f0a01549985bd45..b889a446bfe851a7f49821d469c5f3041b6e5774:/src/dolphinplacesmodelsingleton.cpp diff --git a/src/dolphinplacesmodelsingleton.cpp b/src/dolphinplacesmodelsingleton.cpp index 754070c92..301150394 100644 --- a/src/dolphinplacesmodelsingleton.cpp +++ b/src/dolphinplacesmodelsingleton.cpp @@ -6,23 +6,70 @@ #include "dolphinplacesmodelsingleton.h" #include "trash/dolphintrash.h" +#include "views/draganddrophelper.h" #include -#include #include +#include -DolphinPlacesModel::DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent) - : KFilePlacesModel(alternativeApplicationName, parent) +DolphinPlacesModel::DolphinPlacesModel(QObject *parent) + : KFilePlacesModel(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}); + } +} + +QStringList DolphinPlacesModel::mimeTypes() const +{ + QStringList types = KFilePlacesModel::mimeTypes(); + types << DragAndDropHelper::arkDndServiceMimeType() << DragAndDropHelper::arkDndPathMimeType(); + return types; +} + +bool DolphinPlacesModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + // We make the view accept the drag by returning them from mimeTypes() + // but the drop should be handled exclusively by PlacesPanel::slotUrlsDropped + if (DragAndDropHelper::isArkDndMimeType(data)) { + return false; + } + + return KFilePlacesModel::dropMimeData(data, action, row, column, parent); +} + QVariant DolphinPlacesModel::data(const QModelIndex &index, int role) const { - if (role == Qt::DecorationRole) { + switch (role) { + case Qt::DecorationRole: if (isTrash(index)) { if (m_isEmpty) { return QIcon::fromTheme(QStringLiteral("user-trash")); @@ -30,6 +77,18 @@ QVariant DolphinPlacesModel::data(const QModelIndex &index, int role) const 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); @@ -59,9 +118,8 @@ bool DolphinPlacesModel::isTrash(const QModelIndex &index) const } DolphinPlacesModelSingleton::DolphinPlacesModelSingleton() - : m_placesModel(new DolphinPlacesModel(KAboutData::applicationData().componentName() + applicationNameSuffix())) + : m_placesModel(new DolphinPlacesModel()) { - } DolphinPlacesModelSingleton &DolphinPlacesModelSingleton::instance() @@ -70,12 +128,9 @@ DolphinPlacesModelSingleton &DolphinPlacesModelSingleton::instance() return s_self; } -KFilePlacesModel *DolphinPlacesModelSingleton::placesModel() const +DolphinPlacesModel *DolphinPlacesModelSingleton::placesModel() const { return m_placesModel.data(); } -QString DolphinPlacesModelSingleton::applicationNameSuffix() -{ - return QStringLiteral("-places-panel"); -} +#include "moc_dolphinplacesmodelsingleton.cpp"