From ca52556f5b7ec9ec8fd7142864e838fc8da05b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Wed, 15 Jun 2016 16:17:51 +0800 Subject: [PATCH] add menu Change-Id: I03343f5259c765d0437b2d4f193c35058d700787 --- dbus/dbusdockentry.h | 5 +++ dbus/dbusmenu.cpp | 10 +++--- dbus/dbusmenu.h | 47 ++++++++++++++++--------- dbus/dbusmenumanager.cpp | 35 +++++++++++++++++++ dbus/dbusmenumanager.h | 75 ++++++++++++++++++++++++++++++++++++++++ dde-dock.pro | 10 +++--- item/appitem.cpp | 21 +++++++++-- item/appitem.h | 6 ++-- item/dockitem.cpp | 57 +++++++++++++++++++++++++++++- item/dockitem.h | 8 +++++ item/launcheritem.cpp | 4 ++- 11 files changed, 246 insertions(+), 32 deletions(-) create mode 100644 dbus/dbusmenumanager.cpp create mode 100644 dbus/dbusmenumanager.h diff --git a/dbus/dbusdockentry.h b/dbus/dbusdockentry.h index 82cab3c15..b155c0fa5 100644 --- a/dbus/dbusdockentry.h +++ b/dbus/dbusdockentry.h @@ -77,6 +77,10 @@ public: inline QString icon() const { return qvariant_cast< QString >(property("Icon")); } + Q_PROPERTY(QString Menu READ menu NOTIFY MenuChanged) + inline QString menu() const + { return qvariant_cast< QString >(property("Menu")); } + public Q_SLOTS: // METHODS inline QDBusPendingReply<> Activate() { @@ -99,6 +103,7 @@ void DataChanged(); void IdChanged(); void TitleChanged(); void IconChanged(); +void MenuChanged(); }; namespace dde { diff --git a/dbus/dbusmenu.cpp b/dbus/dbusmenu.cpp index ff70802c8..51ad7dcd8 100644 --- a/dbus/dbusmenu.cpp +++ b/dbus/dbusmenu.cpp @@ -9,7 +9,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * Command line was: qdbusxml2cpp -c DBusMenu -p dbusmenu com.deepin.menu.Menu.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -21,15 +21,15 @@ #include "dbusmenu.h" /* - * Implementation of interface class DBusMenuManager + * Implementation of interface class DBusMenu */ -DBusMenuManager::DBusMenuManager(QObject *parent) - : QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent) +DBusMenu::DBusMenu(const QString &path, QObject *parent) + : QDBusAbstractInterface(staticServerPath(), path, staticInterfaceName(), QDBusConnection::sessionBus(), parent) { } -DBusMenuManager::~DBusMenuManager() +DBusMenu::~DBusMenu() { } diff --git a/dbus/dbusmenu.h b/dbus/dbusmenu.h index 767c98ff0..e338338cf 100644 --- a/dbus/dbusmenu.h +++ b/dbus/dbusmenu.h @@ -9,7 +9,7 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * Command line was: qdbusxml2cpp -c DBusMenu -p dbusmenu com.deepin.menu.Menu.xml * * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). * @@ -17,8 +17,8 @@ * Do not edit! All changes made to it will be lost. */ -#ifndef DBUSMENUMANAGER_H_1436158928 -#define DBUSMENUMANAGER_H_1436158928 +#ifndef DBUSMENU_H_1436158836 +#define DBUSMENU_H_1436158836 #include #include @@ -30,45 +30,60 @@ #include /* - * Proxy class for interface com.deepin.menu.Manager + * Proxy class for interface com.deepin.menu.Menu */ -class DBusMenuManager: public QDBusAbstractInterface +class DBusMenu: public QDBusAbstractInterface { Q_OBJECT public: static inline const char *staticServerPath() { return "com.deepin.menu"; } - static inline const char *staticInterfacePath() - { return "/com/deepin/menu"; } static inline const char *staticInterfaceName() - { return "com.deepin.menu.Manager"; } + { return "com.deepin.menu.Menu"; } public: - explicit DBusMenuManager(QObject *parent = 0); + DBusMenu(const QString &path,QObject *parent = 0); - ~DBusMenuManager(); + ~DBusMenu(); public Q_SLOTS: // METHODS - inline QDBusPendingReply RegisterMenu() + inline QDBusPendingReply<> SetItemActivity(const QString &itemId, bool isActive) { QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("RegisterMenu"), argumentList); + argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(isActive); + return asyncCallWithArgumentList(QStringLiteral("SetItemActivity"), argumentList); } - inline QDBusPendingReply<> UnregisterMenu(const QString &menuObjectPath) + inline QDBusPendingReply<> SetItemChecked(const QString &itemId, bool checked) { QList argumentList; - argumentList << QVariant::fromValue(menuObjectPath); - return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList); + argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(checked); + return asyncCallWithArgumentList(QStringLiteral("SetItemChecked"), argumentList); + } + + inline QDBusPendingReply<> SetItemText(const QString &itemId, const QString &text) + { + QList argumentList; + argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(text); + return asyncCallWithArgumentList(QStringLiteral("SetItemText"), argumentList); + } + + inline QDBusPendingReply<> ShowMenu(const QString &menuJsonContent) + { + QList argumentList; + argumentList << QVariant::fromValue(menuJsonContent); + return asyncCallWithArgumentList(QStringLiteral("ShowMenu"), argumentList); } Q_SIGNALS: // SIGNALS + void ItemInvoked(const QString &itemId, bool checked); + void MenuUnregistered(); }; namespace com { namespace deepin { namespace menu { - typedef ::DBusMenuManager Manager; + typedef ::DBusMenu Menu; } } } diff --git a/dbus/dbusmenumanager.cpp b/dbus/dbusmenumanager.cpp new file mode 100644 index 000000000..4f6e3d2e7 --- /dev/null +++ b/dbus/dbusmenumanager.cpp @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2015 Deepin Technology Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + **/ + +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusmenumanager.h" + +/* + * Implementation of interface class DBusMenuManager + */ + +DBusMenuManager::DBusMenuManager(QObject *parent) + : QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent) +{ +} + +DBusMenuManager::~DBusMenuManager() +{ +} + diff --git a/dbus/dbusmenumanager.h b/dbus/dbusmenumanager.h new file mode 100644 index 000000000..767c98ff0 --- /dev/null +++ b/dbus/dbusmenumanager.h @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2015 Deepin Technology Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + **/ + +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSMENUMANAGER_H_1436158928 +#define DBUSMENUMANAGER_H_1436158928 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface com.deepin.menu.Manager + */ +class DBusMenuManager: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticServerPath() + { return "com.deepin.menu"; } + static inline const char *staticInterfacePath() + { return "/com/deepin/menu"; } + static inline const char *staticInterfaceName() + { return "com.deepin.menu.Manager"; } + +public: + explicit DBusMenuManager(QObject *parent = 0); + + ~DBusMenuManager(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply RegisterMenu() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("RegisterMenu"), argumentList); + } + + inline QDBusPendingReply<> UnregisterMenu(const QString &menuObjectPath) + { + QList argumentList; + argumentList << QVariant::fromValue(menuObjectPath); + return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace com { + namespace deepin { + namespace menu { + typedef ::DBusMenuManager Manager; + } + } +} +#endif diff --git a/dde-dock.pro b/dde-dock.pro index 7ef0cc469..f6621fcc3 100644 --- a/dde-dock.pro +++ b/dde-dock.pro @@ -19,9 +19,10 @@ SOURCES += main.cpp \ item/placeholderitem.cpp \ dbus/dbusclientmanager.cpp \ dbus/dbusdock.cpp \ - dbus/dbusmenu.cpp \ util/themeappicon.cpp \ - item/launcheritem.cpp + item/launcheritem.cpp \ + dbus/dbusmenumanager.cpp \ + dbus/dbusmenu.cpp HEADERS += \ window/mainwindow.h \ @@ -36,6 +37,7 @@ HEADERS += \ item/placeholderitem.h \ dbus/dbusclientmanager.h \ dbus/dbusdock.h \ - dbus/dbusmenu.h \ util/themeappicon.h \ - item/launcheritem.h + item/launcheritem.h \ + dbus/dbusmenumanager.h \ + dbus/dbusmenu.h diff --git a/item/appitem.cpp b/item/appitem.cpp index 99b6092fa..03de98203 100644 --- a/item/appitem.cpp +++ b/item/appitem.cpp @@ -12,6 +12,7 @@ #define APP_DRAG_THRESHOLD 20 +QPoint AppItem::MousePressPos; DBusClientManager *AppItem::ClientInter = nullptr; //uint AppItem::ActiveWindowId = 0; @@ -80,7 +81,10 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) void AppItem::mousePressEvent(QMouseEvent *e) { - m_mousePressPos = e->pos(); + DockItem::mousePressEvent(e); + + if (e->button() == Qt::LeftButton) + MousePressPos = e->pos(); } void AppItem::mouseMoveEvent(QMouseEvent *e) @@ -91,7 +95,7 @@ void AppItem::mouseMoveEvent(QMouseEvent *e) if (e->buttons() != Qt::LeftButton) return; - const QPoint distance = e->pos() - m_mousePressPos; + const QPoint distance = e->pos() - MousePressPos; if (distance.manhattanLength() < APP_DRAG_THRESHOLD) return; @@ -105,6 +109,17 @@ void AppItem::resizeEvent(QResizeEvent *e) updateIcon(); } +void AppItem::invokedMenuItem(const QString &itemId, const bool checked) +{ + Q_UNUSED(itemId) + Q_UNUSED(checked) +} + +const QString AppItem::contextMenu() const +{ + return m_itemEntry->menu(); +} + void AppItem::startDrag() { m_draging = true; @@ -147,7 +162,7 @@ void AppItem::updateTitle() void AppItem::updateIcon() { const QString icon = m_itemEntry->icon(); - const int iconSize = qMin(width(), height()) * 0.8; + const int iconSize = qMin(width(), height()) * 0.6; m_icon = ThemeAppIcon::getIcon(icon, iconSize); } diff --git a/item/appitem.h b/item/appitem.h index 514f88787..547953737 100644 --- a/item/appitem.h +++ b/item/appitem.h @@ -21,6 +21,9 @@ private: void mouseMoveEvent(QMouseEvent *e); void resizeEvent(QResizeEvent *e); + void invokedMenuItem(const QString &itemId, const bool checked); + const QString contextMenu() const; + void startDrag(); void initClientManager(); @@ -37,8 +40,7 @@ private: QString m_id; QPixmap m_icon; - QPoint m_mousePressPos; - + static QPoint MousePressPos; static DBusClientManager *ClientInter; // static uint ActiveWindowId; }; diff --git a/item/dockitem.cpp b/item/dockitem.cpp index df7360aab..eae22c468 100644 --- a/item/dockitem.cpp +++ b/item/dockitem.cpp @@ -1,9 +1,16 @@ + #include "dockitem.h" +#include "dbus/dbusmenu.h" + +#include +#include DockItem::DockItem(const ItemType type, QWidget *parent) : QWidget(parent), m_side(DockSettings::Top), - m_type(type) + m_type(type), + + m_menuManagerInter(new DBusMenuManager(this)) { } @@ -23,3 +30,51 @@ void DockItem::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); } + +void DockItem::mousePressEvent(QMouseEvent *e) +{ + if (e->button() == Qt::RightButton) + return showContextMenu(); +} + +void DockItem::showContextMenu() +{ + const QString menuJson = contextMenu(); + if (menuJson.isEmpty()) + return; + + QDBusPendingReply result = m_menuManagerInter->RegisterMenu(); + + result.waitForFinished(); + if (result.isError()) + { + qWarning() << result.error(); + return; + } + + const QPoint p = mapToGlobal(pos()); + QJsonObject menuObject; + menuObject.insert("x", QJsonValue(p.x() + width() / 2)); + menuObject.insert("y", QJsonValue(p.y())); + menuObject.insert("isDockMenu", QJsonValue(true)); + menuObject.insert("menuJsonContent", QJsonValue(menuJson)); + + const QDBusObjectPath path = result.argumentAt(0).value(); + DBusMenu *menuInter = new DBusMenu(path.path(), this); + + connect(menuInter, &DBusMenu::ItemInvoked, this, &DockItem::invokedMenuItem); + connect(menuInter, &DBusMenu::MenuUnregistered, menuInter, &DBusMenu::deleteLater, Qt::QueuedConnection); + + menuInter->ShowMenu(QString(QJsonDocument(menuObject).toJson())); +} + +void DockItem::invokedMenuItem(const QString &itemId, const bool checked) +{ + Q_UNUSED(itemId) + Q_UNUSED(checked) +} + +const QString DockItem::contextMenu() const +{ + return ""; +} diff --git a/item/dockitem.h b/item/dockitem.h index 4cd927402..fb35dd630 100644 --- a/item/dockitem.h +++ b/item/dockitem.h @@ -4,6 +4,7 @@ #include #include "util/docksettings.h" +#include "dbus/dbusmenumanager.h" class DockItem : public QWidget { @@ -25,10 +26,17 @@ public: protected: void paintEvent(QPaintEvent *e); + void mousePressEvent(QMouseEvent *e); + + void showContextMenu(); + virtual void invokedMenuItem(const QString &itemId, const bool checked); + virtual const QString contextMenu() const; protected: DockSettings::DockSide m_side; ItemType m_type; + + DBusMenuManager *m_menuManagerInter; }; #endif // DOCKITEM_H diff --git a/item/launcheritem.cpp b/item/launcheritem.cpp index 08a1188d6..a9eeb5ea2 100644 --- a/item/launcheritem.cpp +++ b/item/launcheritem.cpp @@ -3,6 +3,7 @@ #include #include +#include LauncherItem::LauncherItem(QWidget *parent) : DockItem(DockItem::Launcher, parent) @@ -26,7 +27,8 @@ void LauncherItem::resizeEvent(QResizeEvent *e) void LauncherItem::mousePressEvent(QMouseEvent *e) { - DockItem::mousePressEvent(e); + if (e->button() != Qt::LeftButton) + return; QProcess *proc = new QProcess;