21#include <QApplication>
26#include <klocalizedstring.h>
88 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
89 dynamic_cast<
KisCanvas2*>(canvas)->snapGuide(),
90 m_currentArgs, m_transaction))
93 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
94 dynamic_cast<
KisCanvas2*>(canvas)->snapGuide(),
95 m_currentArgs, m_transaction))
98 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
99 m_currentArgs, m_transaction, canvas->resourceManager()))
102 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
103 dynamic_cast<
KisCanvas2*>(canvas)->snapGuide(),
104 m_currentArgs, m_transaction))
107 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
108 dynamic_cast<
KisCanvas2*>(canvas)->snapGuide(),
109 m_currentArgs, m_transaction))
110 , m_perspectiveStrategy(
112 dynamic_cast<
KisCanvas2*>(canvas)->coordinatesConverter(),
113 dynamic_cast<
KisCanvas2*>(canvas)->snapGuide(),
114 m_currentArgs, m_transaction))
115 , m_moveShortcutsHelper(this)
120 setObjectName(
"tool_transform");
207 KConfigGroup group = KSharedConfig::openConfig()->group(
toolId());
249 QPolygonF hullF = hull;
261 warnTools <<
"WARNING: KisToolTransform: calculated convex hull's bounds "
262 "differ from the bounding rect of the source clip. It shouldn't "
300 QPainterPath mappedOutline =
325 QRect canvasUpdateRect;
328 canvasUpdateRect =
m_canvas->coordinatesConverter()->
333 getCursorOutline().translated(imagePos);
341 if (!canvasUpdateRect.isEmpty()) {
343 canvasUpdateRect =
kisGrowRect(canvasUpdateRect, 2);
344 m_canvas->updateCanvas(canvasUpdateRect);
360 if (usePrimaryAction) {
383 if (usePrimaryAction) {
404 if (usePrimaryAction) {
523 QPointF mousePos =
m_canvas->coordinatesConverter()->documentToImage(event->
point);
765 QTransform thumbToImageTransform;
767 const int maxSize = 2000;
771 srcRect.getRect(&x, &y, &w, &h);
774 if (w > maxSize || h > maxSize) {
775 qreal scale = qreal(maxSize) / (w > h ? w : h);
776 QTransform scaleTransform = QTransform::fromScale(scale, scale);
781 createThumbnailUncached(thumbRect.width(),
786 thumbToImageTransform = scaleTransform.inverted();
792 thumbToImageTransform = QTransform();
798 m_freeStrategy->setThumbnailImage(origImg, thumbToImageTransform);
800 m_warpStrategy->setThumbnailImage(origImg, thumbToImageTransform);
801 m_cageStrategy->setThumbnailImage(origImg, thumbToImageTransform);
803 m_meshStrategy->setThumbnailImage(origImg, thumbToImageTransform);
810 QSet<KoShape*> dummy;
941 i18nc(
"floating message in transformation tool",
942 "Cannot transform locked layers"),
947 i18nc(
"floating message in transformation tool",
948 "Cannot transform hidden layers"),
953 i18nc(
"floating message in transformation tool",
954 "Cannot use transform tool on this set of layers"),
969 i18nc(
"floating message in transformation tool",
970 "Layer type cannot use the transform tool"),
976 i18nc(
"floating message in transformation tool",
977 "Layer type cannot use the transform tool. Use transform mask instead."),
989 return node->inherits(
"KisTransformMask") && node->
visible(
true);
992 if (impossibleMask) {
995 i18nc(
"floating message in transformation tool",
996 "Layer has children with transform masks. Please disable them before doing transformation."),
1007 showFloatingMessage(
1008 i18nc(
"floating message in transformation tool",
1009 "Selections are not used when editing transform masks "),
1024 connect(transformStrategy, SIGNAL(sigConvexHullCalculated(QPolygon,
void*)), SLOT(
slotConvexHullCalculated(QPolygon,
void*)));
1025 strategy = transformStrategy;
1036 connect(transformStrategy, SIGNAL(sigConvexHullCalculated(QPolygon,
void*)), SLOT(
slotConvexHullCalculated(QPolygon,
void*)));
1037 strategy = transformStrategy;
1094 showFloatingMessage(
1095 i18nc(
"floating message in transformation tool",
1096 "Cannot transform empty layer "),
1120 showFloatingMessage(
1121 i18nc(
"floating message in transformation tool",
1122 "Invisible sublayers will also be transformed. Lock layers if you do not want them to be transformed "),
1133 showFloatingMessage(
1134 i18nc(
"floating message in transformation tool",
1135 "Cannot transform empty layer "),
1190 specialSpacer->setObjectName(
"SpecialSpacer");
1191 specialSpacer->setFixedSize(0, 0);
1269 if (needsPreviewRecalculation) {
1313 if (transformDiffers &&
1506 auto makeSubtoolAction = [&actionRegistry, &actions,
this](QString actionName,
const char *slot) {
1507 QAction *action = actionRegistry->
makeQAction(actionName,
this);
1508 action->setProperty(
"always_enabled",
true);
1509 connect(action, SIGNAL(triggered()), slot);
1527 if (!canvasController)
return;
float value(const T *src, size_t ch)
QAction * makeQAction(const QString &name, QObject *parent=0)
static KisActionRegistry * instance()
void startUpdateStreamLowLevel()
void initUpdateStreamLowLevel(KisStrokesFacade *strokesFacade, KisStrokeId strokeId)
void cancelUpdateStream()
KisViewManager * viewManager() const
static KisConfigNotifier * instance()
static QCursor waitCursor()
static QCursor pointingHandCursor()
bool cancelStroke(KisStrokeId id) override
void addJob(KisStrokeId id, KisStrokeJobData *data) override
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
void endStroke(KisStrokeId id) override
QRect exactBounds() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
KisNodeList selectedNodes() const
KisSelectionSP activeSelection() const
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
virtual KoCanvasBase * canvas() const
bool isTouchEvent() const
QPointF point
The point in document coordinates.
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_NOOP(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
T kisGrowRect(const T &rect, U offset)
#define koIcon(name)
Use these macros for icons without any issues.
QSharedPointer< T > toQShared(T *ptr)
QList< KisNodeSP > KisNodeList
KisNodeSP recursiveFindNode(KisNodeSP node, std::function< bool(KisNodeSP)> func)
void filterMergeableNodes(KisNodeList &nodes, bool allowMasks)
bool isEditable(bool checkVisibility=true) const
virtual bool visible(bool recursive=false) const