static void move_or_copy_cels( DocApi& api, Op op, const LayerList& srcLayers, const LayerList& dstLayers, const SelectedFrames& srcFrames, const SelectedFrames& dstFrames) { ASSERT(srcLayers.size() == dstLayers.size()); for (layer_t i=0; i<srcLayers.size(); ++i) { auto srcFrame = srcFrames.begin(); auto dstFrame = dstFrames.begin(); auto srcFrameEnd = srcFrames.end(); auto dstFrameEnd = dstFrames.end(); for (; srcFrame != srcFrameEnd && dstFrame != dstFrameEnd; ++srcFrame, ++dstFrame) { if (i >= 0 && i < srcLayers.size() && srcLayers[i]->isImage()) { LayerImage* srcLayer = static_cast<LayerImage*>(srcLayers[i]); if (i < dstLayers.size() && dstLayers[i]->isImage()) { LayerImage* srcLayer = static_cast<LayerImage*>(srcLayers[i]); LayerImage* dstLayer = static_cast<LayerImage*>(dstLayers[i]); #ifdef TRACE_RANGE_OPS std::clog << (op == Move ? "Moving": "Copying") << " cel " << srcLayer->name() << "[" << *srcFrame << "]" << " into " << dstLayer->name() << "[" << *dstFrame << "]\n"; #endif switch (op) { case Move: api.moveCel(srcLayer, *srcFrame, dstLayer, *dstFrame); break; case Copy: api.copyCel(srcLayer, *srcFrame, dstLayer, *dstFrame); break; } } else if (op == Move) { api.clearCel(srcLayer, *srcFrame); } } } } }