on xenial help sign in
use a Qt C++ property for the panel height
cee9f51Lukáš Tinkl
plugins/Cursor/Cursor.qml−2
@@ -21,8 +21,6 @@ import Powerd 0.1
21MousePointer {
21MousePointer {
22 id: mousePointer
22 id: mousePointer
23
23
24− property int panelHeight // to be read from MousePointer C++ class
25−
26 CursorImageInfo {
24 CursorImageInfo {
27 id: imageInfo
25 id: imageInfo
28 themeName: mousePointer.themeName
26 themeName: mousePointer.themeName
plugins/Cursor/MousePointer.cpp+20−15
@@ -55,11 +55,11 @@ void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::Mouse
55 const qreal sceneWidth = parentItem()->width();
55 const qreal sceneWidth = parentItem()->width();
56 const qreal sceneHeight = parentItem()->height();
56 const qreal sceneHeight = parentItem()->height();
57
57
58− if (newX <= 0 && newY < m_panelHeight) { // top left corner
58+ if (newX <= 0 && newY < m_topBoundaryOffset) { // top left corner
59− const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-m_panelHeight, 2));
59+ const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-m_topBoundaryOffset, 2));
60 Q_EMIT pushedTopLeftCorner(qAbs(distance), buttons);
60 Q_EMIT pushedTopLeftCorner(qAbs(distance), buttons);
61− } else if (newX >= sceneWidth-1 && newY < m_panelHeight) { // top right corner
61+ } else if (newX >= sceneWidth-1 && newY < m_topBoundaryOffset) { // top right corner
62− const auto distance = qSqrt(qPow(newX-sceneWidth, 2) + qPow(newY-m_panelHeight, 2));
62+ const auto distance = qSqrt(qPow(newX-sceneWidth, 2) + qPow(newY-m_topBoundaryOffset, 2));
63 Q_EMIT pushedTopRightCorner(qAbs(distance), buttons);
63 Q_EMIT pushedTopRightCorner(qAbs(distance), buttons);
64 } else if (newX < 0 && newY >= sceneHeight-1) { // bottom left corner
64 } else if (newX < 0 && newY >= sceneHeight-1) { // bottom left corner
65 const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-sceneHeight, 2));
65 const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-sceneHeight, 2));
@@ -71,8 +71,8 @@ void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::Mouse
71 Q_EMIT pushedLeftBoundary(qAbs(newX), buttons);
71 Q_EMIT pushedLeftBoundary(qAbs(newX), buttons);
72 } else if (newX >= sceneWidth) { // right edge
72 } else if (newX >= sceneWidth) { // right edge
73 Q_EMIT pushedRightBoundary(newX - (sceneWidth - 1), buttons);
73 Q_EMIT pushedRightBoundary(newX - (sceneWidth - 1), buttons);
74− } else if (newY < m_panelHeight) { // top edge
74+ } else if (newY < m_topBoundaryOffset) { // top edge
75− Q_EMIT pushedTopBoundary(qAbs(newY - m_panelHeight), buttons);
75+ Q_EMIT pushedTopBoundary(qAbs(newY - m_topBoundaryOffset), buttons);
76 } else if (Q_LIKELY(newX > 0 && newX < sceneWidth-1 && newY > 0 && newY < sceneHeight-1)) { // normal pos, not pushing
76 } else if (Q_LIKELY(newX > 0 && newX < sceneWidth-1 && newY > 0 && newY < sceneHeight-1)) { // normal pos, not pushing
77 Q_EMIT pushStopped();
77 Q_EMIT pushStopped();
78 }
78 }
@@ -96,22 +96,27 @@ void MousePointer::handleWheelEvent(ulong timestamp, QPoint angleDelta, Qt::Keyb
96 QPoint() /* pixelDelta */, angleDelta, modifiers, Qt::ScrollUpdate);
96 QPoint() /* pixelDelta */, angleDelta, modifiers, Qt::ScrollUpdate);
97}
97}
98
98
99+int MousePointer::topBoundaryOffset() const
100+{
101+ return m_topBoundaryOffset;
102+}
103+
104+void MousePointer::setTopBoundaryOffset(int topBoundaryOffset)
105+{
106+ if (m_topBoundaryOffset == topBoundaryOffset)
107+ return;
108+
109+ m_topBoundaryOffset = topBoundaryOffset;
110+ Q_EMIT topBoundaryOffsetChanged(topBoundaryOffset);
111+}
112+
99void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
113void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
100{
114{
101 if (change == ItemSceneChange) {
115 if (change == ItemSceneChange) {
102 registerWindow(value.window);
116 registerWindow(value.window);
103− if (value.window) {
104− m_panelHeight = QQmlProperty::read(this, "panelHeight").toInt(); // when we move e.g. to a different screen (with possible different DGU)
105− }
106 }
117 }
107}
118}
108
119
109−void MousePointer::componentComplete()
110−{
111− MirMousePointerInterface::componentComplete();
112− m_panelHeight = QQmlProperty::read(this, "panelHeight").toInt();
113−}
114−
115void MousePointer::registerWindow(QWindow *window)
120void MousePointer::registerWindow(QWindow *window)
116{
121{
117 if (window == m_registeredWindow) {
122 if (window == m_registeredWindow) {
plugins/Cursor/MousePointer.h+8−2
@@ -27,6 +27,8 @@
27
27
28class MousePointer : public MirMousePointerInterface {
28class MousePointer : public MirMousePointerInterface {
29 Q_OBJECT
29 Q_OBJECT
30+ Q_PROPERTY(int topBoundaryOffset READ topBoundaryOffset WRITE setTopBoundaryOffset NOTIFY topBoundaryOffsetChanged)
31+
30public:
32public:
31 MousePointer(QQuickItem *parent = nullptr);
33 MousePointer(QQuickItem *parent = nullptr);
32
34
@@ -38,6 +40,9 @@ public:
38
40
39 void setCustomCursor(const QCursor &) override;
41 void setCustomCursor(const QCursor &) override;
40
42
43+ int topBoundaryOffset() const;
44+ void setTopBoundaryOffset(int topBoundaryOffset);
45+
41public Q_SLOTS:
46public Q_SLOTS:
42 void handleMouseEvent(ulong timestamp, QPointF movement, Qt::MouseButtons buttons,
47 void handleMouseEvent(ulong timestamp, QPointF movement, Qt::MouseButtons buttons,
43 Qt::KeyboardModifiers modifiers) override;
48 Qt::KeyboardModifiers modifiers) override;
@@ -54,9 +59,10 @@ Q_SIGNALS:
54 void pushStopped();
59 void pushStopped();
55 void mouseMoved();
60 void mouseMoved();
56
61
62+ void topBoundaryOffsetChanged(int topBoundaryOffset);
63+
57protected:
64protected:
58 void itemChange(ItemChange change, const ItemChangeData &value) override;
65 void itemChange(ItemChange change, const ItemChangeData &value) override;
59− void componentComplete() override;
60
66
61private Q_SLOTS:
67private Q_SLOTS:
62 void registerScreen(QScreen *screen);
68 void registerScreen(QScreen *screen);
@@ -72,7 +78,7 @@ private:
72 // Accumulated, unapplied, mouse movement.
78 // Accumulated, unapplied, mouse movement.
73 QPointF m_accumulatedMovement;
79 QPointF m_accumulatedMovement;
74
80
75− int m_panelHeight = 0;
81+ int m_topBoundaryOffset{0};
76};
82};
77
83
78#endif // MOUSEPOINTER_H
84#endif // MOUSEPOINTER_H
qml/Shell.qml+1−1
@@ -764,7 +764,7 @@ StyledItem {
764 id: cursor
764 id: cursor
765 visible: shell.hasMouse
765 visible: shell.hasMouse
766 z: itemGrabber.z + 1
766 z: itemGrabber.z + 1
767− panelHeight: panel.panelHeight
767+ topBoundaryOffset: panel.panelHeight
768
768
769 property bool mouseNeverMoved: true
769 property bool mouseNeverMoved: true
770 Binding {
770 Binding {
tests/mocks/Cursor/Cursor.qml+1−1
@@ -17,7 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18
18
19Item {
19Item {
20− property int panelHeight // to be read from MousePointer C++ class
20+ property int topBoundaryOffset // effectively panel height
21
21
22 signal pushedLeftBoundary(real amount, int buttons)
22 signal pushedLeftBoundary(real amount, int buttons)
23 signal pushedRightBoundary(real amount, int buttons)
23 signal pushedRightBoundary(real amount, int buttons)