diff --git a/plugins/disk-mount/diskcontrolwidget.cpp b/plugins/disk-mount/diskcontrolwidget.cpp index 4a54639f6..4e78c4dff 100644 --- a/plugins/disk-mount/diskcontrolwidget.cpp +++ b/plugins/disk-mount/diskcontrolwidget.cpp @@ -27,6 +27,12 @@ DiskControlWidget::DiskControlWidget(QWidget *parent) QMetaObject::invokeMethod(this, "diskListChanged", Qt::QueuedConnection); } +void DiskControlWidget::unmountAll() +{ + for (auto disk : m_diskInfoList) + unmountDisk(disk.m_id); +} + void DiskControlWidget::diskListChanged() { m_diskInfoList = m_diskInter->diskList(); diff --git a/plugins/disk-mount/diskcontrolwidget.h b/plugins/disk-mount/diskcontrolwidget.h index 66385b8a6..5775b58dd 100644 --- a/plugins/disk-mount/diskcontrolwidget.h +++ b/plugins/disk-mount/diskcontrolwidget.h @@ -13,6 +13,8 @@ class DiskControlWidget : public QScrollArea public: explicit DiskControlWidget(QWidget *parent = 0); + void unmountAll(); + signals: void diskCountChanged(const int count) const; diff --git a/plugins/disk-mount/diskmountplugin.cpp b/plugins/disk-mount/diskmountplugin.cpp index 17ac8f23d..793f920a8 100644 --- a/plugins/disk-mount/diskmountplugin.cpp +++ b/plugins/disk-mount/diskmountplugin.cpp @@ -1,5 +1,8 @@ #include "diskmountplugin.h" +#define OPEN "open" +#define UNMOUNT_ALL "unmount_all" + DiskMountPlugin::DiskMountPlugin(QObject *parent) : QObject(parent), @@ -14,6 +17,8 @@ DiskMountPlugin::DiskMountPlugin(QObject *parent) m_tipsLabel->setText(tr("Disk")); m_tipsLabel->setStyleSheet("color:white;" "padding:5px 10px;"); + + connect(m_diskPluginItem, &DiskPluginItem::requestContextMenu, [this] {m_proxyInter->requestContextMenu(this, QString());}); } const QString DiskMountPlugin::pluginName() const @@ -50,6 +55,44 @@ QWidget *DiskMountPlugin::itemPopupApplet(const QString &itemKey) return m_diskControlApplet; } +const QString DiskMountPlugin::itemContextMenu(const QString &itemKey) +{ + Q_UNUSED(itemKey); + + QList items; + items.reserve(2); + + QMap open; + open["itemId"] = OPEN; + open["itemText"] = tr("Open"); + open["isActive"] = true; + items.push_back(open); + + QMap unmountAll; + unmountAll["itemId"] = UNMOUNT_ALL; + unmountAll["itemText"] = tr("Unmount all"); + unmountAll["isActive"] = true; + items.push_back(unmountAll); + + QMap menu; + menu["items"] = items; + menu["checkableMenu"] = false; + menu["singleCheck"] = false; + + return QJsonDocument::fromVariant(menu).toJson(); +} + +void DiskMountPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) +{ + Q_UNUSED(itemKey) + Q_UNUSED(checked) + + if (menuId == OPEN) + QProcess::startDetached("gvfs-open", QStringList() << QDir::homePath()); + else if (menuId == UNMOUNT_ALL) + m_diskControlApplet->unmountAll(); +} + void DiskMountPlugin::initCompoments() { m_diskControlApplet = new DiskControlWidget; diff --git a/plugins/disk-mount/diskmountplugin.h b/plugins/disk-mount/diskmountplugin.h index 4522548a0..ae92ac94b 100644 --- a/plugins/disk-mount/diskmountplugin.h +++ b/plugins/disk-mount/diskmountplugin.h @@ -23,6 +23,9 @@ public: QWidget *itemTipsWidget(const QString &itemKey); QWidget *itemPopupApplet(const QString &itemKey); + const QString itemContextMenu(const QString &itemKey); + void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked); + private: void initCompoments(); diff --git a/plugins/disk-mount/diskpluginitem.cpp b/plugins/disk-mount/diskpluginitem.cpp index 412843ea3..2d0e25cce 100644 --- a/plugins/disk-mount/diskpluginitem.cpp +++ b/plugins/disk-mount/diskpluginitem.cpp @@ -42,7 +42,10 @@ void DiskPluginItem::mousePressEvent(QMouseEvent *e) const QPoint p(e->pos() - rect().center()); if (p.manhattanLength() < std::min(width(), height()) * 0.8 * 0.5) + { + emit requestContextMenu(); return; + } QWidget::mousePressEvent(e); } diff --git a/plugins/disk-mount/diskpluginitem.h b/plugins/disk-mount/diskpluginitem.h index 00faf7305..4bd95ddf9 100644 --- a/plugins/disk-mount/diskpluginitem.h +++ b/plugins/disk-mount/diskpluginitem.h @@ -13,6 +13,9 @@ class DiskPluginItem : public QWidget public: explicit DiskPluginItem(QWidget *parent = 0); +signals: + void requestContextMenu() const; + public slots: void setDockDisplayMode(const Dock::DisplayMode mode);