43 int id()
const override {
67 KisProcessingApplicator::ProcessingFlags flags,
94 KisPaintLayer* paintLayer = qobject_cast<KisPaintLayer*>(node.data());
95 if (paintLayer && paintLayer->onionSkinEnabled()) {
96 paintLayer->flushOnionSkinCache();
128 if (qEnvironmentVariableIsSet(
"KRITA_ENABLE_CLONE_UPDATES_IN_APPLICATOR")) {
132 updateClones(prevNode);
142 QPoint offset(clone->x(), clone->y());
143 QRegion dirtyRegion(m_image->bounds());
144 dirtyRegion -= m_image->bounds().translated(offset);
153 int id()
const override {
158 return canMergeWith(command);
176 KisProcessingApplicator::ProcessingFlags
m_flags;
201 reverseSignals.append(i->inverted());
208 int id()
const override {
264 ProcessingFlags flags,
275 ProcessingFlags flags,
283 m_emitSignals(emitSignals),
284 m_finalSignalsEmitted(false),
285 m_sharedAllFramesToken(new bool(false))
347 sequentiality, exclusivity);
380 if (jobs.isEmpty()) {
385 KisLayerUtils::FrameJobs::const_iterator it = jobs.constBegin();
386 KisLayerUtils::FrameJobs::const_iterator end = jobs.constEnd();
391 for (; it !=
end; ++it) {
392 const int frame = it.key();
393 const QSet<KisNodeSP> &nodes = it.value();
399 sequentiality, exclusivity);
420 sequentiality, exclusivity);
482 applicator.
applyCommand(cmd, sequentiality, exclusivity);
QVector< KisImageSignalType > KisImageSignalVector
bool mergeWith(const KUndo2Command *command) override
bool canMergeWith(const KUndo2Command *command) const override
DisableUIUpdatesCommand(KisImageWSP image, bool finalUpdate)
KisImageSignalVector m_emitSignals
bool mergeWith(const KUndo2Command *command) override
void doUpdate(KisImageSignalVector emitSignals)
EmitImageSignalsCommand(KisImageWSP image, KisImageSignalVector emitSignals, bool finalUpdate)
bool canMergeWith(const KUndo2Command *command) const override
KUndo2MagicString text() const
void emitNotification(KisImageSignalType type)
void disableUIUpdates() override
void refreshGraphAsync(KisNodeSP root, const QVector< QRect > &rects, const QRect &cropRect, KisProjectionUpdateFlags flags=KisProjectionUpdateFlag::None) override
bool cancelStroke(KisStrokeId id) override
void disableDirtyRequests() override
void enableDirtyRequests() override
void addJob(KisStrokeId id, KisStrokeJobData *data) override
QVector< QRect > enableUIUpdates() override
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
KisImageSignalRouter * signalRouter()
QRect bounds() const override
void endStroke(KisStrokeId id) override
void applyVisitor(KisProcessingVisitorSP visitor, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
QSharedPointer< bool > m_sharedAllFramesToken
@ SUPPORTS_WRAPAROUND_MODE
void visitRecursively(KisNodeSP node, KisProcessingVisitorSP visitor, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
static void runSingleCommandStroke(KisImageSP image, KUndo2Command *cmd, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
runSingleCommandStroke creates a stroke and runs cmd in it. The text() field of cmd is used as a titl...
~KisProcessingApplicator()
const KisStrokeId getStroke() const
void explicitlyEmitFinalSignals()
KisImageSignalVector m_emitSignals
bool m_finalSignalsEmitted
void applyCommand(KUndo2Command *command, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void applyVisitorAllFrames(KisProcessingVisitorSP visitor, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
std::future< bool > && successfullyCompletedFuture()
std::future< bool > m_successfullyCompletedFuture
KisProcessingApplicator(KisImageWSP image, KisNodeSP node, ProcessingFlags flags=NONE, KisImageSignalVector emitSignals=KisImageSignalVector(), const KUndo2MagicString &name=KUndo2MagicString(), KUndo2CommandExtraData *extraData=0, int macroId=-1)
virtual KUndo2Command * createInitCommand()
static KisRegion fromQRegion(const QRegion ®ion)
void setMacroId(int value)
void setCommandExtraData(KUndo2CommandExtraData *data)
void setSupportsWrapAroundMode(bool value)
void finishStrokeCallback() override
void cancelStrokeCallbackImpl(QVector< KisStrokeJobData * > &mutatedJobs)
void addMutatedJobs(const QVector< KisStrokeJobData * > list)
KUndo2MagicString name() const
static KisTimeSpan infinite(int start)
void updateClones(KisNodeSP node)
QSharedPointer< bool > m_sharedAllFramesToken
bool canMergeWith(const KUndo2Command *command) const override
UpdateCommand(KisImageWSP image, KisNodeList nodes, KisProcessingApplicator::ProcessingFlags flags, State initialState, QSharedPointer< bool > sharedAllFramesToken)
bool mergeWith(const KUndo2Command *command) override
KisProcessingApplicator::ProcessingFlags m_flags
#define KIS_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
QSharedPointer< KUndo2Command > KUndo2CommandSP
@ EmitImageSignalsCommandId
@ DisableUIUpdatesCommandId
void updateFrameJobsRecursive(FrameJobs *jobs, KisNodeSP rootNode)
QMap< int, QSet< KisNodeSP > > FrameJobs
void recursiveApplyNodes(NodePointer node, Functor func)
void addJobBarrier(QVector< Job * > &jobs, Func func)
virtual QRect exactBounds() const
FlipFlopCommand(State initialState, KUndo2Command *parent=0)
The SwitchFrameCommand struct Switches to frame with undo/redo support.
const QList< KisCloneLayerWSP > registeredClones() const
virtual void invalidateFrames(const KisTimeSpan &range, const QRect &rect)
KisNodeSP prevSibling() const
KisNodeSP lastChild() const
KisNodeGraphListener * graphListener
std::promise< bool > m_successfullyCompleted
StrategyWithStatusPromise(const KUndo2MagicString &name, KisStrokeUndoFacade *facade)
void finishStrokeCallback() override
void cancelStrokeCallback() override