From 190fd2c37786d32afdf0dc41d6b8d0f1053dc90a Mon Sep 17 00:00:00 2001 From: Dmitry Kazakov Date: Fri, 4 Sep 2015 11:25:37 +0300 Subject: [PATCH] Fix Clone Tool when picking from a different layer More than that, you can pick your source from a different image opened in Krita even! :) BUG:347961 --- krita/image/brushengine/kis_paintop_settings.cpp | 3 ++- krita/image/brushengine/kis_paintop_settings.h | 2 +- .../defaultpaintops/duplicate/kis_duplicateop.cpp | 12 +++++++++++- .../duplicate/kis_duplicateop_settings.cpp | 7 ++++++- .../duplicate/kis_duplicateop_settings.h | 5 ++++- krita/ui/tool/kis_tool_freehand.cc | 3 ++- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/krita/image/brushengine/kis_paintop_settings.cpp b/krita/image/brushengine/kis_paintop_settings.cpp index a2dadb5bd8..4ca8ad11af 100644 --- a/krita/image/brushengine/kis_paintop_settings.cpp +++ b/krita/image/brushengine/kis_paintop_settings.cpp @@ -93,10 +93,11 @@ KisPaintOpPresetWSP KisPaintOpSettings::preset() const return d->preset; } -bool KisPaintOpSettings::mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers) +bool KisPaintOpSettings::mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode) { Q_UNUSED(pos); Q_UNUSED(modifiers); + Q_UNUSED(currentNode); setRandomOffset(); return true; // ignore the event by default } diff --git a/krita/image/brushengine/kis_paintop_settings.h b/krita/image/brushengine/kis_paintop_settings.h index 4a3ecfe90b..8ad544013f 100644 --- a/krita/image/brushengine/kis_paintop_settings.h +++ b/krita/image/brushengine/kis_paintop_settings.h @@ -65,7 +65,7 @@ public: * If the tool is supposed to ignore the event, the paint op should return false * and if the tool is supposed to use the event, return true. */ - virtual bool mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers); + virtual bool mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode); /** * This function is called to set random offsets to the brush whenever the mouse is clicked. It is diff --git a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp index 75977631b1..50e950db74 100644 --- a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp +++ b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp @@ -111,7 +111,17 @@ KisSpacingInformation KisDuplicateOp::paintAt(const KisPaintInformation& info) realSourceDevice = m_image->projection(); } else { - realSourceDevice = m_node->projection(); + KisNodeSP externalSourceNode = m_settings->sourceNode(); + + /** + * The saved layer might have been deleted by then, so check if it + * still belongs to a graph + */ + if (!externalSourceNode || !externalSourceNode->graphListener()) { + externalSourceNode = m_node; + } + + realSourceDevice = externalSourceNode->projection(); } qreal scale = m_sizeOption.apply(info); diff --git a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.cpp b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.cpp index 47439e2d80..3b4e8122e5 100644 --- a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.cpp +++ b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.cpp @@ -68,11 +68,12 @@ QPointF KisDuplicateOpSettings::position() const return m_position; } -bool KisDuplicateOpSettings::mousePressEvent(const KisPaintInformation &info, Qt::KeyboardModifiers modifiers) +bool KisDuplicateOpSettings::mousePressEvent(const KisPaintInformation &info, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode) { bool ignoreEvent = true; if (modifiers == Qt::ControlModifier) { + m_sourceNode = currentNode; m_position = info.pos(); m_isOffsetNotUptodate = true; ignoreEvent = false; @@ -88,6 +89,10 @@ bool KisDuplicateOpSettings::mousePressEvent(const KisPaintInformation &info, Qt return ignoreEvent; } +KisNodeWSP KisDuplicateOpSettings::sourceNode() const +{ + return m_sourceNode; +} void KisDuplicateOpSettings::activate() { diff --git a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.h b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.h index 30de96d214..2fbcbe36f8 100644 --- a/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.h +++ b/krita/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.h @@ -45,7 +45,7 @@ public: QPointF offset() const; QPointF position() const; - virtual bool mousePressEvent(const KisPaintInformation& pos, Qt::KeyboardModifiers modifiers); + virtual bool mousePressEvent(const KisPaintInformation& pos, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode); void activate(); void fromXML(const QDomElement& elt); @@ -54,11 +54,14 @@ public: KisPaintOpSettingsSP clone() const; QPainterPath brushOutline(const KisPaintInformation &info, OutlineMode mode) const; + KisNodeWSP sourceNode() const; + public: QPointF m_offset; bool m_isOffsetNotUptodate; QPointF m_position; // Give the position of the last alt-click + KisNodeWSP m_sourceNode; }; diff --git a/krita/ui/tool/kis_tool_freehand.cc b/krita/ui/tool/kis_tool_freehand.cc index d2eab7d44e..6dd0e32381 100644 --- a/krita/ui/tool/kis_tool_freehand.cc +++ b/krita/ui/tool/kis_tool_freehand.cc @@ -265,7 +265,8 @@ bool KisToolFreehand::tryPickByPaintOp(KoPointerEvent *event, AlternateAction ac event->rotation(), event->tangentialPressure(), perspective, 0, 0), - event->modifiers()); + event->modifiers(), + currentNode()); return !paintOpIgnoredEvent; } -- GitLab