From 9f7289cea3fd1955e09d1c58fd805b50efb05aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B8=87=E9=9D=92?= Date: Mon, 6 Jul 2015 15:02:48 +0800 Subject: [PATCH] Add dde-dock item menu --- dde-dock/dde-dock.pro | 8 ++- dde-dock/src/Controller/appmanager.h | 2 - dde-dock/src/DBus/dbusmenu.cpp | 26 +++++++++ dde-dock/src/DBus/dbusmenu.h | 81 +++++++++++++++++++++++++++ dde-dock/src/DBus/dbusmenumanager.cpp | 26 +++++++++ dde-dock/src/DBus/dbusmenumanager.h | 66 ++++++++++++++++++++++ dde-dock/src/Widgets/appitem.cpp | 43 +++++++++++--- dde-dock/src/Widgets/appitem.h | 9 +++ dde-dock/src/mainwidget.cpp | 4 +- 9 files changed, 252 insertions(+), 13 deletions(-) create mode 100644 dde-dock/src/DBus/dbusmenu.cpp create mode 100644 dde-dock/src/DBus/dbusmenu.h create mode 100644 dde-dock/src/DBus/dbusmenumanager.cpp create mode 100644 dde-dock/src/DBus/dbusmenumanager.h diff --git a/dde-dock/dde-dock.pro b/dde-dock/dde-dock.pro index 44e7d45c5..459af6170 100644 --- a/dde-dock/dde-dock.pro +++ b/dde-dock/dde-dock.pro @@ -33,7 +33,9 @@ SOURCES += \ src/DBus/dbusclientmanager.cpp \ src/DBus/dbusdockedappmanager.cpp \ src/DBus/dbusdocksetting.cpp \ - src/pluginitemwrapper.cpp + src/pluginitemwrapper.cpp \ + src/DBus/dbusmenumanager.cpp \ + src/DBus/dbusmenu.cpp HEADERS += \ src/abstractdockitem.h \ @@ -57,7 +59,9 @@ HEADERS += \ src/DBus/dbusclientmanager.h \ src/DBus/dbusdockedappmanager.h \ src/DBus/dbusdocksetting.h \ - src/pluginitemwrapper.h + src/pluginitemwrapper.h \ + src/DBus/dbusmenumanager.h \ + src/DBus/dbusmenu.h RESOURCES += \ images.qrc \ diff --git a/dde-dock/src/Controller/appmanager.h b/dde-dock/src/Controller/appmanager.h index 1d7cb0190..d19edb7ca 100644 --- a/dde-dock/src/Controller/appmanager.h +++ b/dde-dock/src/Controller/appmanager.h @@ -2,8 +2,6 @@ #define APPMANAGER_H #include -#include -#include #include #include "DBus/dbusentrymanager.h" #include "DBus/dbusentryproxyer.h" diff --git a/dde-dock/src/DBus/dbusmenu.cpp b/dde-dock/src/DBus/dbusmenu.cpp new file mode 100644 index 000000000..f0817f4a3 --- /dev/null +++ b/dde-dock/src/DBus/dbusmenu.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * 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). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusmenu.h" + +/* + * Implementation of interface class DBusMenu + */ + +DBusMenu::DBusMenu(const QString &path, QObject *parent) + : QDBusAbstractInterface(staticServerPath(), path, staticInterfaceName(), QDBusConnection::sessionBus(), parent) +{ +} + +DBusMenu::~DBusMenu() +{ +} + diff --git a/dde-dock/src/DBus/dbusmenu.h b/dde-dock/src/DBus/dbusmenu.h new file mode 100644 index 000000000..804badfb7 --- /dev/null +++ b/dde-dock/src/DBus/dbusmenu.h @@ -0,0 +1,81 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * 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). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSMENU_H_1436158836 +#define DBUSMENU_H_1436158836 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface com.deepin.menu.Menu + */ +class DBusMenu: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticServerPath() + { return "com.deepin.menu"; } + static inline const char *staticInterfaceName() + { return "com.deepin.menu.Menu"; } + +public: + DBusMenu(const QString &path,QObject *parent = 0); + + ~DBusMenu(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> SetItemActivity(const QString &itemId, bool isActive) + { + QList argumentList; + argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(isActive); + return asyncCallWithArgumentList(QStringLiteral("SetItemActivity"), argumentList); + } + + inline QDBusPendingReply<> SetItemChecked(const QString &itemId, bool checked) + { + QList 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 ::DBusMenu Menu; + } + } +} +#endif diff --git a/dde-dock/src/DBus/dbusmenumanager.cpp b/dde-dock/src/DBus/dbusmenumanager.cpp new file mode 100644 index 000000000..992fea138 --- /dev/null +++ b/dde-dock/src/DBus/dbusmenumanager.cpp @@ -0,0 +1,26 @@ +/* + * 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/dde-dock/src/DBus/dbusmenumanager.h b/dde-dock/src/DBus/dbusmenumanager.h new file mode 100644 index 000000000..a0de80046 --- /dev/null +++ b/dde-dock/src/DBus/dbusmenumanager.h @@ -0,0 +1,66 @@ +/* + * 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: + 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/src/Widgets/appitem.cpp b/dde-dock/src/Widgets/appitem.cpp index 1fc6957cb..66715eefa 100644 --- a/dde-dock/src/Widgets/appitem.cpp +++ b/dde-dock/src/Widgets/appitem.cpp @@ -9,7 +9,7 @@ AppItem::AppItem(QWidget *parent) : initClientManager(); connect(dockCons, &DockModeData::dockModeChanged,this, &AppItem::slotDockModeChanged); - + initMenu(); } void AppItem::setEntryProxyer(DBusEntryProxyer *entryProxyer) @@ -74,10 +74,6 @@ void AppItem::resizeBackground() void AppItem::dbusDataChanged(const QString &key, const QString &value) { -// qWarning() << "key:" << key << "value:" << value; - if (key == "app-status") - qWarning() << "====+++++++++" << value; - updateTitle(); updateState(); updateXids(); @@ -98,6 +94,12 @@ void AppItem::setCurrentOpened(uint value) } } +void AppItem::menuItemInvoked(QString id, bool) +{ + m_entryProxyer->HandleMenuItem(id); + m_menuManager->UnregisterMenu(m_menuInterfacePath); +} + void AppItem::resizeResources() { if (m_appIcon != NULL) @@ -188,6 +190,33 @@ void AppItem::updateMenuJsonString() m_itemData.menuJsonString = m_entryProxyer->data().value("menu"); } +void AppItem::initMenu() +{ + m_menuManager = new DBusMenuManager(this); +} + +void AppItem::showMenu(int x,int y) +{ + if (m_menuManager->isValid()){ + QDBusPendingReply pr = m_menuManager->RegisterMenu(); + if (pr.count() == 1){ + QDBusObjectPath op = pr.argumentAt(0).value(); + m_menuInterfacePath = op.path(); + DBusMenu *m_menu = new DBusMenu(m_menuInterfacePath,this); + connect(m_menu,SIGNAL(MenuUnregistered()),m_menu,SLOT(deleteLater())); + connect(m_menu,SIGNAL(ItemInvoked(QString,bool)),this,SLOT(menuItemInvoked(QString,bool))); + + QJsonObject targetObj; + targetObj.insert("x",QJsonValue(x)); + targetObj.insert("y",QJsonValue(y)); + targetObj.insert("isDockMenu",QJsonValue(true)); + targetObj.insert("menuJsonContent",QJsonValue(m_itemData.menuJsonString)); + + m_menu->ShowMenu(QString(QJsonDocument(targetObj).toJson())); + } + } +} + void AppItem::mousePressEvent(QMouseEvent * event) { //qWarning() << "mouse press..."; @@ -195,6 +224,8 @@ void AppItem::mousePressEvent(QMouseEvent * event) if (event->button() == Qt::LeftButton) m_entryProxyer->Activate(0,0); + else if (event->button() == Qt::RightButton) + showMenu(event->globalX(),event->globalY()); } void AppItem::mouseReleaseEvent(QMouseEvent * event) @@ -206,8 +237,6 @@ void AppItem::mouseReleaseEvent(QMouseEvent * event) void AppItem::mouseDoubleClickEvent(QMouseEvent * event) { emit mouseDoubleClick(); - ////////////FOR TEST ONLY///////////////////// - appBackground->setIsCurrentOpened(!appBackground->getIsCurrentOpened()); } void AppItem::mouseMoveEvent(QMouseEvent *event) diff --git a/dde-dock/src/Widgets/appitem.h b/dde-dock/src/Widgets/appitem.h index ee5a65150..853236839 100644 --- a/dde-dock/src/Widgets/appitem.h +++ b/dde-dock/src/Widgets/appitem.h @@ -13,9 +13,12 @@ #include #include #include +#include #include #include "DBus/dbusentryproxyer.h" #include "DBus/dbusclientmanager.h" +#include "DBus/dbusmenu.h" +#include "DBus/dbusmenumanager.h" #include "Controller/dockmodedata.h" #include "abstractdockitem.h" #include "appicon.h" @@ -62,6 +65,7 @@ private slots: void resizeBackground(); void dbusDataChanged(const QString &key, const QString &value); void setCurrentOpened(uint); + void menuItemInvoked(QString id,bool); private: void resizeResources(); @@ -75,6 +79,9 @@ private: void updateState(); void updateXids(); void updateMenuJsonString(); + void initMenu(); + + void showMenu(int x, int y); private: AppItemData m_itemData; @@ -84,6 +91,8 @@ private: AppBackground * appBackground = NULL; AppIcon * m_appIcon = NULL; + QString m_menuInterfacePath = ""; + DBusMenuManager *m_menuManager = NULL; }; #endif // APPITEM_H diff --git a/dde-dock/src/mainwidget.cpp b/dde-dock/src/mainwidget.cpp index 1ad99c781..d2369ef47 100644 --- a/dde-dock/src/mainwidget.cpp +++ b/dde-dock/src/mainwidget.cpp @@ -9,9 +9,9 @@ MainWidget::MainWidget(QWidget *parent) mainPanel->resize(this->width(),this->height()); mainPanel->move(0,0); - this->setWindowFlags(Qt::ToolTip); + this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); this->setAttribute(Qt::WA_TranslucentBackground); - this->move(0,rec.height() - 100); + this->move(0,rec.height()); connect(DockModeData::getInstants(), SIGNAL(dockModeChanged(DockConstants::DockMode,DockConstants::DockMode)), this, SLOT(slotDockModeChanged(DockConstants::DockMode,DockConstants::DockMode)));