diff --git a/part/pageviewmouseannotation.cpp b/part/pageviewmouseannotation.cpp index ca5fc43fe..1e2edaaff 100644 --- a/part/pageviewmouseannotation.cpp +++ b/part/pageviewmouseannotation.cpp @@ -460,7 +460,25 @@ void MouseAnnotation::performCommand(const QPoint newPos) QPointF normalizedRotatedMouseDelta(rotateInRect(QPointF(mouseDelta.x() / pageViewItemRect.width(), mouseDelta.y() / pageViewItemRect.height()), m_focusedAnnotation.pageViewItem->page()->rotation())); if (isMoved()) { - m_document->translatePageAnnotation(m_focusedAnnotation.pageNumber, m_focusedAnnotation.annotation, Okular::NormalizedPoint(normalizedRotatedMouseDelta.x(), normalizedRotatedMouseDelta.y())); + Okular::NormalizedPoint delta(normalizedRotatedMouseDelta.x(), normalizedRotatedMouseDelta.y()); + const Okular::NormalizedRect annotRect = m_focusedAnnotation.annotation->boundingRectangle(); + + // if moving annot to the left && delta.x is big enough to move annot outside the page + if (delta.x < 0 && (annotRect.left + delta.x) < 0) { + delta.x = -annotRect.left; // update delta.x to move annot only to the left edge of the page + } + // similar checks for right, top and bottom + if (delta.x > 0 && (annotRect.right + delta.x) > 1) { + delta.x = 1 - annotRect.right; + } + if (delta.y < 0 && (annotRect.top + delta.y) < 0) { + delta.y = -annotRect.top; + } + if (delta.y > 0 && (annotRect.bottom + delta.y) > 1) { + delta.y = 1 - annotRect.bottom; + } + m_document->translatePageAnnotation(m_focusedAnnotation.pageNumber, m_focusedAnnotation.annotation, delta); + } else if (isResized()) { QPointF delta1, delta2; handleToAdjust(normalizedRotatedMouseDelta, delta1, delta2, m_handle, m_focusedAnnotation.pageViewItem->page()->rotation());