Krita Source Code Documentation
Loading...
Searching...
No Matches
BoundingBoxSnapStrategy Class Reference

snaps to shape bounding boxes More...

#include <KoSnapStrategy.h>

+ Inheritance diagram for BoundingBoxSnapStrategy:

Public Member Functions

 BoundingBoxSnapStrategy ()
 
QPainterPath decoration (const KoViewConverter &converter) const override
 returns the current snap strategy decoration
 
bool snap (const QPointF &mousePosition, KoSnapProxy *proxy, qreal maxSnapDistance) override
 
- Public Member Functions inherited from KoSnapStrategy
 KoSnapStrategy (KoSnapGuide::Strategy type)
 
QPointF snappedPosition () const
 returns the snapped position form the last call to snapToPoints
 
SnapType snappedType () const
 
KoSnapGuide::Strategy type () const
 returns the strategies type
 
virtual ~KoSnapStrategy ()
 

Private Member Functions

qreal squareDistanceToLine (const QPointF &lineA, const QPointF &lineB, const QPointF &point, QPointF &pointOnLine)
 

Private Attributes

QPointF m_boxPoints [5]
 

Friends

class TestSnapStrategy
 

Additional Inherited Members

- Public Types inherited from KoSnapStrategy
enum  SnapType { ToPoint = 0 , ToLine }
 
- Static Public Member Functions inherited from KoSnapStrategy
static qreal scalarProduct (const QPointF &p1, const QPointF &p2)
 
static qreal squareDistance (const QPointF &p1, const QPointF &p2)
 
- Protected Member Functions inherited from KoSnapStrategy
void setSnappedPosition (const QPointF &position, SnapType snapType)
 sets the current snapped position
 

Detailed Description

snaps to shape bounding boxes

Definition at line 119 of file KoSnapStrategy.h.

Constructor & Destructor Documentation

◆ BoundingBoxSnapStrategy()

BoundingBoxSnapStrategy::BoundingBoxSnapStrategy ( )

Definition at line 499 of file KoSnapStrategy.cpp.

501{
502}
@ BoundingBoxSnapping
Definition KoSnapGuide.h:55
KoSnapStrategy(KoSnapGuide::Strategy type)

Member Function Documentation

◆ decoration()

QPainterPath BoundingBoxSnapStrategy::decoration ( const KoViewConverter & converter) const
overridevirtual

returns the current snap strategy decoration

Implements KoSnapStrategy.

Definition at line 576 of file KoSnapStrategy.cpp.

577{
578 QSizeF unzoomedSize = converter.viewToDocument(QSizeF(5, 5));
579
580 QPainterPath decoration;
581 decoration.moveTo(snappedPosition() - QPointF(unzoomedSize.width(), unzoomedSize.height()));
582 decoration.lineTo(snappedPosition() + QPointF(unzoomedSize.width(), unzoomedSize.height()));
583 decoration.moveTo(snappedPosition() - QPointF(unzoomedSize.width(), -unzoomedSize.height()));
584 decoration.lineTo(snappedPosition() + QPointF(unzoomedSize.width(), -unzoomedSize.height()));
585
586 return decoration;
587}
QPainterPath decoration(const KoViewConverter &converter) const override
returns the current snap strategy decoration
QPointF snappedPosition() const
returns the snapped position form the last call to snapToPoints
virtual QPointF viewToDocument(const QPointF &viewPoint) const

References decoration(), KoSnapStrategy::snappedPosition(), and KoViewConverter::viewToDocument().

◆ snap()

bool BoundingBoxSnapStrategy::snap ( const QPointF & mousePosition,
KoSnapProxy * proxy,
qreal maxSnapDistance )
overridevirtual

Implements KoSnapStrategy.

Definition at line 504 of file KoSnapStrategy.cpp.

505{
506 Q_ASSERT(std::isfinite(maxSnapDistance));
507 const qreal maxDistance = maxSnapDistance * maxSnapDistance;
508 qreal minDistance = HUGE_VAL;
509
510 QRectF rect(-maxSnapDistance, -maxSnapDistance, maxSnapDistance, maxSnapDistance);
511
512 rect.moveCenter(mousePosition);
513 QPointF snappedPoint = mousePosition;
514 SnapType snapType = ToPoint;
515
516 KoFlake::AnchorPosition pointId[5] = {
522 };
523
524 QList<KoShape*> shapes = proxy->shapesInRect(rect, true);
525 Q_FOREACH (KoShape * shape, shapes) {
526 qreal shapeMinDistance = HUGE_VAL;
527 // first check the corner and center points
528 for (int i = 0; i < 5; ++i) {
529 m_boxPoints[i] = shape->absolutePosition(pointId[i]);
530 qreal d = squareDistance(mousePosition, m_boxPoints[i]);
531 if (d < minDistance && d < maxDistance) {
532 shapeMinDistance = d;
533 minDistance = d;
534 snappedPoint = m_boxPoints[i];
535 snapType = ToPoint;
536 }
537 }
538 // prioritize points over edges
539 if (shapeMinDistance < maxDistance)
540 continue;
541
542 // now check distances to edges of bounding box
543 for (int i = 0; i < 4; ++i) {
544 QPointF pointOnLine;
545 qreal d = squareDistanceToLine(m_boxPoints[i], m_boxPoints[(i+1)%4], mousePosition, pointOnLine);
546 if (d < minDistance && d < maxDistance) {
547 minDistance = d;
548 snappedPoint = pointOnLine;
549 snapType = ToLine;
550 }
551 }
552 }
553 setSnappedPosition(snappedPoint, snapType);
554
555 return (minDistance < maxDistance);
556}
qreal squareDistanceToLine(const QPointF &lineA, const QPointF &lineB, const QPointF &point, QPointF &pointOnLine)
QPointF absolutePosition(KoFlake::AnchorPosition anchor=KoFlake::Center) const
Definition KoShape.cpp:653
QList< KoShape * > shapesInRect(const QRectF &rect, bool omitEditedShape=false)
returns list of shape in given rectangle in document coordinates
void setSnappedPosition(const QPointF &position, SnapType snapType)
sets the current snapped position
static qreal squareDistance(const QPointF &p1, const QPointF &p2)
AnchorPosition
Definition KoFlake.h:85
@ BottomRight
Definition KoFlake.h:94
@ TopRight
Definition KoFlake.h:88
@ TopLeft
Definition KoFlake.h:86
@ BottomLeft
Definition KoFlake.h:92
@ Center
Definition KoFlake.h:90

References KoShape::absolutePosition(), KoFlake::BottomLeft, KoFlake::BottomRight, KoFlake::Center, m_boxPoints, KoSnapStrategy::setSnappedPosition(), KoSnapProxy::shapesInRect(), KoSnapStrategy::squareDistance(), squareDistanceToLine(), KoSnapStrategy::ToLine, KoFlake::TopLeft, KoSnapStrategy::ToPoint, and KoFlake::TopRight.

◆ squareDistanceToLine()

qreal BoundingBoxSnapStrategy::squareDistanceToLine ( const QPointF & lineA,
const QPointF & lineB,
const QPointF & point,
QPointF & pointOnLine )
private

Definition at line 558 of file KoSnapStrategy.cpp.

559{
560 QPointF diff = lineB - lineA;
561 if(lineA == lineB)
562 return HUGE_VAL;
563 const qreal diffLength = sqrt(diff.x() * diff.x() + diff.y() * diff.y());
564
565 // project mouse position relative to start position on line
566 const qreal scalar = KoSnapStrategy::scalarProduct(point - lineA, diff / diffLength);
567
568 if (scalar < 0.0 || scalar > diffLength)
569 return HUGE_VAL;
570 // calculate vector between relative mouse position and projected mouse position
571 pointOnLine = lineA + scalar / diffLength * diff;
572 QPointF distVec = pointOnLine - point;
573 return distVec.x()*distVec.x() + distVec.y()*distVec.y();
574}
static qreal scalarProduct(const QPointF &p1, const QPointF &p2)

References KoSnapStrategy::scalarProduct().

Friends And Related Symbol Documentation

◆ TestSnapStrategy

friend class TestSnapStrategy
friend

Definition at line 121 of file KoSnapStrategy.h.

Member Data Documentation

◆ m_boxPoints

QPointF BoundingBoxSnapStrategy::m_boxPoints[5]
private

Definition at line 128 of file KoSnapStrategy.h.


The documentation for this class was generated from the following files: