15#include <klocalizedstring.h>
17#include <ktoggleaction.h>
30#include <QPainterPath>
31#include <QApplication>
79 const bool shouldBeVisible = !
assistants().isEmpty();
81 if (
visible() != shouldBeVisible) {
102 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
115 if (!assistant)
return;
149 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
161 assistant->setAdjustedBrushPosition(position);
185 const qreal moveThresholdPt = 4.0 / (converter->
effectiveZoom() * qMax(image->
xRes(), image->
yRes()));
187 QPointF best = point;
188 qreal minSquareDistance = std::numeric_limits<qreal>::max();
189 qreal secondSquareDistance = std::numeric_limits<qreal>::max();
193 int numSuitableAssistants = 0;
197 if (assistant->isSnappingActive() ==
true){
198 QPointF newpoint = assistant->adjustPosition(point, strokeBegin,
true, moveThresholdPt);
202 if (qIsNaN(newpoint.x()) || qIsNaN(newpoint.y())) {
205 ++numSuitableAssistants;
207 if (dist < minSquareDistance) {
209 secondSquareDistance = minSquareDistance;
210 minSquareDistance = dist;
211 bestAssistant = assistant;
212 }
else if (dist < secondSquareDistance) {
213 secondSquareDistance = dist;
215 assistant->setFollowBrushPosition(
true);
225 if (numSuitableAssistants > 1 &&
KisAlgebra2D::norm(point - strokeBegin) <= moveThresholdPt
226 && (sqrt(secondSquareDistance) < moveThresholdPt)) {
236 QPointF newpoint =
d->
firstAssistant->adjustPosition(point, strokeBegin,
false, moveThresholdPt);
239 if (!(qIsNaN(newpoint.x()) || qIsNaN(newpoint.y()))) {
261 QPointF originalPoint = point;
262 QPointF originalStrokeBegin = strokeBegin;
264 qreal minDistance = 10000.0;
265 bool minDistValid =
false;
266 QPointF finalPoint = originalPoint;
267 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;
289 bestAssistant->setFollowBrushPosition(
true);
292 strokeBegin = finalStrokeBegin;
300 assistant->endStroke();
311 dbgFile<<
"canvas does not exist in painting assistant decoration, you may have passed arguments incorrectly:"<<canvas;
323 const bool outlineVisible =
349 c.
fromQColor(assistant->effectiveAssistantColor());
355 QPointF transformedHandle = initialTransform.map(*handle);
359 path.addEllipse(ellipse);
362 gc.setPen(Qt::NoPen);
363 gc.setBrush(colorToPaint);
370 QPointF transformedHandle = initialTransform.map(*handle);
374 path.addEllipse(ellipse);
377 gc.setPen(Qt::NoPen);
378 gc.setBrush(colorToPaint);
399 if (!hs.contains(handle)) {
400 hs.push_back(handle);
404 if (!hs.contains(handle)) {
405 hs.push_back(handle);
416 if (
view()->document()) {
476 assistant->uncache();
499 return view()->document()->assistantsGlobalColor();
506 view()->document()->setAssistantsGlobalColor(color);
509 assistant->setAssistantGlobalColorCache(color);
545 QPointF pos = snapGuide->
snap(e->
point, offset, useModifiers ? e->
modifiers() : Qt::NoModifier);
558 QPointF pos = snapGuide->
snap(pt, offset, Qt::NoModifier);
569 maxRect.moveTopLeft(position+additional);
570 const QMargins m(2, 2, 2, 2);
572#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
574 target.moveCenter(maxRect.center());
580 QRect
target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
581 target.moveCenter(maxRect.center());
588 maxRect.moveTopLeft(position);
589 const QMargins m(2, 2, 2, 2);
590#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
592 target.moveCenter(maxRect.center());
604 QRect
target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
605 target.moveCenter(maxRect.center());
630 QBrush backgroundColor = sysPalette.window();
632 QPen stroke(sysPalette.window(), 2);
635 gc.setRenderHint(QPainter::Antialiasing);
639 QRectF bgRect(actionsBGRectangle.x(),
640 actionsBGRectangle.y(),
643 bgPath.addRoundedRect(bgRect, 6, 6);
649 if (assistant->getEditorPosition() ==
selectedAssistant()->getEditorPosition()) {
651 stroke.setColor(sysPalette.color(QPalette::Highlight));
658 gc.fillPath(bgPath, backgroundColor);
662 if (assistant->useCustomColor()) {
664 c.
fromQColor(assistant->effectiveAssistantColor());
666 assistantColor.setAlpha(255);
669 gc.setClipPath(bgPath, Qt::IntersectClip);
670 gc.fillRect(QRectF(QPointF(bgRect.left(), bgRect.bottom() - 4.0), bgRect.bottomRight()), assistantColor);
679 QPainterPath dragRect;
683 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
686 QPainterPath dragRectDots;
690 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
691 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
692 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
693 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
694 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
695 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
696 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
697 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
699 gc.fillPath(dragRectDots,dragDecorationDotsColor);
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const QString COMPOSITE_ERASE
qreal distance(const QPointF &p1, const QPointF &p2)
int iconSize(qreal width, qreal height)
KoColorDisplayRendererInterface * displayRendererInterface() const override
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
KisImageWSP image() const
void updateCanvasDecorations()
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
void drawHandles(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter, const KoColorDisplayRendererInterface *renderInterface)
QList< KisPaintingAssistantSP > assistants() const
void setHandleSize(int handleSize)
void addAssistant(KisPaintingAssistantSP assistant)
QPointF snapToGuide(KoPointerEvent *e, const QPointF &offset, bool useModifiers)
void drawEditorWidget(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter, const KoColorDisplayRendererInterface *renderInterface)
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()
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)
QPointer< KoCanvasResourceProvider > resourceManager
virtual QColor convertColorToDisplayColorSpace(const KoColor color) const =0
convertColorToDisplayColorSpace
virtual QImage convertImageToDisplayColorSpace(const QImage source) const =0
convertImageToDisplayColorSpace
virtual QPalette systemPaletteForDisplayColorSpace() const =0
systemPaletteForDisplayColorSpace
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
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)
void drawDoubleState(QPainter &gc, const QIcon &icon, const QSize &iconSize, const QIcon &icon2, QRect maxRect, const QPoint &position, const bool state, const KoColorDisplayRendererInterface *renderInterface)
void drawSingleState(QPainter &gc, const QIcon &icon, const QSize &iconSize, QRect maxRect, const QPoint &position, const KoColorDisplayRendererInterface *renderInterface, QPoint additional=QPoint())
@ CurrentEffectiveCompositeOp
bool duplicateButtonActivated
const QIcon m_iconLockOff
QPointF deleteIconPosition
const QIcon m_iconDuplicate
bool deleteButtonActivated
QPointF lockedIconPosition
QPointF duplicateIconPosition
const QIcon m_iconSnapOff
const int dragDecorationWidth
bool m_isEditingAssistants
KisPaintingAssistantSP selectedAssistant
KisPaintingAssistantSP firstAssistant
bool snapOnlyOneAssistant