diff --git a/libs/ui/tool/kis_tool.h b/libs/ui/tool/kis_tool.h --- a/libs/ui/tool/kis_tool.h +++ b/libs/ui/tool/kis_tool.h @@ -161,6 +161,14 @@ NONE = 10000 }; + enum NodePaintAbility { + VECTOR, + CLONE, + PAINT, + UNPAINTABLE + }; + Q_ENUMS(NodePaintAbility) + static AlternateAction actionToAlternateAction(ToolAction action); virtual void activateAlternateAction(AlternateAction action); @@ -180,6 +188,8 @@ bool isActive() const; + KisTool::NodePaintAbility nodePaintAbility(); + public Q_SLOTS: void activate(ToolActivation activation, const QSet &shapes) override; void deactivate() override; diff --git a/libs/ui/tool/kis_tool.cc b/libs/ui/tool/kis_tool.cc --- a/libs/ui/tool/kis_tool.cc +++ b/libs/ui/tool/kis_tool.cc @@ -524,6 +524,25 @@ } } +KisTool::NodePaintAbility KisTool::nodePaintAbility() +{ + KisNodeSP node = currentNode(); + if (!node) { + return NodePaintAbility::UNPAINTABLE; + } + if (node->inherits("KisShapeLayer")) { + return NodePaintAbility::VECTOR; + } + if (node->inherits("KisCloneLayer")) { + return NodePaintAbility::CLONE; + } + if (node->paintDevice()) { + return NodePaintAbility::PAINT; + } + + return NodePaintAbility::UNPAINTABLE; +} + QWidget* KisTool::createOptionWidget() { d->optionWidget = new QLabel(i18n("No options")); diff --git a/libs/ui/tool/kis_tool_paint.h b/libs/ui/tool/kis_tool_paint.h --- a/libs/ui/tool/kis_tool_paint.h +++ b/libs/ui/tool/kis_tool_paint.h @@ -110,16 +110,6 @@ return QString(); } - enum NodePaintAbility { - NONE, - PAINT, - VECTOR, - CLONE - }; - - /// Checks if and how the tool can paint on the current node - NodePaintAbility nodePaintAbility(); - const KoCompositeOp* compositeOp(); public Q_SLOTS: diff --git a/libs/ui/tool/kis_tool_paint.cc b/libs/ui/tool/kis_tool_paint.cc --- a/libs/ui/tool/kis_tool_paint.cc +++ b/libs/ui/tool/kis_tool_paint.cc @@ -597,24 +597,6 @@ QWhatsThis::showText(QCursor::pos(), quickHelp()); } -KisToolPaint::NodePaintAbility KisToolPaint::nodePaintAbility() -{ - KisNodeSP node = currentNode(); - if (!node) { - return NONE; - } - if (node->inherits("KisShapeLayer")) { - return VECTOR; - } - if (node->inherits("KisCloneLayer")) { - return CLONE; - } - if (node->paintDevice()) { - return PAINT; - } - return NONE; -} - void KisToolPaint::activatePrimaryAction() { pickColorWasOverridden(); diff --git a/libs/ui/tool/kis_tool_polyline_base.cpp b/libs/ui/tool/kis_tool_polyline_base.cpp --- a/libs/ui/tool/kis_tool_polyline_base.cpp +++ b/libs/ui/tool/kis_tool_polyline_base.cpp @@ -79,7 +79,7 @@ { Q_UNUSED(event); - if ((m_type == PAINT && (!nodeEditable() || nodePaintAbility() == NONE)) || + if ((m_type == PAINT && (!nodeEditable() || nodePaintAbility() == UNPAINTABLE)) || (m_type == SELECT && !selectionEditable())) { event->ignore(); diff --git a/libs/ui/tool/kis_tool_rectangle_base.cpp b/libs/ui/tool/kis_tool_rectangle_base.cpp --- a/libs/ui/tool/kis_tool_rectangle_base.cpp +++ b/libs/ui/tool/kis_tool_rectangle_base.cpp @@ -109,7 +109,7 @@ void KisToolRectangleBase::beginPrimaryAction(KoPointerEvent *event) { - if ((m_type == PAINT && (!nodeEditable() || nodePaintAbility() == NONE)) || + if ((m_type == PAINT && (!nodeEditable() || nodePaintAbility() == UNPAINTABLE)) || (m_type == SELECT && !selectionEditable())) { event->ignore(); diff --git a/plugins/tools/basictools/kis_tool_line.cc b/plugins/tools/basictools/kis_tool_line.cc --- a/plugins/tools/basictools/kis_tool_line.cc +++ b/plugins/tools/basictools/kis_tool_line.cc @@ -172,7 +172,7 @@ void KisToolLine::beginPrimaryAction(KoPointerEvent *event) { NodePaintAbility nodeAbility = nodePaintAbility(); - if (nodeAbility == NONE || !nodeEditable()) { + if (nodeAbility == UNPAINTABLE || !nodeEditable()) { event->ignore(); return; } @@ -263,7 +263,7 @@ { NodePaintAbility nodeAbility = nodePaintAbility(); - if (!m_strokeIsRunning || m_startPoint == m_endPoint || nodeAbility == NONE) { + if (!m_strokeIsRunning || m_startPoint == m_endPoint || nodeAbility == UNPAINTABLE) { return; } diff --git a/plugins/tools/tool_transform2/kis_tool_transform.cc b/plugins/tools/tool_transform2/kis_tool_transform.cc --- a/plugins/tools/tool_transform2/kis_tool_transform.cc +++ b/plugins/tools/tool_transform2/kis_tool_transform.cc @@ -859,6 +859,18 @@ * stroke and pass it to the tool somehow. But currently, we will * just disable starting a new stroke asynchronously */ + + if(nodePaintAbility() == NodePaintAbility::UNPAINTABLE) { + KisCanvas2 *kisCanvas = dynamic_cast(canvas()); + kisCanvas->viewManager()-> + showFloatingMessage( + i18nc("floating message in transformation tool", + "Unable to transform the layer"), + QIcon(), 4000, KisFloatingMessage::High); + + return; + } + if (image()->tryBarrierLock()) { image()->unlock(); } else {