Add the middle-click event to the system tray

pull/18/head
reionwong 4 years ago
parent 4a4eeaae4b
commit f415f331c7

@ -38,9 +38,12 @@ Item {
property alias mouseArea: _mouseArea property alias mouseArea: _mouseArea
signal clicked(var mouse)
signal pressed(var mouse)
signal wheel(var wheel)
signal contextMenu(var mouse)
signal positionChanged signal positionChanged
signal clicked
signal rightClicked
signal released signal released
onCheckedChanged: { onCheckedChanged: {
@ -50,7 +53,7 @@ Item {
MouseArea { MouseArea {
id: _mouseArea id: _mouseArea
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
hoverEnabled: true hoverEnabled: true
onEntered: { onEntered: {
@ -77,15 +80,17 @@ Item {
onClicked: { onClicked: {
control.moveX = mouseX control.moveX = mouseX
control.moveY = mouseY control.moveY = mouseY
control.clicked(mouse)
if (mouse.button == Qt.LeftButton)
control.clicked()
else if (mouse.button == Qt.RightButton)
control.rightClicked()
} }
onPressed: { onPressed: {
popupTips.hide() popupTips.hide()
control.pressed(mouse)
}
onWheel: {
control.wheel(wheel)
wheel.accepted = false
} }
onReleased: { onReleased: {

@ -92,7 +92,10 @@ Item {
Layout.preferredWidth: acticityLayout.implicitWidth ? Math.min(acticityLayout.implicitWidth + FishUI.Units.largeSpacing, Layout.preferredWidth: acticityLayout.implicitWidth ? Math.min(acticityLayout.implicitWidth + FishUI.Units.largeSpacing,
rootItem.width / 2) rootItem.width / 2)
: 0 : 0
onRightClicked: acticityMenu.open() onClicked: {
if (mouse.button === Qt.RightButton)
acticityMenu.open()
}
RowLayout { RowLayout {
id: acticityLayout id: acticityLayout
@ -181,8 +184,8 @@ Item {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: appMenuApplet.currentIndex !== -1 hoverEnabled: appMenuApplet.currentIndex !== -1
onPressed: parent.clicked() onPressed: parent.clicked(null)
onEntered: parent.clicked() onEntered: parent.clicked(null)
} }
} }
@ -207,7 +210,7 @@ Item {
var idx = Math.max(0, Math.min(appMenuView.count - 1, index)) var idx = Math.max(0, Math.min(appMenuView.count - 1, index))
var button = appMenuView.itemAtIndex(index) var button = appMenuView.itemAtIndex(index)
if (button) { if (button) {
button.clicked() button.clicked(null)
} }
}); });
@ -215,7 +218,7 @@ Item {
appMenuApplet.mousePosChanged.connect(function (x, y) { appMenuApplet.mousePosChanged.connect(function (x, y) {
var item = itemAt(x, y) var item = itemAt(x, y)
if (item) if (item)
item.clicked(); item.clicked(null)
}); });
} }
} }
@ -318,8 +321,18 @@ Item {
visible: !dragStarted visible: !dragStarted
} }
onClicked: trayModel.leftButtonClick(model.id) onClicked: {
onRightClicked: trayModel.rightButtonClick(model.id) var pos = trayModel.popupPosition(_trayItem, mouse.x, mouse.y)
if (mouse.button === Qt.LeftButton) {
trayModel.leftButtonClick(model.id, pos.x, pos.y)
} else if (mouse.button === Qt.RightButton) {
trayModel.rightButtonClick(model.id, pos.x, pos.y)
} else if (mouse.button === Qt.MiddleButton) {
trayModel.middleButtonClick(model.id, pos.x, pos.y)
}
}
popupText: model.toolTip ? model.toolTip : model.title popupText: model.toolTip ? model.toolTip : model.title
} }
} }
@ -332,8 +345,9 @@ Item {
Layout.fillHeight: true Layout.fillHeight: true
Layout.preferredWidth: _controlerLayout.implicitWidth + FishUI.Units.largeSpacing Layout.preferredWidth: _controlerLayout.implicitWidth + FishUI.Units.largeSpacing
onClicked: toggleDialog() onClicked: {
onRightClicked: toggleDialog() toggleDialog()
}
function toggleDialog() { function toggleDialog() {
if (controlCenter.visible) if (controlCenter.visible)

@ -108,22 +108,28 @@ StatusNotifierItemSource *SystemTrayModel::findItemById(const QString &id)
return m_items.at(index); return m_items.at(index);
} }
void SystemTrayModel::leftButtonClick(const QString &id) void SystemTrayModel::leftButtonClick(const QString &id, int x, int y)
{ {
StatusNotifierItemSource *item = findItemById(id); StatusNotifierItemSource *item = findItemById(id);
if (item) { if (item) {
QPoint p(QCursor::pos()); item->activate(x, y);
item->activate(p.x(), p.y());
} }
} }
void SystemTrayModel::rightButtonClick(const QString &id) void SystemTrayModel::rightButtonClick(const QString &id, int x, int y)
{ {
StatusNotifierItemSource *item = findItemById(id); StatusNotifierItemSource *item = findItemById(id);
if (item) { if (item) {
QPoint p(QCursor::pos()); item->contextMenu(x, y);
item->contextMenu(p.x(), p.y()); }
}
void SystemTrayModel::middleButtonClick(const QString &id, int x, int y)
{
StatusNotifierItemSource *item = findItemById(id);
if (item) {
item->secondaryActivate(x, y);
} }
} }
@ -142,6 +148,23 @@ void SystemTrayModel::move(int from, int to)
endMoveRows(); endMoveRows();
} }
QPointF SystemTrayModel::popupPosition(QQuickItem *visualParent, int x, int y)
{
if (!visualParent) {
return QPointF(0, 0);
}
QPointF pos = visualParent->mapToScene(QPointF(x, y));
if (visualParent->window() && visualParent->window()->screen()) {
pos = visualParent->window()->mapToGlobal(pos.toPoint());
} else {
return QPoint();
}
return pos;
}
void SystemTrayModel::onItemAdded(const QString &service) void SystemTrayModel::onItemAdded(const QString &service)
{ {
StatusNotifierItemSource *source = new StatusNotifierItemSource(service, this); StatusNotifierItemSource *source = new StatusNotifierItemSource(service, this);

@ -23,6 +23,9 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QQuickItem>
#include <QQuickWindow>
#include "statusnotifierwatcher.h" #include "statusnotifierwatcher.h"
#include "statusnotifieritemsource.h" #include "statusnotifieritemsource.h"
@ -50,11 +53,19 @@ public:
int indexOf(const QString &id); int indexOf(const QString &id);
StatusNotifierItemSource *findItemById(const QString &id); StatusNotifierItemSource *findItemById(const QString &id);
Q_INVOKABLE void leftButtonClick(const QString &id); Q_INVOKABLE void leftButtonClick(const QString &id, int x, int y);
Q_INVOKABLE void rightButtonClick(const QString &id); Q_INVOKABLE void rightButtonClick(const QString &id, int x, int y);
Q_INVOKABLE void middleButtonClick(const QString &id, int x, int y);
Q_INVOKABLE void move(int from, int to); Q_INVOKABLE void move(int from, int to);
/**
* Find out global coordinates for a popup given local MouseArea
* coordinates
* from plasma-workspace/applets/systemtray/systemtray.cpp
*/
Q_INVOKABLE QPointF popupPosition(QQuickItem *visualParent, int x, int y);
private slots: private slots:
void onItemAdded(const QString &service); void onItemAdded(const QString &service);
void onItemRemoved(const QString &service); void onItemRemoved(const QString &service);

Loading…
Cancel
Save