15#include <klocalizedstring.h>
17#include <ktoggleaction.h>
29#include <QPainterPath>
30#include <QApplication>
78 const bool shouldBeVisible = !
assistants().isEmpty();
80 if (
visible() != shouldBeVisible) {
101 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
114 if (!assistant)
return;
148 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
160 assistant->setAdjustedBrushPosition(position);
184 const qreal moveThresholdPt = 4.0 / (converter->
effectiveZoom() * qMax(image->
xRes(), image->
yRes()));
186 QPointF best = point;
187 qreal minSquareDistance = std::numeric_limits<qreal>::max();
188 qreal secondSquareDistance = std::numeric_limits<qreal>::max();
192 int numSuitableAssistants = 0;
196 if (assistant->isSnappingActive() ==
true){
197 QPointF newpoint = assistant->adjustPosition(point, strokeBegin,
true, moveThresholdPt);
201 if (qIsNaN(newpoint.x()) || qIsNaN(newpoint.y())) {
204 ++numSuitableAssistants;
206 if (dist < minSquareDistance) {
208 secondSquareDistance = minSquareDistance;
209 minSquareDistance = dist;
210 bestAssistant = assistant;
211 }
else if (dist < secondSquareDistance) {
212 secondSquareDistance = dist;
214 assistant->setFollowBrushPosition(
true);
224 if (numSuitableAssistants > 1 &&
KisAlgebra2D::norm(point - strokeBegin) <= moveThresholdPt
225 && (sqrt(secondSquareDistance) < moveThresholdPt)) {
235 QPointF newpoint =
d->
firstAssistant->adjustPosition(point, strokeBegin,
false, moveThresholdPt);
238 if (!(qIsNaN(newpoint.x()) || qIsNaN(newpoint.y()))) {
260 QPointF originalPoint = point;
261 QPointF originalStrokeBegin = strokeBegin;
263 qreal minDistance = 10000.0;
264 bool minDistValid =
false;
265 QPointF finalPoint = originalPoint;
266 QPointF finalStrokeBegin = originalStrokeBegin;
270 if(assistant->isSnappingActive() ==
true){
272 QPointF
p1 = originalPoint;
273 QPointF
p2 = originalStrokeBegin;
274 assistant->adjustLine(
p1,
p2);
275 if (
p1.isNull() ||
p2.isNull()) {
280 if (
distance < minDistance || !minDistValid) {
282 finalStrokeBegin =
p2;
284 bestAssistant = assistant;
290 bestAssistant->setFollowBrushPosition(
true);
293 strokeBegin = finalStrokeBegin;
301 assistant->endStroke();
312 dbgFile<<
"canvas does not exist in painting assistant decoration, you may have passed arguments incorrectly:"<<canvas;
324 const bool outlineVisible =
349 QColor colorToPaint = assistant->effectiveAssistantColor();
354 QPointF transformedHandle = initialTransform.map(*handle);
358 path.addEllipse(ellipse);
361 gc.setPen(Qt::NoPen);
362 gc.setBrush(colorToPaint);
369 QPointF transformedHandle = initialTransform.map(*handle);
373 path.addEllipse(ellipse);
376 gc.setPen(Qt::NoPen);
377 gc.setBrush(colorToPaint);
398 if (!hs.contains(handle)) {
399 hs.push_back(handle);
403 if (!hs.contains(handle)) {
404 hs.push_back(handle);
415 if (
view()->document()) {
475 assistant->uncache();
492 return view()->document()->assistantsGlobalColor();
499 view()->document()->setAssistantsGlobalColor(color);
502 assistant->setAssistantGlobalColorCache(color);
538 QPointF pos = snapGuide->
snap(e->
point, offset, useModifiers ? e->
modifiers() : Qt::NoModifier);
551 QPointF pos = snapGuide->
snap(pt, offset, Qt::NoModifier);
573 QPen stroke(QColor(60, 60, 60, 80), 2);
575 gc.setRenderHint(QPainter::Antialiasing);
585 if (assistant->getEditorPosition() ==
selectedAssistant()->getEditorPosition()) {
587 stroke.setColor(qApp->palette().color(QPalette::Highlight));
594 gc.fillPath(bgPath, backgroundColor);
598 QColor dragDecorationColor(150,150,150,255);
600 QPainterPath dragRect;
605 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
608 QPainterPath dragRectDots;
609 QColor dragDecorationDotsColor(50,50,50,255);
611 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
612 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
613 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
614 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
615 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
616 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
617 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
618 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
620 gc.fillPath(dragRectDots,dragDecorationDotsColor);
630 if (assistant->isSnappingActive() ==
true) {
638 if (assistant->isLocked()) {
641 qreal oldOpacity = gc.opacity();
644 gc.setOpacity(oldOpacity);
649 if(assistant->isDuplicating()) {
651 qreal oldOpacity = gc.opacity();
654 gc.setOpacity(oldOpacity);
const QString COMPOSITE_ERASE
qreal distance(const QPointF &p1, const QPointF &p2)
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
KisImageWSP image() const
KisViewManager * viewManager() const
void setPriority(int value)
QPointer< KisView > view() const
virtual void setVisible(bool v)
@ ASSISTANTS_DRAW_MODE_PIXMAP_CACHE
@ ASSISTANTS_DRAW_MODE_LARGE_PIXMAP_CACHE
AssistantsDrawMode assistantsDrawMode(bool defaultValue=false) const
QTransform documentToWidgetTransform() const
qreal effectiveZoom() const
QList< KisPaintingAssistantSP > assistants() const
void setHandleSize(int handleSize)
void addAssistant(KisPaintingAssistantSP assistant)
QPointF snapToGuide(KoPointerEvent *e, const QPointF &offset, bool useModifiers)
bool isEditingAssistants()
bool outlineVisibility()
returns preview visibility
void activateAssistantsEditor()
void setAssistantVisible(bool set)
sets whether the main assistant is visible
void toggleOutlineVisible()
toggles whether there will be a preview of the assistant result when painting
void setGlobalAssistantsColor(QColor color)
void slotUpdateDecorationVisibility()
bool hasPaintableAssistants() const
void setSelectedAssistant(KisPaintingAssistantSP assistant)
void selectedAssistantChanged()
void toggleAssistantVisible()
toggles whether the assistant is active or not
void setOnlyOneAssistantSnap(bool assistant)
sets whether we snap to only one assistant
KisPaintingAssistantsDecoration(QPointer< KisView > parent)
void setAdjustedBrushPosition(const QPointF position)
void removeAssistant(KisPaintingAssistantSP assistant)
void uncache()
uncache all assistants
void raiseAssistant(KisPaintingAssistantSP assistant)
struct AssistantEditorData globalEditorWidgetData
KisPaintingAssistantSP selectedAssistant()
void drawEditorWidget(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter)
bool assistantVisibility()
returns assistant visibility
void setAssistants(const QList< KisPaintingAssistantSP > &assistants)
void deactivateAssistantsEditor()
void drawDecoration(QPainter &gc, const QRectF &updateRect, const KisCoordinatesConverter *converter, KisCanvas2 *canvas) override
void setEraserSnap(bool assistant)
sets whether eraser brushes snap
void adjustLine(QPointF &point, QPointF &strokeBegin)
void setOutlineVisible(bool set)
sets whether the preview is visible
QList< KisPaintingAssistantHandleSP > handles()
~KisPaintingAssistantsDecoration() override
QColor globalAssistantsColor()
QPointF adjustPosition(const QPointF &point, const QPointF &strokeBegin)
void drawHandles(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter)
QWidget * mainWindowAsQWidget() const
QPointer< KoCanvasResourceProvider > resourceManager
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_NOOP(cond)
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
@ CurrentEffectiveCompositeOp
bool duplicateButtonActivated
QPointF deleteIconPosition
const QPixmap m_iconLockOff
const QPixmap m_iconDelete
const QPixmap m_iconLockOn
const QPixmap m_iconDuplicate
bool deleteButtonActivated
QPointF lockedIconPosition
const QPixmap m_iconSnapOff
QPointF duplicateIconPosition
const QPixmap m_iconSnapOn
const int dragDecorationWidth
bool m_isEditingAssistants
KisPaintingAssistantSP selectedAssistant
KisPaintingAssistantSP firstAssistant
bool snapOnlyOneAssistant