diff --git a/qml/StandardItem.qml b/qml/StandardItem.qml index 609658f..bb4f41d 100644 --- a/qml/StandardItem.qml +++ b/qml/StandardItem.qml @@ -38,9 +38,12 @@ Item { property alias mouseArea: _mouseArea + signal clicked(var mouse) + signal pressed(var mouse) + signal wheel(var wheel) + signal contextMenu(var mouse) + signal positionChanged - signal clicked - signal rightClicked signal released onCheckedChanged: { @@ -50,7 +53,7 @@ Item { MouseArea { id: _mouseArea anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton hoverEnabled: true onEntered: { @@ -77,15 +80,17 @@ Item { onClicked: { control.moveX = mouseX control.moveY = mouseY - - if (mouse.button == Qt.LeftButton) - control.clicked() - else if (mouse.button == Qt.RightButton) - control.rightClicked() + control.clicked(mouse) } onPressed: { popupTips.hide() + control.pressed(mouse) + } + + onWheel: { + control.wheel(wheel) + wheel.accepted = false } onReleased: { diff --git a/qml/main.qml b/qml/main.qml index 70302db..011241b 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -92,7 +92,10 @@ Item { Layout.preferredWidth: acticityLayout.implicitWidth ? Math.min(acticityLayout.implicitWidth + FishUI.Units.largeSpacing, rootItem.width / 2) : 0 - onRightClicked: acticityMenu.open() + onClicked: { + if (mouse.button === Qt.RightButton) + acticityMenu.open() + } RowLayout { id: acticityLayout @@ -181,8 +184,8 @@ Item { MouseArea { anchors.fill: parent hoverEnabled: appMenuApplet.currentIndex !== -1 - onPressed: parent.clicked() - onEntered: parent.clicked() + onPressed: parent.clicked(null) + onEntered: parent.clicked(null) } } @@ -207,7 +210,7 @@ Item { var idx = Math.max(0, Math.min(appMenuView.count - 1, index)) var button = appMenuView.itemAtIndex(index) if (button) { - button.clicked() + button.clicked(null) } }); @@ -215,7 +218,7 @@ Item { appMenuApplet.mousePosChanged.connect(function (x, y) { var item = itemAt(x, y) if (item) - item.clicked(); + item.clicked(null) }); } } @@ -318,8 +321,18 @@ Item { visible: !dragStarted } - onClicked: trayModel.leftButtonClick(model.id) - onRightClicked: trayModel.rightButtonClick(model.id) + onClicked: { + 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 } } @@ -332,8 +345,9 @@ Item { Layout.fillHeight: true Layout.preferredWidth: _controlerLayout.implicitWidth + FishUI.Units.largeSpacing - onClicked: toggleDialog() - onRightClicked: toggleDialog() + onClicked: { + toggleDialog() + } function toggleDialog() { if (controlCenter.visible) diff --git a/src/systemtray/systemtraymodel.cpp b/src/systemtray/systemtraymodel.cpp index 18358e3..74c86cc 100644 --- a/src/systemtray/systemtraymodel.cpp +++ b/src/systemtray/systemtraymodel.cpp @@ -108,22 +108,28 @@ StatusNotifierItemSource *SystemTrayModel::findItemById(const QString &id) 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); if (item) { - QPoint p(QCursor::pos()); - item->activate(p.x(), p.y()); + item->activate(x, y); } } -void SystemTrayModel::rightButtonClick(const QString &id) +void SystemTrayModel::rightButtonClick(const QString &id, int x, int y) { StatusNotifierItemSource *item = findItemById(id); if (item) { - QPoint p(QCursor::pos()); - item->contextMenu(p.x(), p.y()); + item->contextMenu(x, 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(); } +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) { StatusNotifierItemSource *source = new StatusNotifierItemSource(service, this); diff --git a/src/systemtray/systemtraymodel.h b/src/systemtray/systemtraymodel.h index d39030b..f2b3729 100644 --- a/src/systemtray/systemtraymodel.h +++ b/src/systemtray/systemtraymodel.h @@ -23,6 +23,9 @@ #include +#include +#include + #include "statusnotifierwatcher.h" #include "statusnotifieritemsource.h" @@ -50,11 +53,19 @@ public: int indexOf(const QString &id); StatusNotifierItemSource *findItemById(const QString &id); - Q_INVOKABLE void leftButtonClick(const QString &id); - Q_INVOKABLE void rightButtonClick(const QString &id); + Q_INVOKABLE void leftButtonClick(const QString &id, int x, int y); + 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); + /** + * 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: void onItemAdded(const QString &service); void onItemRemoved(const QString &service);