添加电源右键菜单
This commit is contained in:
parent
8b82e39504
commit
0bbb6cb65e
|
@ -53,8 +53,12 @@ Row {
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
ToolTip.visible: containsMouse
|
ToolTip.visible: containsMouse
|
||||||
ToolTip.text: powerButtonBase.toolTip
|
ToolTip.text: powerButtonBase.toolTip
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
property int spacingFromMenu: 8
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
powerButtonBase.clicked()
|
var buttonPosition = powerButtonArea.mapToGlobal(width, height);
|
||||||
|
powerButtonBase.clicked(mouse.button === Qt.LeftButton, buttonPosition.x - width - spacingFromMenu, buttonPosition.y + spacingFromMenu, mainWindow.isFullScreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,8 +124,12 @@ Item {
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: powerButtonBase.toolTip
|
ToolTip.text: powerButtonBase.toolTip
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
property int spacingFromMenu: 16
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
powerButtonBase.clicked()
|
var buttonPosition = powerButtonArea.mapToGlobal(width, height);
|
||||||
|
powerButtonBase.clicked(mouse.button === Qt.LeftButton, buttonPosition.x + spacingFromMenu, buttonPosition.y + spacingFromMenu, mainWindow.isFullScreen);
|
||||||
}
|
}
|
||||||
onEntered: {
|
onEntered: {
|
||||||
hovered = true
|
hovered = true
|
||||||
|
|
|
@ -18,8 +18,11 @@
|
||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QDBusReply>
|
||||||
|
|
||||||
#include "power-button.h"
|
#include "power-button.h"
|
||||||
|
#include "app-manager.h"
|
||||||
|
|
||||||
#define KYLIN_POWER_NORMAL_PATH_MAJOR "qrc:///res/icon/pad_mainpower.svg"
|
#define KYLIN_POWER_NORMAL_PATH_MAJOR "qrc:///res/icon/pad_mainpower.svg"
|
||||||
|
|
||||||
|
@ -48,7 +51,98 @@ QString PowerButton::getToolTip()
|
||||||
return {tr("power")};
|
return {tr("power")};
|
||||||
}
|
}
|
||||||
|
|
||||||
void PowerButton::clicked()
|
void PowerButton::clicked(bool leftButtonClicked, int mouseX, int mouseY, bool isFullScreen)
|
||||||
{
|
{
|
||||||
|
if (leftButtonClicked) {
|
||||||
QProcess::startDetached("ukui-session-tools");
|
QProcess::startDetached("ukui-session-tools");
|
||||||
|
} else {
|
||||||
|
openMenu(mouseX, mouseY, isFullScreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerButton::openMenu(int menuX, int menuY, bool isFullScreen)
|
||||||
|
{
|
||||||
|
QMenu powerMenu;
|
||||||
|
QDBusReply<bool> reply;
|
||||||
|
QDBusInterface qDBusInterface("org.gnome.SessionManager", "/org/gnome/SessionManager",
|
||||||
|
"org.gnome.SessionManager", QDBusConnection::sessionBus());
|
||||||
|
|
||||||
|
if (canSwitch() && hasMultipleUsers()) {
|
||||||
|
connect(powerMenu.addAction(tr("Switch user")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--switchuser");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = qDBusInterface.call("canHibernate");
|
||||||
|
if (reply.isValid() && reply.value()) {
|
||||||
|
connect(powerMenu.addAction(tr("Hibernate")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--hibernate");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = qDBusInterface.call("canSuspend");
|
||||||
|
if (reply.isValid() && reply.value()) {
|
||||||
|
connect(powerMenu.addAction(tr("Suspend")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--suspend");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(powerMenu.addAction(tr("Lock Screen")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-screensaver-command", "-l");
|
||||||
|
});
|
||||||
|
|
||||||
|
reply = qDBusInterface.call("canLogout");
|
||||||
|
if (reply.isValid() && reply.value()) {
|
||||||
|
connect(powerMenu.addAction(tr("Log Out")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--logout");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = qDBusInterface.call("canReboot");
|
||||||
|
if (reply.isValid() && reply.value()) {
|
||||||
|
connect(powerMenu.addAction(tr("Reboot")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--reboot");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = qDBusInterface.call("canPowerOff");
|
||||||
|
if (reply.isValid() && reply.value()) {
|
||||||
|
connect(powerMenu.addAction(tr("Power Off")), &QAction::triggered, &powerMenu, [] {
|
||||||
|
AppManager::instance()->launchBinaryApp("ukui-session-tools", "--shutdown");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
powerMenu.setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
|
||||||
|
if (isFullScreen) {
|
||||||
|
powerMenu.exec(QPoint(menuX - powerMenu.sizeHint().width(), menuY - powerMenu.sizeHint().height()));
|
||||||
|
} else {
|
||||||
|
powerMenu.exec(QPoint(menuX, menuY - powerMenu.sizeHint().height()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PowerButton::hasMultipleUsers()
|
||||||
|
{
|
||||||
|
QDBusInterface interface("org.freedesktop.Accounts", "/org/freedesktop/Accounts",
|
||||||
|
"org.freedesktop.DBus.Properties", QDBusConnection::systemBus());
|
||||||
|
|
||||||
|
if (!interface.isValid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDBusReply<QVariant> reply = interface.call("Get", "org.freedesktop.Accounts", "HasMultipleUsers");
|
||||||
|
return reply.value().toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PowerButton::canSwitch()
|
||||||
|
{
|
||||||
|
QDBusInterface interface("org.freedesktop.DisplayManager", "/org/freedesktop/DisplayManager/Seat0",
|
||||||
|
"org.freedesktop.DBus.Properties", QDBusConnection::systemBus());
|
||||||
|
|
||||||
|
if (!interface.isValid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDBusReply<QVariant> reply = interface.call("Get", "org.freedesktop.DisplayManager.Seat", "CanSwitch");
|
||||||
|
return reply.value().toBool();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define POWERBUTTON_H
|
#define POWERBUTTON_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QDBusInterface>
|
||||||
|
|
||||||
namespace UkuiMenu {
|
namespace UkuiMenu {
|
||||||
|
|
||||||
|
@ -35,7 +36,12 @@ public:
|
||||||
QString getToolTip();
|
QString getToolTip();
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void clicked();
|
void clicked(bool leftButtonClicked, int mouseX, int mouseY, bool isFullScreen);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void openMenu(int menuX, int menuY, bool isFullScreen);
|
||||||
|
bool hasMultipleUsers();
|
||||||
|
bool canSwitch();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void iconChanged();
|
void iconChanged();
|
||||||
|
|
Loading…
Reference in New Issue