19#include <QPainterPath>
28 : canvas(parentCanvas), additionalEditedShape(0), currentStrategy(0),
71 d->additionalEditedShape = shape;
76 return d->additionalEditedShape;
82 d->usedStrategies |= type;
84 d->usedStrategies &= ~type;
90 return d->usedStrategies & type;
100 return d->usedStrategies;
108 d->strategies.append(
toQShared(customStrategy));
114 for (
auto it =
d->strategies.begin(); it !=
d->strategies.end(); ) {
115 if ((*it)->type() == type) {
119 it =
d->strategies.erase(it);
149 return d->snapDistance;
152QPointF
KoSnapGuide::snap(
const QPointF &mousePosition,
const QPointF &dragOffset, Qt::KeyboardModifiers modifiers)
154 QPointF pos = mousePosition + dragOffset;
155 pos =
snap(pos, modifiers);
156 return pos - dragOffset;
161 d->currentStrategy.clear();
163 if (!
d->active || (modifiers & Qt::ShiftModifier))
164 return mousePosition;
168 using PriorityTuple = std::tuple<KoSnapStrategy::SnapType, qreal>;
171 const qreal maxSnapDistance =
d->canvas->viewConverter()->
172 viewToDocument(QSizeF(
d->snapDistance,
173 d->snapDistance)).width();
175 foreach (Private::KoSnapStrategySP strategy,
d->strategies) {
176 if (
d->usedStrategies & strategy->type() ||
180 if (! strategy->snap(mousePosition, &proxy, maxSnapDistance))
183 QPointF snapCandidate = strategy->snappedPosition();
186 const PriorityTuple priority(strategy->snappedType(),
distance);
187 if (priority < minPriority) {
188 d->currentStrategy = strategy;
189 minPriority = priority;
194 if (!
d->currentStrategy)
195 return mousePosition;
197 return d->currentStrategy->snappedPosition();
204 if (
d->currentStrategy) {
205 rect =
d->currentStrategy->decoration(*
d->canvas->viewConverter()).boundingRect();
206 return rect.adjusted(-2, -2, 2, 2);
214 if (!
d->currentStrategy || !
d->active)
217 QPainterPath decoration =
d->currentStrategy->decoration(converter);
219 int thickness =
d->canvas->resourceManager()?
d->canvas->resourceManager()->decorationThickness(): 1;
221 painter.setBrush(Qt::NoBrush);
227 whitePen.setCosmetic(
true);
228 whitePen.setStyle(Qt::SolidLine);
229 painter.setPen(whitePen);
230 painter.drawPath(decoration);
234 redPen.setCosmetic(
true);
235 redPen.setStyle(Qt::DotLine);
236 painter.setPen(redPen);
237 painter.drawPath(decoration);
252 return d->ignoredPoints;
262 return d->ignoredShapes;
267 d->currentStrategy.clear();
268 d->additionalEditedShape = 0;
269 d->ignoredPoints.clear();
270 d->ignoredShapes.clear();
272 int strategyCount =
d->strategies.count();
273 for (
int i = strategyCount-1; i >= 0; --i) {
275 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
virtual QColor convertColorToDisplayColorSpace(const KoColor color) const =0
convertColorToDisplayColorSpace
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
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.
void paint(QPainter &painter, const KoViewConverter &converter, const KoColorDisplayRendererInterface *displayRenderer)
paints the guide
bool isStrategyEnabled(Strategy type) const
const QScopedPointer< Private > d
void setIgnoredPathPoints(const QList< KoPathPoint * > &ignoredPoints)
Sets a list of path points to ignore.
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)