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();
493 return view()->document()->assistantsGlobalColor();
500 view()->document()->setAssistantsGlobalColor(color);
503 assistant->setAssistantGlobalColorCache(color);
539 QPointF pos = snapGuide->
snap(e->
point, offset, useModifiers ? e->
modifiers() : Qt::NoModifier);
552 QPointF pos = snapGuide->
snap(pt, offset, Qt::NoModifier);
563 maxRect.moveTopLeft(position+additional);
564 const QMargins m(2, 2, 2, 2);
565 QRect
target(QPoint(), (icon.size()/icon.devicePixelRatioF()));
566 target.moveCenter(maxRect.center());
572 maxRect.moveTopLeft(position);
573 const QMargins m(2, 2, 2, 2);
574 QRect
target(QPoint(), (icon.size()/icon.devicePixelRatioF()));
575 target.moveCenter(maxRect.center());
599 QBrush backgroundColor = sysPalette.window();
601 QPen stroke(sysPalette.window(), 2);
604 gc.setRenderHint(QPainter::Antialiasing);
614 if (assistant->getEditorPosition() ==
selectedAssistant()->getEditorPosition()) {
616 stroke.setColor(sysPalette.color(QPalette::Highlight));
623 gc.fillPath(bgPath, backgroundColor);
630 QPainterPath dragRect;
634 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
637 QPainterPath dragRectDots;
641 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
642 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
643 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
644 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
645 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
646 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
647 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
648 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
650 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)
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 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 drawSingleState(QPainter &gc, const QImage &icon, QRect maxRect, const QPoint &position, const KoColorDisplayRendererInterface *renderInterface, QPoint additional=QPoint())
void drawDoubleState(QPainter &gc, const QImage &icon, const QImage &icon2, QRect maxRect, const QPoint &position, const bool state, const KoColorDisplayRendererInterface *renderInterface)
@ CurrentEffectiveCompositeOp
bool duplicateButtonActivated
const QImage m_iconDelete
QPointF deleteIconPosition
const QImage m_iconDuplicate
const QImage m_iconLockOn
const QImage m_iconSnapOff
const QImage m_iconLockOff
bool deleteButtonActivated
QPointF lockedIconPosition
QPointF duplicateIconPosition
const QImage m_iconSnapOn
const int dragDecorationWidth
bool m_isEditingAssistants
KisPaintingAssistantSP selectedAssistant
KisPaintingAssistantSP firstAssistant
bool snapOnlyOneAssistant