diff --git a/src/canvaswidget.h b/src/canvaswidget.h --- a/src/canvaswidget.h +++ b/src/canvaswidget.h @@ -51,12 +51,12 @@ void updateBarDirection(); void startGame(); void updateCursor(); - void resetCursor(); void resetMousePosition(); protected: void focusOutEvent(QFocusEvent *event) override; void resizeEvent(QResizeEvent *event) override; + bool event(QEvent *event) override; private: //used when moving the bar with the keys diff --git a/src/canvaswidget.cpp b/src/canvaswidget.cpp --- a/src/canvaswidget.cpp +++ b/src/canvaswidget.cpp @@ -47,7 +47,7 @@ // for handling mouse cursor connect(rootObject(), SIGNAL(pausedChanged()), this, SLOT(updateCursor())); - connect(this, &CanvasWidget::gameEnded, this, &CanvasWidget::resetCursor); + connect(this, &CanvasWidget::gameEnded, this, &CanvasWidget::updateCursor); } CanvasWidget::~CanvasWidget() @@ -68,6 +68,14 @@ QMetaObject::invokeMethod(rootObject(), "updateGeometry"); } +bool CanvasWidget::event(QEvent *event) +{ + if (event->type() == QEvent::Leave) { + resetMousePosition(); + } + return KgDeclarativeView::event(event); +} + void CanvasWidget::newGame() { QMetaObject::invokeMethod(rootObject(), "reset"); @@ -122,33 +130,34 @@ Q_ARG(QVariant, m_barDirection)); } -void CanvasWidget::resetCursor() -{ - setCursor(QCursor(Qt::ArrowCursor)); -} - void CanvasWidget::updateCursor() { - bool paused = rootObject()->property("paused").toBool(); + const bool paused = rootObject()->property("paused").toBool(); if (paused) { - resetCursor(); + setCursor(Qt::ArrowCursor); } else { - // FIXME: move the cursor to where the bar is resetMousePosition(); - QCursor newCursor(Qt::BlankCursor); - newCursor.setPos(cursor().pos()); - setCursor(newCursor); + setCursor(Qt::BlankCursor); } } void CanvasWidget::resetMousePosition() { - // FIXME: the cursor's position is supposed to be reset, - // just doesn't work! - int barPosition = rootObject()->property("barCenter").toInt(); - QPoint p = mapToGlobal(QPoint(barPosition, 0)); - cursor().setPos(p.x(), cursor().pos().y()); + const QQuickItem *jailItem = rootObject()->property("jailItem").value(); + const QPoint jailItemTopLeft = mapToGlobal(QPoint(jailItem->x(), jailItem->y())); + QPoint p = QCursor::pos(); + if (p.x() < jailItemTopLeft.x()) { + QCursor::setPos(jailItemTopLeft.x(), p.y()); + } else if (p.x() > jailItemTopLeft.x() + jailItem->width()) { + QCursor::setPos(jailItemTopLeft.x() + jailItem->width(), p.y()); + } + + if (p.y() < jailItemTopLeft.y()) { + QCursor::setPos(p.x(), jailItemTopLeft.y()); + } else if (p.y() > jailItemTopLeft.y() + jailItem->height()) { + QCursor::setPos(p.x(), jailItemTopLeft.y() + jailItem->height()); + } } void CanvasWidget::focusOutEvent(QFocusEvent *event) diff --git a/src/qml/main.qml b/src/qml/main.qml --- a/src/qml/main.qml +++ b/src/qml/main.qml @@ -26,11 +26,13 @@ signal levelComplete() signal gameEnded(int score, int level, int elapsedTime) signal mousePressed() + signal updateCursor() property real speed property bool paused: false property bool gameOver: false property bool gameWon: false + readonly property Item jailItem: bgOverlay function updateGeometry() { var bw = Globals.BRICK_WIDTH*Globals.WIDTH + 1; @@ -263,6 +265,7 @@ var barX = canvas.mapToItem(bgOverlay, mouse.x, 0).x - bar.width/2; bar.moveTo(barX/m_scale); + canvas.updateCursor(); } onClicked: canvas.mousePressed() }