Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_snap_line_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QPainterPath>
10#include <KoViewConverter.h>
11#include "kis_global.h"
12
18
24
28
29bool KisSnapLineStrategy::snap(const QPointF &mousePosition, KoSnapProxy *proxy, qreal maxSnapDistance)
30{
31 Q_UNUSED(proxy);
32
33 QPointF snappedPoint = mousePosition;
34 qreal minXDistance = std::numeric_limits<qreal>::max();
35 qreal minYDistance = std::numeric_limits<qreal>::max();
36
37 Q_FOREACH (qreal line, m_d->horizontalLines) {
38 const qreal dist = qAbs(mousePosition.y() - line);
39
40 if (dist < maxSnapDistance && dist < minYDistance) {
41 minYDistance = dist;
42 snappedPoint.ry() = line;
43 }
44 }
45
46 Q_FOREACH (qreal line, m_d->verticalLines) {
47 const qreal dist = qAbs(mousePosition.x() - line);
48
49 if (dist < maxSnapDistance && dist < minXDistance) {
50 minXDistance = dist;
51 snappedPoint.rx() = line;
52 }
53 }
54
55 if (kisDistance(snappedPoint, mousePosition) > maxSnapDistance) {
56 if (minXDistance < minYDistance) {
57 snappedPoint.ry() = mousePosition.y();
58 } else {
59 snappedPoint.rx() = mousePosition.x();
60 }
61 }
62
63 const SnapType snapType = minXDistance < std::numeric_limits<qreal>::max() &&
64 minYDistance < std::numeric_limits<qreal>::max() ? ToPoint : ToLine;
65
66 setSnappedPosition(snappedPoint, snapType);
67 return
68 minXDistance < std::numeric_limits<qreal>::max() ||
69 minYDistance < std::numeric_limits<qreal>::max();
70}
71
72QPainterPath KisSnapLineStrategy::decoration(const KoViewConverter &converter) const
73{
74 QSizeF unzoomedSize = converter.viewToDocument(QSizeF(5, 5));
75 QPainterPath decoration;
76 decoration.moveTo(snappedPosition() - QPointF(unzoomedSize.width(), 0));
77 decoration.lineTo(snappedPosition() + QPointF(unzoomedSize.width(), 0));
78 decoration.moveTo(snappedPosition() - QPointF(0, unzoomedSize.height()));
79 decoration.lineTo(snappedPosition() + QPointF(0, unzoomedSize.height()));
80 return decoration;
81}
82
83void KisSnapLineStrategy::addLine(Qt::Orientation orientation, qreal pos)
84{
85 if (orientation == Qt::Horizontal) {
86 m_d->horizontalLines << pos;
87 } else {
88 m_d->verticalLines << pos;
89 }
90}
91
93{
94 m_d->horizontalLines = lines;
95}
96
98{
99 m_d->verticalLines = lines;
100}
101
const QScopedPointer< Private > m_d
void setVerticalLines(const QList< qreal > &lines)
QPainterPath decoration(const KoViewConverter &converter) const override
returns the current snap strategy decoration
void addLine(Qt::Orientation orientation, qreal pos)
KisSnapLineStrategy(KoSnapGuide::Strategy type=KoSnapGuide::CustomSnapping)
bool snap(const QPointF &mousePosition, KoSnapProxy *proxy, qreal maxSnapDistance) override
void setHorizontalLines(const QList< qreal > &lines)
Strategy
the different possible snap Strategies
Definition KoSnapGuide.h:49
void setSnappedPosition(const QPointF &position, SnapType snapType)
sets the current snapped position
QPointF snappedPosition() const
returns the snapped position form the last call to snapToPoints
virtual QPointF viewToDocument(const QPointF &viewPoint) const
qreal kisDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:190