Change-Id: I03343f5259c765d0437b2d4f193c35058d700787
This commit is contained in:
石博文 2016-06-15 16:17:51 +08:00 committed by Hualet Wang
parent aa56197885
commit ca52556f5b
11 changed files with 246 additions and 32 deletions

View File

@ -77,6 +77,10 @@ public:
inline QString icon() const inline QString icon() const
{ return qvariant_cast< QString >(property("Icon")); } { 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 public Q_SLOTS: // METHODS
inline QDBusPendingReply<> Activate() inline QDBusPendingReply<> Activate()
{ {
@ -99,6 +103,7 @@ void DataChanged();
void IdChanged(); void IdChanged();
void TitleChanged(); void TitleChanged();
void IconChanged(); void IconChanged();
void MenuChanged();
}; };
namespace dde { namespace dde {

View File

@ -9,7 +9,7 @@
/* /*
* This file was generated by qdbusxml2cpp version 0.8 * 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). * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
* *
@ -21,15 +21,15 @@
#include "dbusmenu.h" #include "dbusmenu.h"
/* /*
* Implementation of interface class DBusMenuManager * Implementation of interface class DBusMenu
*/ */
DBusMenuManager::DBusMenuManager(QObject *parent) DBusMenu::DBusMenu(const QString &path, QObject *parent)
: QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent) : QDBusAbstractInterface(staticServerPath(), path, staticInterfaceName(), QDBusConnection::sessionBus(), parent)
{ {
} }
DBusMenuManager::~DBusMenuManager() DBusMenu::~DBusMenu()
{ {
} }

View File

@ -9,7 +9,7 @@
/* /*
* This file was generated by qdbusxml2cpp version 0.8 * 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). * 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. * Do not edit! All changes made to it will be lost.
*/ */
#ifndef DBUSMENUMANAGER_H_1436158928 #ifndef DBUSMENU_H_1436158836
#define DBUSMENUMANAGER_H_1436158928 #define DBUSMENU_H_1436158836
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QByteArray> #include <QtCore/QByteArray>
@ -30,45 +30,60 @@
#include <QtDBus/QtDBus> #include <QtDBus/QtDBus>
/* /*
* 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 Q_OBJECT
public: public:
static inline const char *staticServerPath() static inline const char *staticServerPath()
{ return "com.deepin.menu"; } { return "com.deepin.menu"; }
static inline const char *staticInterfacePath()
{ return "/com/deepin/menu"; }
static inline const char *staticInterfaceName() static inline const char *staticInterfaceName()
{ return "com.deepin.menu.Manager"; } { return "com.deepin.menu.Menu"; }
public: public:
explicit DBusMenuManager(QObject *parent = 0); DBusMenu(const QString &path,QObject *parent = 0);
~DBusMenuManager(); ~DBusMenu();
public Q_SLOTS: // METHODS public Q_SLOTS: // METHODS
inline QDBusPendingReply<QDBusObjectPath> RegisterMenu() inline QDBusPendingReply<> SetItemActivity(const QString &itemId, bool isActive)
{ {
QList<QVariant> argumentList; QList<QVariant> 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<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << QVariant::fromValue(menuObjectPath); argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(checked);
return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList); return asyncCallWithArgumentList(QStringLiteral("SetItemChecked"), argumentList);
}
inline QDBusPendingReply<> SetItemText(const QString &itemId, const QString &text)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(text);
return asyncCallWithArgumentList(QStringLiteral("SetItemText"), argumentList);
}
inline QDBusPendingReply<> ShowMenu(const QString &menuJsonContent)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(menuJsonContent);
return asyncCallWithArgumentList(QStringLiteral("ShowMenu"), argumentList);
} }
Q_SIGNALS: // SIGNALS Q_SIGNALS: // SIGNALS
void ItemInvoked(const QString &itemId, bool checked);
void MenuUnregistered();
}; };
namespace com { namespace com {
namespace deepin { namespace deepin {
namespace menu { namespace menu {
typedef ::DBusMenuManager Manager; typedef ::DBusMenu Menu;
} }
} }
} }

35
dbus/dbusmenumanager.cpp Normal file
View File

@ -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()
{
}

75
dbus/dbusmenumanager.h Normal file
View File

@ -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 <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* 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<QDBusObjectPath> RegisterMenu()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("RegisterMenu"), argumentList);
}
inline QDBusPendingReply<> UnregisterMenu(const QString &menuObjectPath)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(menuObjectPath);
return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList);
}
Q_SIGNALS: // SIGNALS
};
namespace com {
namespace deepin {
namespace menu {
typedef ::DBusMenuManager Manager;
}
}
}
#endif

View File

@ -19,9 +19,10 @@ SOURCES += main.cpp \
item/placeholderitem.cpp \ item/placeholderitem.cpp \
dbus/dbusclientmanager.cpp \ dbus/dbusclientmanager.cpp \
dbus/dbusdock.cpp \ dbus/dbusdock.cpp \
dbus/dbusmenu.cpp \
util/themeappicon.cpp \ util/themeappicon.cpp \
item/launcheritem.cpp item/launcheritem.cpp \
dbus/dbusmenumanager.cpp \
dbus/dbusmenu.cpp
HEADERS += \ HEADERS += \
window/mainwindow.h \ window/mainwindow.h \
@ -36,6 +37,7 @@ HEADERS += \
item/placeholderitem.h \ item/placeholderitem.h \
dbus/dbusclientmanager.h \ dbus/dbusclientmanager.h \
dbus/dbusdock.h \ dbus/dbusdock.h \
dbus/dbusmenu.h \
util/themeappicon.h \ util/themeappicon.h \
item/launcheritem.h item/launcheritem.h \
dbus/dbusmenumanager.h \
dbus/dbusmenu.h

View File

@ -12,6 +12,7 @@
#define APP_DRAG_THRESHOLD 20 #define APP_DRAG_THRESHOLD 20
QPoint AppItem::MousePressPos;
DBusClientManager *AppItem::ClientInter = nullptr; DBusClientManager *AppItem::ClientInter = nullptr;
//uint AppItem::ActiveWindowId = 0; //uint AppItem::ActiveWindowId = 0;
@ -80,7 +81,10 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e)
void AppItem::mousePressEvent(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) void AppItem::mouseMoveEvent(QMouseEvent *e)
@ -91,7 +95,7 @@ void AppItem::mouseMoveEvent(QMouseEvent *e)
if (e->buttons() != Qt::LeftButton) if (e->buttons() != Qt::LeftButton)
return; return;
const QPoint distance = e->pos() - m_mousePressPos; const QPoint distance = e->pos() - MousePressPos;
if (distance.manhattanLength() < APP_DRAG_THRESHOLD) if (distance.manhattanLength() < APP_DRAG_THRESHOLD)
return; return;
@ -105,6 +109,17 @@ void AppItem::resizeEvent(QResizeEvent *e)
updateIcon(); 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() void AppItem::startDrag()
{ {
m_draging = true; m_draging = true;
@ -147,7 +162,7 @@ void AppItem::updateTitle()
void AppItem::updateIcon() void AppItem::updateIcon()
{ {
const QString icon = m_itemEntry->icon(); 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); m_icon = ThemeAppIcon::getIcon(icon, iconSize);
} }

View File

@ -21,6 +21,9 @@ private:
void mouseMoveEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e);
void resizeEvent(QResizeEvent *e); void resizeEvent(QResizeEvent *e);
void invokedMenuItem(const QString &itemId, const bool checked);
const QString contextMenu() const;
void startDrag(); void startDrag();
void initClientManager(); void initClientManager();
@ -37,8 +40,7 @@ private:
QString m_id; QString m_id;
QPixmap m_icon; QPixmap m_icon;
QPoint m_mousePressPos; static QPoint MousePressPos;
static DBusClientManager *ClientInter; static DBusClientManager *ClientInter;
// static uint ActiveWindowId; // static uint ActiveWindowId;
}; };

View File

@ -1,9 +1,16 @@
#include "dockitem.h" #include "dockitem.h"
#include "dbus/dbusmenu.h"
#include <QMouseEvent>
#include <QJsonObject>
DockItem::DockItem(const ItemType type, QWidget *parent) DockItem::DockItem(const ItemType type, QWidget *parent)
: QWidget(parent), : QWidget(parent),
m_side(DockSettings::Top), 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); 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<QDBusObjectPath> 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<QDBusObjectPath>();
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 "";
}

View File

@ -4,6 +4,7 @@
#include <QFrame> #include <QFrame>
#include "util/docksettings.h" #include "util/docksettings.h"
#include "dbus/dbusmenumanager.h"
class DockItem : public QWidget class DockItem : public QWidget
{ {
@ -25,10 +26,17 @@ public:
protected: protected:
void paintEvent(QPaintEvent *e); 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: protected:
DockSettings::DockSide m_side; DockSettings::DockSide m_side;
ItemType m_type; ItemType m_type;
DBusMenuManager *m_menuManagerInter;
}; };
#endif // DOCKITEM_H #endif // DOCKITEM_H

View File

@ -3,6 +3,7 @@
#include <QPainter> #include <QPainter>
#include <QProcess> #include <QProcess>
#include <QMouseEvent>
LauncherItem::LauncherItem(QWidget *parent) LauncherItem::LauncherItem(QWidget *parent)
: DockItem(DockItem::Launcher, parent) : DockItem(DockItem::Launcher, parent)
@ -26,7 +27,8 @@ void LauncherItem::resizeEvent(QResizeEvent *e)
void LauncherItem::mousePressEvent(QMouseEvent *e) void LauncherItem::mousePressEvent(QMouseEvent *e)
{ {
DockItem::mousePressEvent(e); if (e->button() != Qt::LeftButton)
return;
QProcess *proc = new QProcess; QProcess *proc = new QProcess;