9#include <klocalizedstring.h>
51 virtual QRect
moveNode(
const QPoint &offset) = 0;
66 dirtyRect |= dirtyRect.translated(newOffset - currentOffset);
87 QRect
moveNode(
const QPoint &offset)
override {
110 QScopedPointer<KUndo2Command> cmd;
124 const bool mergeResult =
m_undoCommand->mergeWith(cmd.get());
169 transactionCommand->
redo();
192 std::unordered_map<KisNodeSP, std::unique_ptr<MoveNodeStrategyBase>>
strategy;
195template <
typename Functor>
216 m_requestedNodeSelection(nodeSelection),
217 m_updatesFacade(updatesFacade),
218 m_updatesEnabled(true)
238 m_requestedNodeSelection(rhs.m_requestedNodeSelection, lod),
239 m_nodes(rhs.m_nodes),
240 m_blacklistedNodes(rhs.m_blacklistedNodes),
241 m_updatesFacade(rhs.m_updatesFacade),
242 m_finalOffset(rhs.m_finalOffset),
243 m_dirtyRects(rhs.m_dirtyRects),
244 m_updatesEnabled(rhs.m_updatesEnabled)
268 const bool isEmptyFilterMask = node->inherits(
"KisFilterMask") && node->
paintDevice()
271 return !isEmptyFilterMask &&
284 m_blacklistedNodes.insert(node);
324 if (node->inherits(
"KisFilterMask") &&
m_nodes.contains(node)) {
331 if (node->paintDevice()) {
332 handlesRect |= node->paintDevice()->nonDefaultPixelArea();
346 if (autoKeyframeCommand) {
364 m_d->strategy.emplace(node, new MoveTransformMaskStrategy(node));
366 m_d->strategy.emplace(node, new MovePaintableNodeStrategy(node));
368 m_d->strategy.emplace(node, new MoveNormalNodeStrategy(node));
382 runnableJobsInterface()->addRunnableJobs(jobs);
428 m_d->strategy[node].get();
470 Data *d =
dynamic_cast<Data*
>(data);
513 m_d->strategy[node].get();
561 Q_FOREACH (
KisNodeSP node, nodesToCheck) {
583 return new Data(*
this, levelOfDetail);
float value(const T *src, size_t ch)
static void tryNotifySelection(KisNodeSP node)
KisNodeList selectedNodes
KisNodeList selectNodesToProcess() const
QRect nonDefaultPixelArea() const
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void cancelStrokeCallback() override
void initStrokeCallback() override
void notifyCommandDone(KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
void runAndSaveCommand(KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
void setSupportsWrapAroundMode(bool value)
void finishStrokeCallback() override
void doStrokeCallback(KisStrokeJobData *data) override
void addMutatedJob(KisStrokeJobData *data)
KUndo2Command * endAndTake()
virtual bool hasUpdatesRunning() const =0
void refreshGraphAsync(KisNodeSP root=nullptr, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None)
KisStrokeJobData * createLodClone(int levelOfDetail) override
PickLayerData(QPoint _pos)
KisStrokeJobData * createLodClone(int levelOfDetail) override
void doStrokeCallback(KisStrokeJobData *data) override
KisNodeSelectionRecipe m_requestedNodeSelection
MoveStrokeStrategy(KisNodeSelectionRecipe nodeSelection, KisUpdatesFacade *updatesFacade, KisStrokeUndoFacade *undoFacade)
void sigStrokeStartedEmpty()
KisUpdatesFacade * m_updatesFacade
void initStrokeCallback() override
void cancelStrokeCallback() override
QHash< KisNodeSP, QRect > m_dirtyRects
void sigLayersPicked(const KisNodeList &nodes)
QElapsedTimer m_updateTimer
void setUpdatesEnabled(bool value)
QScopedPointer< Private > m_d
void doCanvasUpdate(bool forceUpdate=false)
void finishStrokeCallback() override
void sigHandlesRectCalculated(const QRect &handlesRect)
~MoveStrokeStrategy() override
QSet< KisNodeSP > m_blacklistedNodes
const int m_updateInterval
QSharedPointer< std::pair< KisNodeList, QSet< KisNodeSP > > > m_sharedNodes
void tryPostUpdateJob(bool forceUpdate)
void recursiveApplyNodes(const KisNodeList &nodes, Functor &&func)
KisStrokeStrategy * createLodClone(int levelOfDetail) override
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
QSharedPointer< T > toQShared(T *ptr)
QSharedPointer< KUndo2Command > KUndo2CommandSP
KUndo2MagicString kundo2_i18n(const char *text)
bool checkSupportsLodMoves(KisNodeSP subtree)
KUndo2Command * tryAutoCreateDuplicatedFrame(KisPaintDeviceSP device, AutoCreateKeyframeFlags flags)
create a new duplicated keyframe if auto-keyframe mode is on
bool checkIsCloneOf(KisNodeSP node, const KisNodeList &nodes)
KisNodeSP recursiveFindNode(KisNodeSP node, std::function< bool(KisNodeSP)> func)
KisNodeList sortAndFilterMergeableInternalNodes(KisNodeList nodes, bool allowMasks)
KisNodeSP findRoot(KisNodeSP node)
void recursiveApplyNodes(NodePointer node, Functor func)
void forceAllHiddenOriginalsUpdate(KisNodeSP root)
bool checkIsChildOf(KisNodeSP node, const KisNodeList &parents)
void forceAllDelayedNodesUpdate(KisNodeSP root)
void addJobBarrier(QVector< Job * > &jobs, Func func)
void addJobBarrierExclusive(QVector< Job * > &jobs, Func func)
bool isEditable(bool checkVisibility=true) const
virtual void setX(qint32)
virtual void setY(qint32)
virtual KisPaintDeviceSP paintDevice() const =0
bool hasEditablePaintDevice() const
void addCommand(KUndo2Command *cmd)
virtual KisAbstractProjectionPlaneSP projectionPlane() const
virtual void finishMove(KUndo2Command *parentCommand)=0
virtual ~MoveNodeStrategyBase()
virtual QRect moveNode(const QPoint &offset)=0
QRect moveNodeCommon(const QPoint &offset)
virtual QRect cancelMove()=0
MoveNodeStrategyBase(KisNodeSP node)
void finishMove(KUndo2Command *parentCommand) override
QRect cancelMove() override
MoveNormalNodeStrategy(KisNodeSP node)
QRect moveNode(const QPoint &offset) override
MovePaintableNodeStrategy(KisNodeSP node)
QRect cancelMove() override
KisTransaction m_transaction
void finishMove(KUndo2Command *parentCommand) override
QRect moveNode(const QPoint &offset) override
KisStrokeJobData * createLodClone(int levelOfDetail) override
BarrierUpdateData(bool forceUpdate)
std::unordered_map< KisNodeSP, std::unique_ptr< MoveNodeStrategyBase > > strategy