Changeset View
Changeset View
Standalone View
Standalone View
libs/image/kis_layer_utils.cpp
Show First 20 Lines • Show All 246 Lines • ▼ Show 20 Line(s) | 241 | void populateChildCommands() { | |||
---|---|---|---|---|---|
247 | } | 247 | } | ||
248 | } | 248 | } | ||
249 | 249 | | |||
250 | private: | 250 | private: | ||
251 | MergeDownInfoSP m_info; | 251 | MergeDownInfoSP m_info; | ||
252 | }; | 252 | }; | ||
253 | 253 | | |||
254 | struct CreateMergedLayerMultiple : public KisCommandUtils::AggregateCommand { | 254 | struct CreateMergedLayerMultiple : public KisCommandUtils::AggregateCommand { | ||
255 | CreateMergedLayerMultiple(MergeMultipleInfoSP info) : m_info(info) {} | 255 | CreateMergedLayerMultiple(MergeMultipleInfoSP info, const QString name = QString() ) | ||
256 | : m_info(info), | ||||
257 | m_name(name) {} | ||||
256 | 258 | | |||
257 | void populateChildCommands() { | 259 | void populateChildCommands() { | ||
260 | QString mergedLayerName; | ||||
261 | | ||||
262 | if (m_name.isEmpty()){ | ||||
258 | const QString mergedLayerSuffix = i18n("Merged"); | 263 | const QString mergedLayerSuffix = i18n("Merged"); | ||
259 | QString mergedLayerName = m_info->mergedNodes.first()->name(); | 264 | mergedLayerName = m_info->mergedNodes.first()->name(); | ||
260 | 265 | | |||
261 | if (!mergedLayerName.endsWith(mergedLayerSuffix)) { | 266 | if (!mergedLayerName.endsWith(mergedLayerSuffix)) { | ||
262 | mergedLayerName = QString("%1 %2") | 267 | mergedLayerName = QString("%1 %2") | ||
263 | .arg(mergedLayerName).arg(mergedLayerSuffix); | 268 | .arg(mergedLayerName).arg(mergedLayerSuffix); | ||
264 | } | 269 | } | ||
270 | } else { | ||||
271 | mergedLayerName = m_name; | ||||
272 | } | ||||
265 | 273 | | |||
266 | m_info->dstNode = new KisPaintLayer(m_info->image, mergedLayerName, OPACITY_OPAQUE_U8); | 274 | m_info->dstNode = new KisPaintLayer(m_info->image, mergedLayerName, OPACITY_OPAQUE_U8); | ||
267 | 275 | | |||
268 | if (m_info->frames.size() > 0) { | 276 | if (m_info->frames.size() > 0) { | ||
269 | m_info->dstNode->enableAnimation(); | 277 | m_info->dstNode->enableAnimation(); | ||
270 | } | 278 | } | ||
271 | 279 | | |||
272 | QString compositeOpId; | 280 | QString compositeOpId; | ||
Show All 22 Lines | 299 | if (!compositionVaries) { | |||
295 | if (m_info->dstLayer() && !channelFlags.isEmpty()) { | 303 | if (m_info->dstLayer() && !channelFlags.isEmpty()) { | ||
296 | m_info->dstLayer()->setChannelFlags(channelFlags); | 304 | m_info->dstLayer()->setChannelFlags(channelFlags); | ||
297 | } | 305 | } | ||
298 | } | 306 | } | ||
299 | } | 307 | } | ||
300 | 308 | | |||
301 | private: | 309 | private: | ||
302 | MergeMultipleInfoSP m_info; | 310 | MergeMultipleInfoSP m_info; | ||
311 | QString m_name; | ||||
303 | }; | 312 | }; | ||
304 | 313 | | |||
305 | struct MergeLayers : public KisCommandUtils::AggregateCommand { | 314 | struct MergeLayers : public KisCommandUtils::AggregateCommand { | ||
306 | MergeLayers(MergeDownInfoSP info) : m_info(info) {} | 315 | MergeLayers(MergeDownInfoSP info) : m_info(info) {} | ||
307 | 316 | | |||
308 | void populateChildCommands() { | 317 | void populateChildCommands() { | ||
309 | // actual merging done by KisLayer::createMergedLayer (or specialized decendant) | 318 | // actual merging done by KisLayer::createMergedLayer (or specialized decendant) | ||
310 | m_info->currLayer->fillMergedLayerTemplate(m_info->dstLayer(), m_info->prevLayer); | 319 | m_info->currLayer->fillMergedLayerTemplate(m_info->dstLayer(), m_info->prevLayer); | ||
▲ Show 20 Lines • Show All 164 Lines • ▼ Show 20 Line(s) | 483 | void SimpleRemoveLayers::populateChildCommands() { | |||
475 | if (m_nodes.isEmpty()) return; | 484 | if (m_nodes.isEmpty()) return; | ||
476 | safeRemoveMultipleNodes(m_nodes, m_image); | 485 | safeRemoveMultipleNodes(m_nodes, m_image); | ||
477 | } | 486 | } | ||
478 | 487 | | |||
479 | void SimpleRemoveLayers::addCommandImpl(KUndo2Command *cmd) { | 488 | void SimpleRemoveLayers::addCommandImpl(KUndo2Command *cmd) { | ||
480 | addCommand(cmd); | 489 | addCommand(cmd); | ||
481 | } | 490 | } | ||
482 | 491 | | |||
492 | struct InsertNode : public KisCommandUtils::AggregateCommand { | ||||
493 | InsertNode(MergeDownInfoBaseSP info, KisNodeSP putAfter) | ||||
494 | : m_info(info), m_putAfter(putAfter) {} | ||||
495 | | ||||
496 | void populateChildCommands() { | ||||
497 | addCommand(new KisImageLayerAddCommand(m_info->image, | ||||
498 | m_info->dstNode, | ||||
499 | m_putAfter->parent(), | ||||
500 | m_putAfter, | ||||
501 | true, false)); | ||||
502 | | ||||
503 | } | ||||
504 | | ||||
505 | private: | ||||
506 | virtual void addCommandImpl(KUndo2Command *cmd) { | ||||
507 | addCommand(cmd); | ||||
508 | } | ||||
509 | | ||||
510 | private: | ||||
511 | MergeDownInfoBaseSP m_info; | ||||
512 | KisNodeSP m_putAfter; | ||||
513 | }; | ||||
514 | | ||||
515 | | ||||
483 | struct CleanUpNodes : private RemoveNodeHelper, public KisCommandUtils::AggregateCommand { | 516 | struct CleanUpNodes : private RemoveNodeHelper, public KisCommandUtils::AggregateCommand { | ||
484 | CleanUpNodes(MergeDownInfoBaseSP info, KisNodeSP putAfter) | 517 | CleanUpNodes(MergeDownInfoBaseSP info, KisNodeSP putAfter) | ||
485 | : m_info(info), m_putAfter(putAfter) {} | 518 | : m_info(info), m_putAfter(putAfter) {} | ||
486 | 519 | | |||
487 | static void findPerfectParent(KisNodeList nodesToDelete, KisNodeSP &putAfter, KisNodeSP &parent) { | 520 | static void findPerfectParent(KisNodeList nodesToDelete, KisNodeSP &putAfter, KisNodeSP &parent) { | ||
488 | if (!putAfter) { | 521 | if (!putAfter) { | ||
489 | putAfter = nodesToDelete.last(); | 522 | putAfter = nodesToDelete.last(); | ||
490 | } | 523 | } | ||
▲ Show 20 Lines • Show All 426 Lines • ▼ Show 20 Line(s) | 947 | KisProcessingApplicator applicator(image, | |||
917 | emitSignals, | 950 | emitSignals, | ||
918 | kundo2_i18n("Change projection color"), | 951 | kundo2_i18n("Change projection color"), | ||
919 | 0, | 952 | 0, | ||
920 | 142857 + 1); | 953 | 142857 + 1); | ||
921 | applicator.applyCommand(new KisChangeProjectionColorCommand(image, color), KisStrokeJobData::BARRIER, KisStrokeJobData::EXCLUSIVE); | 954 | applicator.applyCommand(new KisChangeProjectionColorCommand(image, color), KisStrokeJobData::BARRIER, KisStrokeJobData::EXCLUSIVE); | ||
922 | applicator.end(); | 955 | applicator.end(); | ||
923 | } | 956 | } | ||
924 | 957 | | |||
925 | void mergeMultipleLayersImpl(KisImageSP image, KisNodeList mergedNodes, KisNodeSP putAfter, bool flattenSingleLayer, const KUndo2MagicString &actionName) | 958 | void mergeMultipleLayersImpl(KisImageSP image, KisNodeList mergedNodes, KisNodeSP putAfter, | ||
959 | bool flattenSingleLayer, const KUndo2MagicString &actionName, | ||||
960 | bool cleanupNodes = true, const QString layerName = QString()) | ||||
926 | { | 961 | { | ||
927 | filterMergableNodes(mergedNodes); | 962 | filterMergableNodes(mergedNodes); | ||
928 | { | 963 | { | ||
929 | KisNodeList tempNodes; | 964 | KisNodeList tempNodes; | ||
930 | qSwap(mergedNodes, tempNodes); | 965 | qSwap(mergedNodes, tempNodes); | ||
931 | sortMergableNodes(image->root(), tempNodes, mergedNodes); | 966 | sortMergableNodes(image->root(), tempNodes, mergedNodes); | ||
932 | } | 967 | } | ||
933 | 968 | | |||
Show All 22 Lines | 987 | applicator.applyCommand( | |||
956 | KisStrokeJobData::EXCLUSIVE); | 991 | KisStrokeJobData::EXCLUSIVE); | ||
957 | } | 992 | } | ||
958 | 993 | | |||
959 | if (mergedNodes.size() > 1 || invisibleNodes.isEmpty()) { | 994 | if (mergedNodes.size() > 1 || invisibleNodes.isEmpty()) { | ||
960 | MergeMultipleInfoSP info(new MergeMultipleInfo(image, mergedNodes)); | 995 | MergeMultipleInfoSP info(new MergeMultipleInfo(image, mergedNodes)); | ||
961 | 996 | | |||
962 | applicator.applyCommand(new KeepMergedNodesSelected(info, putAfter, false)); | 997 | applicator.applyCommand(new KeepMergedNodesSelected(info, putAfter, false)); | ||
963 | applicator.applyCommand(new FillSelectionMasks(info)); | 998 | applicator.applyCommand(new FillSelectionMasks(info)); | ||
964 | applicator.applyCommand(new CreateMergedLayerMultiple(info), KisStrokeJobData::BARRIER); | 999 | applicator.applyCommand(new CreateMergedLayerMultiple(info, layerName), KisStrokeJobData::BARRIER); | ||
965 | 1000 | | |||
966 | if (info->frames.size() > 0) { | 1001 | if (info->frames.size() > 0) { | ||
967 | foreach (int frame, info->frames) { | 1002 | foreach (int frame, info->frames) { | ||
968 | applicator.applyCommand(new SwitchFrameCommand(info->image, frame, false, info->storage)); | 1003 | applicator.applyCommand(new SwitchFrameCommand(info->image, frame, false, info->storage)); | ||
969 | 1004 | | |||
970 | applicator.applyCommand(new AddNewFrame(info, frame)); | 1005 | applicator.applyCommand(new AddNewFrame(info, frame)); | ||
971 | applicator.applyCommand(new RefreshHiddenAreas(info)); | 1006 | applicator.applyCommand(new RefreshHiddenAreas(info)); | ||
972 | applicator.applyCommand(new MergeLayersMultiple(info), KisStrokeJobData::BARRIER); | 1007 | applicator.applyCommand(new MergeLayersMultiple(info), KisStrokeJobData::BARRIER); | ||
973 | 1008 | | |||
974 | applicator.applyCommand(new SwitchFrameCommand(info->image, frame, true, info->storage)); | 1009 | applicator.applyCommand(new SwitchFrameCommand(info->image, frame, true, info->storage)); | ||
975 | } | 1010 | } | ||
976 | } else { | 1011 | } else { | ||
977 | applicator.applyCommand(new RefreshHiddenAreas(info)); | 1012 | applicator.applyCommand(new RefreshHiddenAreas(info)); | ||
978 | applicator.applyCommand(new MergeLayersMultiple(info), KisStrokeJobData::BARRIER); | 1013 | applicator.applyCommand(new MergeLayersMultiple(info), KisStrokeJobData::BARRIER); | ||
979 | } | 1014 | } | ||
980 | 1015 | | |||
981 | //applicator.applyCommand(new MergeMetaData(info, strategy), KisStrokeJobData::BARRIER); | 1016 | //applicator.applyCommand(new MergeMetaData(info, strategy), KisStrokeJobData::BARRIER); | ||
1017 | if (cleanupNodes){ | ||||
982 | applicator.applyCommand(new CleanUpNodes(info, putAfter), | 1018 | applicator.applyCommand(new CleanUpNodes(info, putAfter), | ||
983 | KisStrokeJobData::SEQUENTIAL, | 1019 | KisStrokeJobData::SEQUENTIAL, | ||
984 | KisStrokeJobData::EXCLUSIVE); | 1020 | KisStrokeJobData::EXCLUSIVE); | ||
1021 | } else { | ||||
1022 | applicator.applyCommand(new InsertNode(info, putAfter), | ||||
1023 | KisStrokeJobData::SEQUENTIAL, | ||||
1024 | KisStrokeJobData::EXCLUSIVE); | ||||
1025 | } | ||||
985 | applicator.applyCommand(new KeepMergedNodesSelected(info, putAfter, true)); | 1026 | applicator.applyCommand(new KeepMergedNodesSelected(info, putAfter, true)); | ||
986 | } | 1027 | } | ||
987 | 1028 | | |||
988 | applicator.end(); | 1029 | applicator.end(); | ||
989 | 1030 | | |||
990 | } | 1031 | } | ||
991 | 1032 | | |||
992 | void mergeMultipleLayers(KisImageSP image, KisNodeList mergedNodes, KisNodeSP putAfter) | 1033 | void mergeMultipleLayers(KisImageSP image, KisNodeList mergedNodes, KisNodeSP putAfter) | ||
993 | { | 1034 | { | ||
994 | mergeMultipleLayersImpl(image, mergedNodes, putAfter, false, kundo2_i18n("Merge Selected Nodes")); | 1035 | mergeMultipleLayersImpl(image, mergedNodes, putAfter, false, kundo2_i18n("Merge Selected Nodes"), false); | ||
1036 | } | ||||
1037 | | ||||
1038 | void newLayerFromVisible(KisImageSP image, KisNodeSP putAfter) | ||||
1039 | { | ||||
1040 | KisNodeList mergedNodes; | ||||
1041 | mergedNodes << image->root(); | ||||
1042 | | ||||
1043 | mergeMultipleLayersImpl(image, mergedNodes, putAfter, true, kundo2_i18n("New From Visible"), false, i18n("Visible Layer")); | ||||
dkazakov: I guess we use all capitals wording here, that is, the action name should be "New From Visible". | |||||
995 | } | 1044 | } | ||
996 | 1045 | | |||
997 | struct MergeSelectionMasks : public KisCommandUtils::AggregateCommand { | 1046 | struct MergeSelectionMasks : public KisCommandUtils::AggregateCommand { | ||
998 | MergeSelectionMasks(MergeDownInfoBaseSP info, KisNodeSP putAfter) | 1047 | MergeSelectionMasks(MergeDownInfoBaseSP info, KisNodeSP putAfter) | ||
999 | : m_info(info), | 1048 | : m_info(info), | ||
1000 | m_putAfter(putAfter){} | 1049 | m_putAfter(putAfter){} | ||
1001 | 1050 | | |||
1002 | void populateChildCommands() { | 1051 | void populateChildCommands() { | ||
▲ Show 20 Lines • Show All 149 Lines • Show Last 20 Lines |
I guess we use all capitals wording here, that is, the action name should be "New From Visible". I can fix it while pushing the code into a branch.