18#include <QPainterPath>
27 : canvas(parentCanvas), additionalEditedShape(0), currentStrategy(0),
70 d->additionalEditedShape = shape;
75 return d->additionalEditedShape;
81 d->usedStrategies |= type;
83 d->usedStrategies &= ~type;
89 return d->usedStrategies & type;
99 return d->usedStrategies;
107 d->strategies.append(
toQShared(customStrategy));
113 for (
auto it =
d->strategies.begin(); it !=
d->strategies.end(); ) {
114 if ((*it)->type() == type) {
118 it =
d->strategies.erase(it);
148 return d->snapDistance;
151QPointF
KoSnapGuide::snap(
const QPointF &mousePosition,
const QPointF &dragOffset, Qt::KeyboardModifiers modifiers)
153 QPointF pos = mousePosition + dragOffset;
154 pos =
snap(pos, modifiers);
155 return pos - dragOffset;
160 d->currentStrategy.clear();
162 if (!
d->active || (modifiers & Qt::ShiftModifier))
163 return mousePosition;
167 using PriorityTuple = std::tuple<KoSnapStrategy::SnapType, qreal>;
170 const qreal maxSnapDistance =
d->canvas->viewConverter()->
171 viewToDocument(QSizeF(
d->snapDistance,
172 d->snapDistance)).width();
174 foreach (Private::KoSnapStrategySP strategy,
d->strategies) {
175 if (
d->usedStrategies & strategy->type() ||
179 if (! strategy->snap(mousePosition, &proxy, maxSnapDistance))
182 QPointF snapCandidate = strategy->snappedPosition();
185 const PriorityTuple priority(strategy->snappedType(),
distance);
186 if (priority < minPriority) {
187 d->currentStrategy = strategy;
188 minPriority = priority;
193 if (!
d->currentStrategy)
194 return mousePosition;
196 return d->currentStrategy->snappedPosition();
203 if (
d->currentStrategy) {
204 rect =
d->currentStrategy->decoration(*
d->canvas->viewConverter()).boundingRect();
205 return rect.adjusted(-2, -2, 2, 2);
213 if (!
d->currentStrategy || !
d->active)
216 QPainterPath decoration =
d->currentStrategy->decoration(converter);
218 int thickness =
d->canvas->resourceManager()?
d->canvas->resourceManager()->decorationThickness(): 1;
220 painter.setBrush(Qt::NoBrush);
222 QPen whitePen(Qt::white, thickness);
223 whitePen.setCosmetic(
true);
224 whitePen.setStyle(Qt::SolidLine);
225 painter.setPen(whitePen);
226 painter.drawPath(decoration);
228 QPen redPen(Qt::red, thickness);
229 redPen.setCosmetic(
true);
230 redPen.setStyle(Qt::DotLine);
231 painter.setPen(redPen);
232 painter.drawPath(decoration);
247 return d->ignoredPoints;
257 return d->ignoredShapes;
262 d->currentStrategy.clear();
263 d->additionalEditedShape = 0;
264 d->ignoredPoints.clear();
265 d->ignoredShapes.clear();
267 int strategyCount =
d->strategies.count();
268 for (
int i = strategyCount-1; i >= 0; --i) {
270 d->strategies.removeAt(i);
float value(const T *src, size_t ch)
qreal distance(const QPointF &p1, const QPointF &p2)
snaps to shape bounding boxes
snaps extension lines of path shapes
snaps to intersections of shapes
StrategiesList strategies
QList< KoPathPoint * > ignoredPoints
QSharedPointer< KoSnapStrategy > KoSnapStrategySP
bool addCustomSnapStrategy(KoSnapStrategy *customStrategy)
KoSnapGuide(KoCanvasBase *canvas)
Creates the snap guide to work on the given canvas.
Private(KoCanvasBase *parentCanvas)
void reset()
Resets the snap guide.
bool isStrategyEnabled(Strategy type) const
const QScopedPointer< Private > d
void setIgnoredPathPoints(const QList< KoPathPoint * > &ignoredPoints)
Sets a list of path points to ignore.
void paint(QPainter &painter, const KoViewConverter &converter)
paints the guide
QList< KoSnapStrategySP > StrategiesList
void setSnapDistance(int distance)
sets the snap distances in pixels
Strategy
the different possible snap Strategies
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
QList< KoShape * > ignoredShapes
void enableSnapping(bool on)
enables the snapping guides
QList< KoPathPoint * > ignoredPathPoints() const
Returns list of ignored points.
void setIgnoredShapes(const QList< KoShape * > &ignoredShapes)
Sets list of ignored shapes.
void enableSnapStrategies(Strategies strategies)
enables the strategies used for snapping
KoShape * additionalEditedShape
void enableSnapStrategy(Strategy type, bool value)
void setAdditionalEditedShape(KoShape *shape)
Adds an additional shape to snap to (useful when creating a path)
KoSnapStrategySP currentStrategy
KoSnapGuide::Strategies enabledSnapStrategies() const
returns the enabled snap strategies
KoSnapGuide::Strategies usedStrategies
QRectF boundingRect()
returns the bounding rect of the guide
void overrideSnapStrategy(Strategy type, KoSnapStrategy *strategy)
bool isSnapping() const
returns if snapping is enabled
static qreal squareDistance(const QPointF &p1, const QPointF &p2)
KoSnapGuide::Strategy type() const
returns the strategies type
snaps to x- or y-coordinates of path points
QSharedPointer< T > toQShared(T *ptr)