@@ -28,11 +28,19 @@ Item {
2828 property alias unityMenuModel: rowRepeater.model
2929 property bool enableKeyFilter: false
3030 property real overflowWidth: width
31+ property bool windowMoving: false
3132
3233 // read from outside
3334 readonly property bool valid: rowRepeater.count > 0
3435 readonly property bool showRequested: d.longAltPressed || d.currentItem != null
3536
37+ // MoveHandler API for DecoratedWindow
38+ signal pressed(var mouse)
39+ signal pressedChangedEx(bool pressed, var pressedButtons, real mouseX, real mouseY)
40+ signal positionChanged(var mouse)
41+ signal released(var mouse)
42+ signal doubleClicked(var mouse)
43+
3644 implicitWidth: row.width
3745 height: parent.height
3846
@@ -77,7 +85,7 @@ Item {
7785 anchors.fill: parent
7886 enabled: d.currentItem != null
7987 hoverEnabled: enabled && d.currentItem && d.currentItem.__popup != null
80− onPressed: d.dismissAll()
88+ onPressed: { mouse.accepted = false; d.dismissAll(); }
8189 }
8290
8391 Row {
@@ -96,6 +104,11 @@ Item {
96104 onModelReset: d.firstInvisibleIndex = undefined
97105 }
98106
107+ Component {
108+ id: menuComponent
109+ MenuPopup { }
110+ }
111+
99112 Repeater {
100113 id: rowRepeater
101114
@@ -119,7 +132,14 @@ Item {
119132
120133 function show() {
121134 if (!__popup) {
122− __popup = menuComponent.createObject(root, { objectName: visualItem.objectName + "-menu" });
135+ __popup = menuComponent.createObject(root,
136+ {
137+ objectName: visualItem.objectName + "-menu",
138+ desiredX: Qt.binding(function() { return visualItem.x - units.gu(1); }),
139+ desiredY: Qt.binding(function() { return root.height; }),
140+ unityMenuModel: Qt.binding(function() { return root.unityMenuModel.submenu(visualItem.__ownIndex); })
141+ });
142+ __popup.reset();
123143 __popup.childActivated.connect(dismiss);
124144 // force the current item to be the newly popped up menu
125145 } else {
@@ -162,17 +182,6 @@ Item {
162182 onDismissAll: visualItem.dismiss()
163183 }
164184
165− Component {
166− id: menuComponent
167− MenuPopup {
168− desiredX: visualItem.x - units.gu(1)
169− desiredY: parent.height
170− unityMenuModel: root.unityMenuModel.submenu(visualItem.__ownIndex)
171−
172− Component.onCompleted: reset();
173− }
174− }
175−
176185 RowLayout {
177186 id: column
178187 spacing: units.gu(1)
@@ -217,24 +226,40 @@ Item {
217226 } // Row
218227
219228 MouseArea {
220− anchors.fill: row
229+ anchors.fill: parent
221230 hoverEnabled: d.currentItem
222231
232+ property bool moved: false
233+
223234 onEntered: {
224235 if (d.currentItem) {
225236 updateCurrentItemFromPosition(Qt.point(mouseX, mouseY))
226237 }
227238 }
228− onPositionChanged: {
229− if (d.currentItem) {
230− updateCurrentItemFromPosition(Qt.point(mouse.x, mouse.y))
239+
240+ onClicked: {
241+ if (!moved) {
242+ var prevItem = d.currentItem;
243+ updateCurrentItemFromPosition(Qt.point(mouseX, mouseY));
244+ if (prevItem && d.currentItem == prevItem) {
245+ prevItem.hide();
246+ }
231247 }
248+ moved = false;
232249 }
233− onClicked: {
234− var prevItem = d.currentItem;
235− updateCurrentItemFromPosition(Qt.point(mouse.x, mouse.y))
236− if (prevItem && d.currentItem == prevItem) {
237− prevItem.hide();
250+
251+ // for the MoveHandler
252+ onPressed: root.pressed(mouse)
253+ onPressedChanged: root.pressedChangedEx(pressed, pressedButtons, mouseX, mouseY)
254+ onReleased: root.released(mouse)
255+ onDoubleClicked: root.doubleClicked(mouse)
256+
257+ Mouse.ignoreSynthesizedEvents: true
258+ Mouse.onPositionChanged: {
259+ root.positionChanged(mouse);
260+ moved = root.windowMoving;
261+ if (d.currentItem) {
262+ updateCurrentItemFromPosition(Qt.point(mouse.x, mouse.y))
238263 }
239264 }
240265
@@ -259,7 +284,7 @@ Item {
259284 hoverEnabled: d.currentItem
260285 onEntered: d.currentItem = this
261286 onPositionChanged: d.currentItem = this
262− onClicked: d.currentItem = this
287+ onPressed: d.currentItem = this
263288
264289 property Item __popup: null;
265290 readonly property bool popupVisible: __popup && __popup.visible