39 : m_nodes(
std::move(nodes))
41 , m_images(
std::move(images))
44 , m_selection(selection)
50 qDeleteAll(m_imageCommands);
51 m_imageCommands.clear();
78 dbgPlugins <<
"KisQmicSynchronizeLayersCommand";
88 dbgPlugins <<
"KisQmicSynchronizeLayersCommand::Redo";
90 const auto pickAboveThis = [&]() {
91 if (!
d->m_newNodes->isEmpty()) {
92 return d->m_newNodes->last()->prevSibling();
94 return d->m_nodes->last()->prevSibling();
98 const auto getNode = [&](
int i) {
99 if (i >=
d->m_nodes->size()) {
100 return d->m_newNodes->at(i -
d->m_nodes->size());
102 return d->m_nodes->at(i);
129 selectOldLayer->redo();
134 if (
d->m_nodes->size() <
d->m_images.size()) {
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()};
146 const int nodesCount =
d->m_nodes->size();
147 for (
int i = nodesCount; i <
d->m_images.size(); i++) {
150 paintLayer->
setX(origin.x());
151 paintLayer->
setY(origin.y());
154 *
d->m_images[i].data(),
162 if (nodesCount > 0) {
166 paintLayer->
setName(getNode(i - nodesCount)->name());
167 aboveThis = pickAboveThis();
168 parent =
d->m_nodes->at(0)->parent();
170 dbgPlugins <<
"Adding paint layer" << (i - nodesCount + 1) << paintLayer <<
"to parent" << parent->name() <<
"above" << aboveThis;
177 layerNameCmd->redo();
185 d->m_newNodes->append(paintLayer);
189 Q_ASSERT(!
d->m_nodes->empty());
190 for (
int i =
d->m_nodes->size(); i <
d->m_images.size(); i++) {
193 d->m_newNodes->append(paintLayer);
196 }
else if (
d->m_nodes->size() >
d->m_images.size()) {
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));
209 removeLayerCmd->redo();
213 const int boundary = std::min(
d->m_nodes->size(),
d->m_images.size());
215 for (
int index = 0; index < boundary; index++) {
219 dbgPlugins <<
"Importing layer index" << index
220 <<
"Size: " << gimg->m_width <<
"x" << gimg->m_height
221 <<
"colorchannels: " << gimg->m_spectrum;
225 const auto *layer =
dynamic_cast<const KisLayer *
>(node.
data());
227 layer ? layer->selection() :
d->m_selection;
238 layerNameCmd->redo();
242 transaction.
commit(&
d->m_undoAdapter);
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();
266 selectNewLayer->redo();
276 d->m_undoAdapter.undoAll();
277 d->m_newNodes->clear();
const quint8 OPACITY_OPAQUE_U8
The command for adding a layer.
KisViewManager * viewManager
KisNodeSP activeNode()
Convenience function to get the active layer or mask.
KisNodeList selectedNodes()
static KisPart * instance()
KisMainWindow * currentMainwindow() const
void commit(KisUndoAdapter *undoAdapter)
KisDocument * document() const
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
void setName(const QString &name)
virtual KisPaintDeviceSP paintDevice() const =0
void addCommand(KUndo2Command *cmd)
void setX(qint32 x) override
void setY(qint32 y) override
QVector< KisImageCommand * > m_imageCommands
KisSurrogateUndoAdapter m_undoAdapter
KisSelectionSP m_selection
Private(KisNodeListSP nodes, QVector< KisQMicImageSP > images, KisImageWSP image, const QRect &dstRect, KisSelectionSP selection)
QVector< KisQMicImageSP > m_images
~KisQmicSynchronizeLayersCommand() override
KisQmicSynchronizeLayersCommand(KisNodeListSP nodes, QVector< KisQMicImageSP > images, KisImageWSP image, const QRect &dstRect=QRect(), KisSelectionSP selection=nullptr)