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;
933 i18nc(
"floating message in transformation tool",
934 "Cannot transform locked layers"),
939 i18nc(
"floating message in transformation tool",
940 "Cannot transform hidden layers"),
945 i18nc(
"floating message in transformation tool",
946 "Cannot use transform tool on this set of layers"),
961 i18nc(
"floating message in transformation tool",
962 "Layer type cannot use the transform tool"),
968 i18nc(
"floating message in transformation tool",
969 "Layer type cannot use the transform tool. Use transform mask instead."),
981 return node->inherits(
"KisTransformMask") && node->
visible(
true);
984 if (impossibleMask) {
987 i18nc(
"floating message in transformation tool",
988 "Layer has children with transform masks. Please disable them before doing transformation."),
1000 i18nc(
"floating message in transformation tool",
1001 "Selections are not used when editing transform masks "),
1016 connect(transformStrategy, SIGNAL(sigConvexHullCalculated(QPolygon,
void*)), SLOT(
slotConvexHullCalculated(QPolygon,
void*)));
1017 strategy = transformStrategy;
1028 connect(transformStrategy, SIGNAL(sigConvexHullCalculated(QPolygon,
void*)), SLOT(
slotConvexHullCalculated(QPolygon,
void*)));
1029 strategy = transformStrategy;
1086 showFloatingMessage(
1087 i18nc(
"floating message in transformation tool",
1088 "Cannot transform empty layer "),
1112 showFloatingMessage(
1113 i18nc(
"floating message in transformation tool",
1114 "Invisible sublayers will also be transformed. Lock layers if you do not want them to be transformed "),
1125 showFloatingMessage(
1126 i18nc(
"floating message in transformation tool",
1127 "Cannot transform empty layer "),
1182 specialSpacer->setObjectName(
"SpecialSpacer");
1183 specialSpacer->setFixedSize(0, 0);
1261 if (needsPreviewRecalculation) {
1305 if (transformDiffers &&
1488 auto makeSubtoolAction = [&actionRegistry, &actions,
this](QString actionName,
const char *slot) {
1489 QAction *action = actionRegistry->
makeQAction(actionName,
this);
1490 action->setProperty(
"always_enabled",
true);
1491 connect(action, SIGNAL(triggered()), slot);
1509 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