diff --git a/app/widget/handmovableview/handmovableview.cpp b/app/widget/handmovableview/handmovableview.cpp index 25536ec7b..5ff36be0a 100644 --- a/app/widget/handmovableview/handmovableview.cpp +++ b/app/widget/handmovableview/handmovableview.cpp @@ -66,6 +66,8 @@ bool HandMovableView::HandPress(QMouseEvent *event) Qt::LeftButton, event->modifiers()); + transformed_pos_ = QPoint(0, 0); + super::mousePressEvent(&transformed); return true; @@ -78,12 +80,34 @@ bool HandMovableView::HandMove(QMouseEvent *event) { if (dragging_hand_) { // Transform mouse event to act like the left button is pressed + QPoint adjustment(0, 0); + QMouseEvent transformed(event->type(), - event->localPos(), + event->localPos() - transformed_pos_, Qt::LeftButton, Qt::LeftButton, event->modifiers()); + if (event->localPos().x() < 0) { + transformed_pos_.setX(transformed_pos_.x() + width()); + adjustment.setX(width()); + } else if (event->localPos().x() >= width()) { + transformed_pos_.setX(transformed_pos_.x() - width()); + adjustment.setX(-width()); + } + + if (event->pos().y() < 0) { + transformed_pos_.setY(transformed_pos_.y() + height()); + adjustment.setY(height()); + } else if (event->pos().y() >= height()) { + transformed_pos_.setY(transformed_pos_.y() - height()); + adjustment.setY(-height()); + } + + if (!adjustment.isNull()) { + QCursor::setPos(QCursor::pos() + adjustment); + } + super::mouseMoveEvent(&transformed); } return dragging_hand_; diff --git a/app/widget/handmovableview/handmovableview.h b/app/widget/handmovableview/handmovableview.h index e9579e7dd..c1f9220e8 100644 --- a/app/widget/handmovableview/handmovableview.h +++ b/app/widget/handmovableview/handmovableview.h @@ -77,6 +77,8 @@ private: */ bool scroll_zooms_by_default_; + QPointF transformed_pos_; + private slots: void ApplicationToolChanged(Tool::Item tool);