9#include <klocalizedstring.h>
52 virtual QRect
moveNode(
const QPoint &offset) = 0;
67 dirtyRect |= dirtyRect.translated(newOffset - currentOffset);
88 QRect
moveNode(
const QPoint &offset)
override {
111 QScopedPointer<KUndo2Command> cmd;
125 const bool mergeResult =
m_undoCommand->mergeWith(cmd.get());
170 transactionCommand->
redo();
193 std::unordered_map<KisNodeSP, std::unique_ptr<MoveNodeStrategyBase>>
strategy;
196template <
typename Functor>
217 m_requestedNodeSelection(nodeSelection),
218 m_updatesFacade(updatesFacade),
219 m_updatesEnabled(true)
239 m_requestedNodeSelection(rhs.m_requestedNodeSelection, lod),
240 m_nodes(rhs.m_nodes),
241 m_blacklistedNodes(rhs.m_blacklistedNodes),
242 m_updatesFacade(rhs.m_updatesFacade),
243 m_finalOffset(rhs.m_finalOffset),
244 m_dirtyRects(rhs.m_dirtyRects),
245 m_updatesEnabled(rhs.m_updatesEnabled)
269 const bool isEmptyFilterMask = node->inherits(
"KisFilterMask") && node->
paintDevice()
273 return !isEmptyFilterMask &&
286 m_blacklistedNodes.insert(node);
326 if (node->inherits(
"KisFilterMask") &&
m_nodes.contains(node)) {
333 if (node->paintDevice()) {
334 handlesRect |= node->paintDevice()->nonDefaultPixelArea();
348 if (autoKeyframeCommand) {
366 m_d->strategy.emplace(node, new MoveTransformMaskStrategy(node));
368 m_d->strategy.emplace(node, new MovePaintableNodeStrategy(node));
370 m_d->strategy.emplace(node, new MoveNormalNodeStrategy(node));
384 runnableJobsInterface()->addRunnableJobs(jobs);
430 m_d->strategy[node].get();
472 Data *d =
dynamic_cast<Data*
>(data);
515 m_d->strategy[node].get();
563 Q_FOREACH (
KisNodeSP node, nodesToCheck) {
585 return new Data(*
this, levelOfDetail);
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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 recursiveApplyNodes(KisNodeList nodes, Functor &&func)
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)
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