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;
269 if(assistant->isSnappingActive() ==
true){
271 QPointF
p1 = originalPoint;
272 QPointF
p2 = originalStrokeBegin;
273 assistant->adjustLine(
p1,
p2);
274 if (
p1.isNull() ||
p2.isNull()) {
279 if (
distance < minDistance || !minDistValid) {
281 finalStrokeBegin =
p2;
283 bestAssistant = assistant;
288 bestAssistant->setFollowBrushPosition(
true);
291 strokeBegin = finalStrokeBegin;
299 assistant->endStroke();
310 dbgFile<<
"canvas does not exist in painting assistant decoration, you may have passed arguments incorrectly:"<<canvas;
322 const bool outlineVisible =
347 QColor colorToPaint = assistant->effectiveAssistantColor();
352 QPointF transformedHandle = initialTransform.map(*handle);
356 path.addEllipse(ellipse);
359 gc.setPen(Qt::NoPen);
360 gc.setBrush(colorToPaint);
367 QPointF transformedHandle = initialTransform.map(*handle);
371 path.addEllipse(ellipse);
374 gc.setPen(Qt::NoPen);
375 gc.setBrush(colorToPaint);
396 if (!hs.contains(handle)) {
397 hs.push_back(handle);
401 if (!hs.contains(handle)) {
402 hs.push_back(handle);
413 if (
view()->document()) {
473 assistant->uncache();
490 return view()->document()->assistantsGlobalColor();
497 view()->document()->setAssistantsGlobalColor(color);
500 assistant->setAssistantGlobalColorCache(color);
536 QPointF pos = snapGuide->
snap(e->
point, offset, useModifiers ? e->
modifiers() : Qt::NoModifier);
549 QPointF pos = snapGuide->
snap(pt, offset, Qt::NoModifier);
571 QPen stroke(QColor(60, 60, 60, 80), 2);
573 gc.setRenderHint(QPainter::Antialiasing);
583 if (assistant->getEditorPosition() ==
selectedAssistant()->getEditorPosition()) {
585 stroke.setColor(qApp->palette().color(QPalette::Highlight));
592 gc.fillPath(bgPath, backgroundColor);
596 QColor dragDecorationColor(150,150,150,255);
598 QPainterPath dragRect;
602 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
605 QPainterPath dragRectDots;
606 QColor dragDecorationDotsColor(50,50,50,255);
608 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
609 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
610 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
611 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
612 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
613 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
614 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
615 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
617 gc.fillPath(dragRectDots,dragDecorationDotsColor);
627 if (assistant->isSnappingActive() ==
true) {
635 if (assistant->isLocked()) {
638 qreal oldOpacity = gc.opacity();
641 gc.setOpacity(oldOpacity);
646 if(assistant->isDuplicating()) {
648 qreal oldOpacity = gc.opacity();
651 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