Krita Source Code Documentation
Loading...
Searching...
No Matches
KisQmicSynchronizeLayersCommand Class Reference

#include <kis_qmic_synchronize_layers_command.h>

+ Inheritance diagram for KisQmicSynchronizeLayersCommand:

Public Member Functions

 KisQmicSynchronizeLayersCommand (KisNodeListSP nodes, QVector< KisQMicImageSP > images, KisImageWSP image, const QRect &dstRect=QRect(), KisSelectionSP selection=nullptr)
 
 Private (KisNodeListSP nodes, QVector< KisQMicImageSP > images, KisImageWSP image, const QRect &dstRect, KisSelectionSP selection)
 
void redo () override
 
void undo () override
 
 ~KisQmicSynchronizeLayersCommand () override
 
 ~Private ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisCommandUtils::CompositeCommand
void addCommand (KUndo2Command *cmd)
 
 CompositeCommand (KUndo2Command *parent=0)
 
 ~CompositeCommand () override
 
- Public Member Functions inherited from KUndo2Command
QString actionText () const
 
virtual bool canAnnihilateWith (const KUndo2Command *other) const
 
const KUndo2Commandchild (int index) const
 
int childCount () const
 
virtual QTime endTime () const
 
KUndo2CommandExtraDataextraData () const
 
bool hasParent () const
 
virtual int id () const
 
virtual bool isMerged () const
 
 KUndo2Command (const KUndo2MagicString &text, KUndo2Command *parent=0)
 
 KUndo2Command (KUndo2Command *parent=0)
 
virtual QVector< KUndo2Command * > mergeCommandsVector () const
 
virtual bool mergeWith (const KUndo2Command *other)
 
virtual void redoMergedCommands ()
 
void setEndTime ()
 
virtual void setEndTime (const QTime &time)
 
void setExtraData (KUndo2CommandExtraData *data)
 
void setText (const KUndo2MagicString &text)
 
void setTime ()
 
virtual void setTime (const QTime &time)
 
virtual void setTimedID (int timedID)
 
KUndo2MagicString text () const
 
virtual QTime time () const
 
virtual int timedId () const
 
virtual bool timedMergeWith (KUndo2Command *other)
 
virtual void undoMergedCommands ()
 
virtual ~KUndo2Command ()
 

Public Attributes

QRect m_dstRect
 
bool m_firstRedo
 
KisImageWSP m_image
 
QVector< KisImageCommand * > m_imageCommands
 
QVector< KisQMicImageSPm_images
 
KisNodeListSP m_newNodes
 
KisNodeListSP m_nodes
 
KisSelectionSP m_selection
 
KisSurrogateUndoAdapter m_undoAdapter
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Member Functions

 Q_DISABLE_COPY (KisQmicSynchronizeLayersCommand)
 

Private Attributes

Private *const d
 

Detailed Description

Definition at line 33 of file kis_qmic_synchronize_layers_command.cpp.

Constructor & Destructor Documentation

◆ ~Private()

KisQmicSynchronizeLayersCommand::~Private ( )
inline

Definition at line 48 of file kis_qmic_synchronize_layers_command.cpp.

49 {
50 qDeleteAll(m_imageCommands);
51 m_imageCommands.clear();
52 }

◆ KisQmicSynchronizeLayersCommand()

KisQmicSynchronizeLayersCommand::KisQmicSynchronizeLayersCommand ( KisNodeListSP nodes,
QVector< KisQMicImageSP > images,
KisImageWSP image,
const QRect & dstRect = QRect(),
KisSelectionSP selection = nullptr )

Definition at line 65 of file kis_qmic_synchronize_layers_command.cpp.

72 , d(new Private{std::move(nodes),
73 std::move(images),
74 image,
75 dstRect,
76 selection})
77{
78 dbgPlugins << "KisQmicSynchronizeLayersCommand";
79}
#define dbgPlugins
Definition kis_debug.h:51

References dbgPlugins.

◆ ~KisQmicSynchronizeLayersCommand()

KisQmicSynchronizeLayersCommand::~KisQmicSynchronizeLayersCommand ( )
override

Definition at line 81 of file kis_qmic_synchronize_layers_command.cpp.

82{
83 delete d;
84}

References d.

Member Function Documentation

◆ Private()

KisQmicSynchronizeLayersCommand::Private ( KisNodeListSP nodes,
QVector< KisQMicImageSP > images,
KisImageWSP image,
const QRect & dstRect,
KisSelectionSP selection )
inline

◆ Q_DISABLE_COPY()

KisQmicSynchronizeLayersCommand::Q_DISABLE_COPY ( KisQmicSynchronizeLayersCommand )
private

◆ redo()

void KisQmicSynchronizeLayersCommand::redo ( )
overridevirtual

Applies a change to the document. This function must be implemented in the derived class. Calling KUndo2QStack::push(), KUndo2QStack::undo() or KUndo2QStack::redo() from this function leads to undefined behavior.

The default implementation calls redo() on all child commands.

See also
undo()

Reimplemented from KisCommandUtils::CompositeCommand.

Definition at line 86 of file kis_qmic_synchronize_layers_command.cpp.

87{
88 dbgPlugins << "KisQmicSynchronizeLayersCommand::Redo";
89
90 const auto pickAboveThis = [&]() {
91 if (!d->m_newNodes->isEmpty()) {
92 return d->m_newNodes->last()->prevSibling();
93 } else {
94 return d->m_nodes->last()->prevSibling();
95 }
96 };
97
98 const auto getNode = [&](int i) {
99 if (i >= d->m_nodes->size()) {
100 return d->m_newNodes->at(i - d->m_nodes->size());
101 } else {
102 return d->m_nodes->at(i);
103 }
104 };
105
106 KisNodeManager *nodeManager = [&]() -> KisNodeManager * {
108 if (!mainWin)
109 return nullptr;
110 KisViewManager *viewManager = mainWin->viewManager();
111 if (!viewManager)
112 return nullptr;
113 if (viewManager->document()->image() != d->m_image)
114 return nullptr;
115 return viewManager->nodeManager();
116 }();
117
118 if (!nodeManager)
119 return;
120
121 auto *selectOldLayer = new KisLayerUtils::KeepNodesSelectedCommand(
122 nodeManager->selectedNodes(),
123 nodeManager->selectedNodes(),
124 nodeManager->activeNode(),
125 nodeManager->activeNode(),
126 d->m_image,
127 false);
128
129 selectOldLayer->redo();
130
132
133 // if gmic produces more layers
134 if (d->m_nodes->size() < d->m_images.size()) {
135 if (d->m_image) {
136 const QPoint origin = [&]() -> QPoint {
137 if (d->m_selection) {
138 return d->m_selection->selectedExactRect().topLeft();
139 } else if (!d->m_nodes->isEmpty()) {
140 const auto root = d->m_nodes->at(0);
141 return {root->x(), root->y()};
142 } else {
143 return {};
144 }
145 }();
146 const int nodesCount = d->m_nodes->size();
147 for (int i = nodesCount; i < d->m_images.size(); i++) {
148 KisPaintDeviceSP device = new KisPaintDevice(d->m_image->colorSpace());
149 KisLayerSP paintLayer = new KisPaintLayer(d->m_image, QString("New layer %1 from gmic filter").arg(i), OPACITY_OPAQUE_U8, device);
150 paintLayer->setX(origin.x());
151 paintLayer->setY(origin.y());
152
154 *d->m_images[i].data(),
155 device,
156 d->m_selection,
157 d->m_dstRect);
158
159 KisNodeSP aboveThis(nullptr);
160 KisNodeSP parent(nullptr);
161
162 if (nodesCount > 0) {
163 // This node is a copy made by GMic of an existing node;
164 // give it its name back (the existing node will be reused
165 // by KisImportQmicProcessingVisitor)
166 paintLayer->setName(getNode(i - nodesCount)->name());
167 aboveThis = pickAboveThis();
168 parent = d->m_nodes->at(0)->parent();
169
170 dbgPlugins << "Adding paint layer" << (i - nodesCount + 1) << paintLayer << "to parent" << parent->name() << "above" << aboveThis;
171 }
172
173 auto *layerNameCmd =
175 paintLayer.data(),
176 d->m_selection);
177 layerNameCmd->redo();
178
180
181 auto *addLayerCmd = new KisImageLayerAddCommand(d->m_image, paintLayer, parent, aboveThis, true, true);
182
183 addLayerCmd->redo();
185 d->m_newNodes->append(paintLayer);
186 }
187 } else // small preview
188 {
189 Q_ASSERT(!d->m_nodes->empty());
190 for (int i = d->m_nodes->size(); i < d->m_images.size(); i++) {
191 KisPaintDeviceSP device = new KisPaintDevice(d->m_nodes->at(0)->colorSpace());
192 KisLayerSP paintLayer = new KisPaintLayer(nullptr, "New layer from gmic filter", OPACITY_OPAQUE_U8, device);
193 d->m_newNodes->append(paintLayer);
194 }
195 }
196 } else if (d->m_nodes->size() > d->m_images.size()) {
197 // if gmic produces less layers, we are going to drop some
198
199 const KisNodeList extraNodes = [&]() {
200 KisNodeList result;
201 const auto minIndex = d->m_images.size();
202 for (auto i = minIndex; i < d->m_nodes->size(); i++) {
203 result.append(d->m_nodes->at(i));
204 }
205 return result;
206 }();
207
208 auto *removeLayerCmd = new KisLayerUtils::SimpleRemoveLayers(extraNodes, d->m_image);
209 removeLayerCmd->redo();
211 }
212
213 const int boundary = std::min(d->m_nodes->size(), d->m_images.size());
214
215 for (int index = 0; index < boundary; index++) {
216 KisNodeSP node = d->m_nodes->at(index);
217
218 const KisQMicImageSP &gimg = d->m_images.at(index);
219 dbgPlugins << "Importing layer index" << index
220 << "Size: " << gimg->m_width << "x" << gimg->m_height
221 << "colorchannels: " << gimg->m_spectrum;
222
223 KisPaintDeviceSP dst = node->paintDevice();
224
225 const auto *layer = dynamic_cast<const KisLayer *>(node.data());
226 const KisSelectionSP selection =
227 layer ? layer->selection() : d->m_selection;
228
229 KisTransaction transaction(dst);
231 dst,
232 selection,
233 d->m_dstRect);
234 auto *layerNameCmd =
236 node.data(),
237 selection);
238 layerNameCmd->redo();
239
241
242 transaction.commit(&d->m_undoAdapter);
243 node->setDirty(d->m_dstRect);
244 }
245
246 KisNodeSP currentNode = [&]() -> KisNodeSP {
247 if (!d->m_nodes->empty()) {
248 return d->m_nodes->first();
249 } else if (!d->m_newNodes->empty()) {
250 return d->m_newNodes->first();
251 }
252 return {};
253 }();
254
255 if (!currentNode)
256 return;
257
258 auto *selectNewLayer = new KisLayerUtils::KeepNodesSelectedCommand(
259 nodeManager->selectedNodes(),
260 {currentNode},
261 nodeManager->activeNode(),
262 currentNode,
263 d->m_image,
264 true);
265
266 selectNewLayer->redo();
267
269
270 dbgPlugins << "Set selected node to" << currentNode->name();
271}
const quint8 OPACITY_OPAQUE_U8
KisImageSP image
The command for adding a layer.
Main window for Krita.
KisViewManager * viewManager
KisNodeSP activeNode()
Convenience function to get the active layer or mask.
KisNodeList selectedNodes()
static KisPart * instance()
Definition KisPart.cpp:131
KisMainWindow * currentMainwindow() const
Definition KisPart.cpp:483
KisDocument * document() const
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
const char * name(StandardAction id)
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
KUndo2Command * applyLayerNameChanges(const KisQMicImage &srcGmicImage, KisNode *node, KisSelectionSP selection)
void gmicImageToPaintDevice(const KisQMicImage &srcGmicImage, KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &dstRect)
void setName(const QString &name)
virtual KisPaintDeviceSP paintDevice() const =0
QString name() const
void setX(qint32 x) override
Definition kis_layer.cc:983
void setY(qint32 y) override
Definition kis_layer.cc:989
virtual void setDirty()
Definition kis_node.cpp:577

References KisNodeManager::activeNode(), KisCommandUtils::CompositeCommand::addCommand(), KisQmicImportTools::applyLayerNameChanges(), KisTransaction::commit(), KisPart::currentMainwindow(), d, KisSharedPtr< T >::data(), dbgPlugins, KisViewManager::document(), KisQmicImportTools::gmicImageToPaintDevice(), KisDocument::image, KisPart::instance(), KisBaseNode::name(), KisViewManager::nodeManager(), OPACITY_OPAQUE_U8, KisBaseNode::paintDevice(), KisNodeManager::selectedNodes(), KisNode::setDirty(), KisBaseNode::setName(), KisLayer::setX(), KisLayer::setY(), and KisMainWindow::viewManager.

◆ undo()

void KisQmicSynchronizeLayersCommand::undo ( )
overridevirtual

Reverts a change to the document. After undo() is called, the state of the document should be the same as before redo() was called. This function must be implemented in the derived class. Calling KUndo2QStack::push(), KUndo2QStack::undo() or KUndo2QStack::redo() from this function leads to undefined behavior.

The default implementation calls undo() on all child commands in reverse order.

See also
redo()

Reimplemented from KisCommandUtils::CompositeCommand.

Definition at line 273 of file kis_qmic_synchronize_layers_command.cpp.

274{
276 d->m_undoAdapter.undoAll();
277 d->m_newNodes->clear();
278}

References d, and KisCommandUtils::CompositeCommand::undo().

Member Data Documentation

◆ d

Private* const KisQmicSynchronizeLayersCommand::d
private

Definition at line 37 of file kis_qmic_synchronize_layers_command.h.

◆ m_dstRect

QRect KisQmicSynchronizeLayersCommand::m_dstRect

Definition at line 58 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_firstRedo

bool KisQmicSynchronizeLayersCommand::m_firstRedo

Definition at line 62 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_image

KisImageWSP KisQmicSynchronizeLayersCommand::m_image

Definition at line 57 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_imageCommands

QVector<KisImageCommand *> KisQmicSynchronizeLayersCommand::m_imageCommands

Definition at line 60 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_images

QVector<KisQMicImageSP> KisQmicSynchronizeLayersCommand::m_images

Definition at line 56 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_newNodes

KisNodeListSP KisQmicSynchronizeLayersCommand::m_newNodes

Definition at line 55 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_nodes

KisNodeListSP KisQmicSynchronizeLayersCommand::m_nodes

Definition at line 54 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_selection

KisSelectionSP KisQmicSynchronizeLayersCommand::m_selection

Definition at line 59 of file kis_qmic_synchronize_layers_command.cpp.

◆ m_undoAdapter

KisSurrogateUndoAdapter KisQmicSynchronizeLayersCommand::m_undoAdapter

Definition at line 61 of file kis_qmic_synchronize_layers_command.cpp.


The documentation for this class was generated from the following files: