17#include <klocalizedstring.h>
19#include <ktoggleaction.h>
34#include <QPainterPath>
35#include <QApplication>
40bool hasLockedValidTemporaryConstraint(
const std::optional<KisTemporaryPaintConstraint> &constraint)
42 return constraint && constraint->isLocked() && constraint->hasValidLine();
97 if (
visible() != shouldBeVisible) {
118 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
131 if (!assistant)
return;
165 assistant->setAssistantGlobalColorCache(
view()->document()->assistantsGlobalColor());
186 assistant->setAdjustedBrushPosition(position);
217 const qreal moveThresholdPt = 4.0 / (converter->
effectiveZoom() * qMax(image->
xRes(), image->
yRes()));
223 QPointF best = point;
224 qreal minSquareDistance = std::numeric_limits<qreal>::max();
225 qreal secondSquareDistance = std::numeric_limits<qreal>::max();
229 int numSuitableAssistants = 0;
233 if (assistant->isSnappingActive() ==
true){
234 QPointF newpoint = assistant->adjustPosition(point, strokeBegin,
true, moveThresholdPt);
238 if (qIsNaN(newpoint.x()) || qIsNaN(newpoint.y())) {
241 ++numSuitableAssistants;
243 if (dist < minSquareDistance) {
245 secondSquareDistance = minSquareDistance;
246 minSquareDistance = dist;
247 bestAssistant = assistant;
248 }
else if (dist < secondSquareDistance) {
249 secondSquareDistance = dist;
251 assistant->setFollowBrushPosition(
true);
261 if (numSuitableAssistants > 1 &&
KisAlgebra2D::norm(point - strokeBegin) <= moveThresholdPt
262 && (sqrt(secondSquareDistance) < moveThresholdPt)) {
272 QPointF newpoint =
d->
firstAssistant->adjustPosition(point, strokeBegin,
false, moveThresholdPt);
275 if (!(qIsNaN(newpoint.x()) || qIsNaN(newpoint.y()))) {
297 QPointF originalPoint = point;
298 QPointF originalStrokeBegin = strokeBegin;
300 qreal minDistance = 10000.0;
301 bool minDistValid =
false;
302 QPointF finalPoint = originalPoint;
303 QPointF finalStrokeBegin = originalStrokeBegin;
306 if(assistant->isSnappingActive() ==
true){
308 QPointF
p1 = originalPoint;
309 QPointF
p2 = originalStrokeBegin;
310 assistant->adjustLine(
p1,
p2);
311 if (
p1.isNull() ||
p2.isNull()) {
316 if (
distance < minDistance || !minDistValid) {
318 finalStrokeBegin =
p2;
320 bestAssistant = assistant;
325 bestAssistant->setFollowBrushPosition(
true);
328 strokeBegin = finalStrokeBegin;
336 assistant->endStroke();
350 if (hadTemporaryConstraint != hasTemporaryConstraint) {
369 dbgFile<<
"canvas does not exist in painting assistant decoration, you may have passed arguments incorrectly:"<<canvas;
385 const bool outlineVisible =
393 gc.setRenderHint(QPainter::Antialiasing,
true);
402 pen.setCosmetic(
true);
406 QPen anchorOutlinePen(QColor(0, 0, 0, 180), 1.0);
407 anchorOutlinePen.setCosmetic(
true);
408 gc.setPen(anchorOutlinePen);
409 gc.setBrush(Qt::NoBrush);
410 gc.drawEllipse(
p1, 4.0, 4.0);
413 anchorPen.setCosmetic(
true);
414 gc.setPen(anchorPen);
415 gc.drawLine(
p1 + QPointF(-6.0, 0.0),
p1 + QPointF(6.0, 0.0));
416 gc.drawLine(
p1 + QPointF(0.0, -6.0),
p1 + QPointF(0.0, 6.0));
421 QLineF snapLine(
p1,
p2);
425 path.moveTo(snapLine.p1());
426 path.lineTo(snapLine.p2());
431 const QPointF markerDocPos =
436 const QPointF brushPos = initialTransform.map(markerDocPos);
437 const qreal markerRadius = 9.0;
439 QPen markerOutlinePen(QColor(0, 0, 0, 190), 1.0);
440 markerOutlinePen.setCosmetic(
true);
441 gc.setPen(markerOutlinePen);
442 gc.setBrush(Qt::NoBrush);
443 gc.drawEllipse(brushPos, markerRadius, markerRadius);
446 markerPen.setCosmetic(
true);
447 gc.setPen(markerPen);
448 gc.drawEllipse(brushPos, markerRadius - 2.0, markerRadius - 2.0);
475 c.
fromQColor(assistant->effectiveAssistantColor());
481 QPointF transformedHandle = initialTransform.map(*handle);
485 path.addEllipse(ellipse);
488 gc.setPen(Qt::NoPen);
489 gc.setBrush(colorToPaint);
496 QPointF transformedHandle = initialTransform.map(*handle);
500 path.addEllipse(ellipse);
503 gc.setPen(Qt::NoPen);
504 gc.setBrush(colorToPaint);
525 if (!hs.contains(handle)) {
526 hs.push_back(handle);
530 if (!hs.contains(handle)) {
531 hs.push_back(handle);
542 if (
view()->document()) {
602 assistant->uncache();
625 return view()->document()->assistantsGlobalColor();
632 view()->document()->setAssistantsGlobalColor(color);
635 assistant->setAssistantGlobalColorCache(color);
671 QPointF pos = snapGuide->
snap(e->
point, offset, useModifiers ? e->
modifiers() : Qt::NoModifier);
684 QPointF pos = snapGuide->
snap(pt, offset, Qt::NoModifier);
695 maxRect.moveTopLeft(position+additional);
696 const QMargins m(2, 2, 2, 2);
698#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
700 target.moveCenter(maxRect.center());
706 QRect
target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
707 target.moveCenter(maxRect.center());
714 maxRect.moveTopLeft(position);
715 const QMargins m(2, 2, 2, 2);
716#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
718 target.moveCenter(maxRect.center());
730 QRect
target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
731 target.moveCenter(maxRect.center());
756 QBrush backgroundColor = sysPalette.window();
758 QPen stroke(sysPalette.window(), 2);
761 gc.setRenderHint(QPainter::Antialiasing);
765 QRectF bgRect(actionsBGRectangle.x(),
766 actionsBGRectangle.y(),
769 bgPath.addRoundedRect(bgRect, 6, 6);
775 if (assistant->getEditorPosition() ==
selectedAssistant()->getEditorPosition()) {
777 stroke.setColor(sysPalette.color(QPalette::Highlight));
784 gc.fillPath(bgPath, backgroundColor);
788 if (assistant->useCustomColor()) {
790 c.
fromQColor(assistant->effectiveAssistantColor());
792 assistantColor.setAlpha(255);
795 gc.setClipPath(bgPath, Qt::IntersectClip);
796 gc.fillRect(QRectF(QPointF(bgRect.left(), bgRect.bottom() - 4.0), bgRect.bottomRight()), assistantColor);
805 QPainterPath dragRect;
809 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
812 QPainterPath dragRectDots;
816 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
817 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
818 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
819 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
820 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
821 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
822 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
823 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
825 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)
std::optional< KisTemporaryPaintConstraint > temporaryConstraint() const
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 temporaryConstraintAvailabilityChanged()
void setTemporaryConstraint(std::optional< KisTemporaryPaintConstraint > constraint)
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())
qreal normSquared(const T &a)
bool intersectLineRect(QLineF &line, const QRect rect, bool extend)
@ 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
QPointF temporaryAdjustedBrushPosition
KisPaintingAssistantSP selectedAssistant
std::optional< KisTemporaryPaintConstraint > temporaryConstraint
bool hasTemporaryAdjustedBrushPosition
KisPaintingAssistantSP firstAssistant
bool snapOnlyOneAssistant
static KoColorSpaceRegistry * instance()