diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -49,7 +49,7 @@ Q_OBJECT public: - explicit PlacesItemModel(QObject* parent = nullptr); + explicit PlacesItemModel(QWidget* parent = nullptr); ~PlacesItemModel() override; /** @@ -97,9 +97,11 @@ QAction* ejectAction(int index) const; QAction* teardownAction(int index) const; + QAction* propertiesAction(int index) const; void requestEject(int index); void requestTearDown(int index); + void requestProperties(int index); bool storageSetupNeeded(int index) const; void requestStorageSetup(int index); @@ -231,6 +233,8 @@ KFilePlacesModel *m_sourceModel; QVector m_indexMap; + + QWidget* m_parent; }; #endif diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -55,12 +56,13 @@ }; } -PlacesItemModel::PlacesItemModel(QObject* parent) : +PlacesItemModel::PlacesItemModel(QWidget* parent) : KStandardItemModel(parent), m_hiddenItemsShown(false), m_deviceToTearDown(nullptr), m_storageSetupInProgress(), - m_sourceModel(DolphinPlacesModelSingleton::instance().placesModel()) + m_sourceModel(DolphinPlacesModelSingleton::instance().placesModel()), + m_parent(parent) { cleanupBookmarks(); loadBookmarks(); @@ -294,6 +296,56 @@ } } +QAction* PlacesItemModel::propertiesAction(int index) const +{ + const PlacesItem* item = placesItem(index); + if (!item) { + return nullptr; + } + + if (!item->udi().isEmpty()) { + Solid::Device device = item->device(); + Solid::StorageDrive* drive = device.as(); + if (!drive) { + drive = device.parent().as(); + } + + if (drive->driveType() != Solid::StorageDrive::HardDisk) { + return nullptr; + } + + // Do not show the 'Properties' context menu entry if the drive is not mounted + Solid::StorageAccess* access = device.as(); + if (!access || !access->isAccessible()) { + return nullptr; + } + } else { + return nullptr; + } + + return new QAction(QIcon::fromTheme(QStringLiteral("document-properties")), i18nc("@action:inmenu", "Properties"), nullptr); +} + +void PlacesItemModel::requestProperties(int index) +{ + const PlacesItem* item = placesItem(index); + if (!item) { + return; + } + + KPropertiesDialog* dialog; + if (item->udi().isEmpty()) { + dialog = new KPropertiesDialog(item->url(), m_parent); + } else { + Solid::Device device = item->device(); + Solid::StorageAccess* access = device.as(); + dialog = new KPropertiesDialog(QUrl("file://" + access->filePath()), m_parent); + } + + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); +} + bool PlacesItemModel::storageSetupNeeded(int index) const { const PlacesItem* item = placesItem(index); diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -169,9 +169,11 @@ QAction* editAction = nullptr; QAction* teardownAction = nullptr; QAction* ejectAction = nullptr; + QAction* propertiesAction = nullptr; const bool isDevice = !item->udi().isEmpty(); const bool isTrash = (item->url().scheme() == QLatin1String("trash")); + if (isDevice) { ejectAction = m_model->ejectAction(index); if (ejectAction) { @@ -206,6 +208,15 @@ editAction = menu.addAction(QIcon::fromTheme("document-properties"), i18nc("@item:inmenu", "Edit...")); } + if (!isTrash) { + propertiesAction = m_model->propertiesAction(index); + if (propertiesAction) { + propertiesAction->setParent(&menu); + menu.addAction(propertiesAction); + } + + } + QAction* removeAction = nullptr; if (!isDevice && !item->isSystemItem()) { removeAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18nc("@item:inmenu", "Remove")); @@ -247,6 +258,8 @@ m_model->requestTearDown(index); } else if (action == ejectAction) { m_model->requestEject(index); + } else if (action == propertiesAction) { + m_model->requestProperties(index); } } }