Use DMenu to show panel menu

This commit is contained in:
杨万青 2015-07-13 20:24:27 +08:00
parent c0c3a0af55
commit 7116e4d030
4 changed files with 95 additions and 63 deletions

View File

@ -47,8 +47,6 @@ Panel::Panel(QWidget *parent)
proxy->plugin()->init(proxy);
}
panelMenu = new PanelMenu();
initAppManager();
slotDockModeChanged(dockCons->getDockMode(),dockCons->getDockMode());
@ -191,13 +189,7 @@ void Panel::showMenu()
{
QPoint tmpPos = QCursor::pos();
panelMenu->move(tmpPos.x(),tmpPos.y() - panelMenu->height());
panelMenu->show();
}
void Panel::hideMenu()
{
PanelMenu::instance()->showMenu(tmpPos.x(),tmpPos.y());
}
void Panel::initAppManager()

View File

@ -46,7 +46,6 @@ private:
void reanchorsLayout(Dock::DockMode mode);
void showMenu();
void hideMenu();
void initAppManager();
private:
@ -56,7 +55,6 @@ private:
QWidget * parentWidget = NULL;
ScreenMask * maskWidget = NULL;
DockModeData *dockCons = DockModeData::instance();
PanelMenu *panelMenu = NULL;
};
#endif // PANEL_H

View File

@ -1,63 +1,101 @@
#include "panelmenu.h"
PanelMenuItem::PanelMenuItem(QString text, QWidget *parent) : QLabel(text,parent)
PanelMenu * PanelMenu::m_panelMenu = NULL;
PanelMenu * PanelMenu::instance()
{
this->setAlignment(Qt::AlignCenter);
if (!m_panelMenu)
m_panelMenu = new PanelMenu();
return m_panelMenu;
}
void PanelMenuItem::mousePressEvent(QMouseEvent *event)
PanelMenu::PanelMenu(QObject *parent) : QObject(parent)
{
// emit itemClicked();
m_menuManager = new DBusMenuManager(this);
}
void PanelMenuItem::mouseReleaseEvent(QMouseEvent *event)
void PanelMenu::showMenu(int x, int y)
{
emit itemClicked();
if (m_menuManager && m_menuManager->isValid()){
QDBusPendingReply<QDBusObjectPath> pr = m_menuManager->RegisterMenu();
if (pr.count() == 1)
{
QDBusObjectPath op = pr.argumentAt(0).value<QDBusObjectPath>();
m_menuInterfacePath = op.path();
DBusMenu *m_menu = new DBusMenu(m_menuInterfacePath,this);
connect(m_menu,&DBusMenu::MenuUnregistered,m_menu,&DBusMenu::deleteLater);
connect(m_menu,&DBusMenu::ItemInvoked,this,&PanelMenu::slotItemInvoked);
QJsonObject targetObj;
targetObj.insert("x",QJsonValue(x));
targetObj.insert("y",QJsonValue(y));
targetObj.insert("isDockMenu",QJsonValue(false));
QJsonArray contentArry;
contentArry.append(createItemObj("Fashion Mode",ToFashionMode));
contentArry.append(createItemObj("Efficient Mode",ToEfficientMode));
contentArry.append(createItemObj("Classic Mode",ToClassicMode));
QJsonObject contentObj;
contentObj.insert("items",contentArry);
targetObj.insert("menuJsonContent",QString(QJsonDocument(contentObj).toJson()));
m_menu->ShowMenu(QString(QJsonDocument(targetObj).toJson()));
}
}
}
PanelMenu::PanelMenu(QWidget *parent) : QWidget(parent)
void PanelMenu::slotItemInvoked(const QString &itemId, bool result)
{
this->resize(150,100);
this->setWindowFlags(Qt::ToolTip);
OperationType tt = OperationType(itemId.toInt());
switch (tt)
{
case ToFashionMode:
changeToFashionMode();
break;
case ToEfficientMode:
changeToEfficientMode();
break;
case ToClassicMode:
changeToClassicMode();
break;
default:
break;
}
QLabel * menuContent = new QLabel(this);
menuContent->setObjectName("panelMenuContent");
menuContent->resize(this->width(),this->height());
menuContent->move(0,0);
PanelMenuItem *fashionItem = new PanelMenuItem("Fashion Mode",this);
fashionItem->resize(this->width(),MENU_ITEM_HEIGHT);
fashionItem->move(0,0);
connect(fashionItem, SIGNAL(itemClicked()),this, SLOT(changeToFashionMode()));
PanelMenuItem *efficientItem = new PanelMenuItem("Efficient Mode",this);
efficientItem->resize(this->width(),MENU_ITEM_HEIGHT);
efficientItem->move(0,MENU_ITEM_HEIGHT + MENU_ITEM_SPACING);
connect(efficientItem, SIGNAL(itemClicked()),this, SLOT(changeToEfficientMode()));
PanelMenuItem *classictItem = new PanelMenuItem("Classic Mode",this);
classictItem->resize(this->width(),MENU_ITEM_HEIGHT);
classictItem->move(0,MENU_ITEM_HEIGHT*2 + MENU_ITEM_SPACING*2);
connect(classictItem, SIGNAL(itemClicked()),this, SLOT(changeToClassicMode()));
qWarning() << itemId << result << tt;
}
void PanelMenu::changeToFashionMode()
{
qWarning() << "Change to fashion mode...";
dockCons->setDockMode(Dock::FashionMode);
this->hide();
}
void PanelMenu::changeToEfficientMode()
{
qWarning() << "Change to efficient mode...";
dockCons->setDockMode(Dock::EfficientMode);
this->hide();
}
void PanelMenu::changeToClassicMode()
{
qWarning() << "Change to classic mode...";
dockCons->setDockMode(Dock::ClassicMode);
this->hide();
}
QJsonObject PanelMenu::createItemObj(const QString &itemName, OperationType type)
{
QJsonObject itemObj;
itemObj.insert("itemId",QString::number(type));
itemObj.insert("itemText",itemName);
itemObj.insert("itemIcon","");
itemObj.insert("itemIconHover","");
itemObj.insert("itemIconInactive","");
itemObj.insert("itemExtra","");
itemObj.insert("isActive",true);
itemObj.insert("checked",false);
itemObj.insert("itemSubMenu",QJsonObject());
return itemObj;
}

View File

@ -3,42 +3,46 @@
#include <QWidget>
#include <QLabel>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include "DBus/dbusmenumanager.h"
#include "DBus/dbusmenu.h"
#include "Controller/dockmodedata.h"
class PanelMenuItem : public QLabel
class PanelMenu : public QObject
{
Q_OBJECT
public:
explicit PanelMenuItem(QString text, QWidget *parent = 0);
signals:
void itemClicked();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
};
class PanelMenu : public QWidget
{
Q_OBJECT
public:
explicit PanelMenu(QWidget *parent = 0);
enum OperationType {
ToFashionMode,
ToEfficientMode,
ToClassicMode
};
static PanelMenu * instance();
void showMenu(int x,int y);
signals:
public slots:
private slots:
void slotItemInvoked(const QString &itemId,bool result);
private:
explicit PanelMenu(QObject *parent = 0);
void changeToFashionMode();
void changeToEfficientMode();
void changeToClassicMode();
private:
DockModeData *dockCons = DockModeData::instance();
QJsonObject createItemObj(const QString &itemName,OperationType type);
private:
static PanelMenu * m_panelMenu;
DockModeData *dockCons = DockModeData::instance();
QString m_menuInterfacePath = "";
DBusMenuManager *m_menuManager = NULL;
const int MENU_ITEM_HEIGHT = 30;
const int MENU_ITEM_SPACING = 3;
};
#endif // PANELMENU_H