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

#include <kis_layer_manager.h>

+ Inheritance diagram for KisLayerManager:

Public Member Functions

 KisLayerManager (KisViewManager *view)
 
void setView (QPointer< KisView >view)
 
 ~KisLayerManager () override
 

Private Slots

bool activeLayerHasSelection ()
 
KisNodeSP addAdjustmentLayer (KisNodeSP activeNode)
 
KisAdjustmentLayerSP addAdjustmentLayer (KisNodeSP activeNode, const QString &name, KisFilterConfigurationSP filter, KisSelectionSP selection, KisProcessingApplicator *applicator)
 
KisNodeSP addCloneLayer (KisNodeList nodes)
 
KisNodeSP addFileLayer (KisNodeSP activeNode)
 
KisNodeSP addGeneratorLayer (KisNodeSP activeNode)
 
KisGeneratorLayerSP addGeneratorLayer (KisNodeSP activeNode, const QString &name, KisFilterConfigurationSP filter, KisSelectionSP selection, KisProcessingApplicator *applicator)
 
KisNodeSP addGroupLayer (KisNodeSP activeNode)
 
KisLayerSP addPaintLayer (KisNodeSP activeNode)
 
KisNodeSP addShapeLayer (KisNodeSP activeNode)
 
void changeCloneSource ()
 
void convertGroupToAnimated ()
 
void convertLayerToFileLayer (KisNodeSP source)
 
void convertNodeToPaintLayer (KisNodeSP source)
 
void copyLayerStyle ()
 
void flattenImage ()
 
void flattenLayer ()
 
void imageResizeToActiveLayer ()
 
void layerProperties ()
 
void layerPropertiesDialogClosed ()
 
void layerStyle ()
 
void layersUpdated ()
 
void mergeLayer ()
 
void pasteLayerStyle ()
 
void purgeUnusedImageData ()
 
void saveGroupLayers ()
 
void trimToImage ()
 

Private Member Functions

void activateLayer (KisLayerSP layer)
 
KisPaintDeviceSP activeDevice ()
 
KisLayerSP activeLayer ()
 
void addLayerCommon (KisNodeSP activeNode, KisNodeSP layer, bool updateImage=true, KisProcessingApplicator *applicator=0)
 
void adjustLayerPosition (KisNodeSP node, KisNodeSP activeNode, KisNodeSP &parent, KisNodeSP &above)
 
void setup (KisActionManager *actionManager)
 
void updateGUI ()
 

Private Attributes

KisNodeCommandsAdapterm_commandsAdapter
 
KisActionm_convertGroupAnimated {0}
 
KisActionm_copyLayerStyle {0}
 
KisActionm_flattenLayer {0}
 
KisActionm_groupLayersSave {0}
 
KisActionm_imageFlatten {0}
 
KisActionm_imageMergeLayer {0}
 
KisActionm_imageResizeToLayer {0}
 
QPointer< KisViewm_imageView {0}
 
bool m_layerPropertiesDialogActive {false}
 
KisActionm_layerStyle {0}
 
KisActionm_pasteLayerStyle {0}
 
KisActionm_rasterizeLayer {0}
 
KisViewManagerm_view
 

Friends

class KisNodeManager
 

Detailed Description

KisLayerManager takes care of the gui around working with layers: adding, removing, editing. It also keeps track of the active layer for this view.

Definition at line 29 of file kis_layer_manager.h.

Constructor & Destructor Documentation

◆ KisLayerManager()

KisLayerManager::KisLayerManager ( KisViewManager * view)

Definition at line 105 of file kis_layer_manager.cc.

106 : m_view(view)
108
109{
110}
KisViewManager * m_view
KisNodeCommandsAdapter * m_commandsAdapter

◆ ~KisLayerManager()

KisLayerManager::~KisLayerManager ( )
override

Definition at line 112 of file kis_layer_manager.cc.

113{
114 delete m_commandsAdapter;
115}

References m_commandsAdapter.

Member Function Documentation

◆ activateLayer()

void KisLayerManager::activateLayer ( KisLayerSP layer)
private

Activate the specified layer. The layer may be 0.

Definition at line 138 of file kis_layer_manager.cc.

139{
140 if (m_imageView) {
142 if (layer) {
144 }
145 }
146}
void slotNodeActivated(const KisNodeSP node)
QPointer< KisView > m_imageView
KisCanvasResourceProvider * canvasResourceProvider()

References KisViewManager::canvasResourceProvider(), KisSharedPtr< T >::data(), layersUpdated(), m_imageView, m_view, and KisCanvasResourceProvider::slotNodeActivated().

◆ activeDevice()

KisPaintDeviceSP KisLayerManager::activeDevice ( )
private

Definition at line 130 of file kis_layer_manager.cc.

131{
132 if (activeLayer()) {
133 return activeLayer()->paintDevice();
134 }
135 return 0;
136}
KisLayerSP activeLayer()
virtual KisPaintDeviceSP paintDevice() const =0

References activeLayer(), and KisBaseNode::paintDevice().

◆ activeLayer()

KisLayerSP KisLayerManager::activeLayer ( )
private

Definition at line 122 of file kis_layer_manager.cc.

123{
124 if (m_imageView) {
125 return m_imageView->currentLayer();
126 }
127 return 0;
128}

References m_imageView.

◆ activeLayerHasSelection

bool KisLayerManager::activeLayerHasSelection ( )
privateslot

Definition at line 1024 of file kis_layer_manager.cc.

1025{
1026 return (activeLayer()->selection() != 0);
1027}

References activeLayer().

◆ addAdjustmentLayer [1/2]

KisNodeSP KisLayerManager::addAdjustmentLayer ( KisNodeSP activeNode)
privateslot

Definition at line 735 of file kis_layer_manager.cc.

736{
737 KisImageWSP image = m_view->image();
738
739 KisSelectionSP selection = m_view->selection();
740
743 kundo2_i18n("Add Layer"));
744
745
746 KisAdjustmentLayerSP adjl = addAdjustmentLayer(activeNode, QString(), 0, selection, &applicator);
747 applicator.end();
748 image->waitForDone(); // So that previewDevice doesn't end up empty and result in empty histograms
749
750 KisPaintDeviceSP previewDevice = new KisPaintDevice(*adjl->original());
751
752 KisDlgAdjustmentLayer dlg(adjl, adjl.data(), previewDevice, image->nextLayerName(i18n("Filter Layer")), i18n("New Filter Layer"), m_view, qApp->activeWindow());
753 dlg.resize(dlg.minimumSizeHint());
754
755 // ensure that the device may be free'd by the dialog
756 // when it is not needed anymore
757 previewDevice = 0;
758
759 if (dlg.exec() != QDialog::Accepted || adjl->filter().isNull()) {
760 // XXX: add messagebox warning if there's no filter set!
762 } else {
763 adjl->setName(dlg.layerName());
764 }
765
766 return adjl;
767}
QVector< KisImageSignalType > KisImageSignalVector
void waitForDone()
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
KisNodeSP addAdjustmentLayer(KisNodeSP activeNode)
KisSelectionSP selection()
KisImageWSP image() const
Return the image this view is displaying.
KUndo2MagicString kundo2_i18n(const char *text)

References addAdjustmentLayer(), KisSharedPtr< T >::data(), KisProcessingApplicator::end(), KisViewManager::image(), kundo2_i18n(), KisDlgAdjustmentLayer::layerName(), m_commandsAdapter, m_view, KoDialog::minimumSizeHint(), KisImage::nextLayerName(), KisProcessingApplicator::NONE, KisViewManager::selection(), KisNodeCommandsAdapter::undoLastCommand(), and KisImage::waitForDone().

◆ addAdjustmentLayer [2/2]

KisAdjustmentLayerSP KisLayerManager::addAdjustmentLayer ( KisNodeSP activeNode,
const QString & name,
KisFilterConfigurationSP filter,
KisSelectionSP selection,
KisProcessingApplicator * applicator )
privateslot

Definition at line 769 of file kis_layer_manager.cc.

773{
774 KisImageWSP image = m_view->image();
775 KisAdjustmentLayerSP layer = new KisAdjustmentLayer(image, name, filter ? filter->cloneWithResourcesSnapshot() : 0, selection);
776 addLayerCommon(activeNode, layer, true, applicator);
777
778 return layer;
779}
void addLayerCommon(KisNodeSP activeNode, KisNodeSP layer, bool updateImage=true, KisProcessingApplicator *applicator=0)

References addLayerCommon(), KisViewManager::image(), and m_view.

◆ addCloneLayer

KisNodeSP KisLayerManager::addCloneLayer ( KisNodeList nodes)
privateslot

Definition at line 704 of file kis_layer_manager.cc.

705{
706 KisImageWSP image = m_view->image();
707
709 if (filteredNodes.isEmpty()) return KisNodeSP();
710
711 KisNodeSP newAbove = filteredNodes.last();
712
713 KisNodeSP node, lastClonedNode;
714 Q_FOREACH (node, filteredNodes) {
715 lastClonedNode = new KisCloneLayer(qobject_cast<KisLayer*>(node.data()), image.data(), image->nextLayerName( i18n("Clone Layer") ), OPACITY_OPAQUE_U8);
716 addLayerCommon(newAbove, lastClonedNode, true, 0 );
717 }
718
719 return lastClonedNode;
720}
const quint8 OPACITY_OPAQUE_U8
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86
KisNodeList sortAndFilterMergeableInternalNodes(KisNodeList nodes, bool allowMasks)

References addLayerCommon(), KisSharedPtr< T >::data(), KisWeakSharedPtr< T >::data(), KisViewManager::image(), m_view, KisImage::nextLayerName(), OPACITY_OPAQUE_U8, and KisLayerUtils::sortAndFilterMergeableInternalNodes().

◆ addFileLayer

KisNodeSP KisLayerManager::addFileLayer ( KisNodeSP activeNode)
privateslot

Definition at line 1029 of file kis_layer_manager.cc.

1030{
1031 QString basePath;
1032 QString path = m_view->document()->path();
1033 basePath = QFileInfo(path).absolutePath();
1034 KisImageWSP image = m_view->image();
1035
1036 KisDlgFileLayer dlg(basePath, image->nextLayerName(i18n("File Layer")), m_view->mainWindow());
1037 dlg.resize(dlg.minimumSizeHint());
1038
1039 if (dlg.exec() == QDialog::Accepted) {
1040 QString name = dlg.layerName();
1041 QString fileName = dlg.fileName();
1042
1043 if(fileName.isEmpty()){
1044 QMessageBox::critical(m_view->mainWindow(), i18nc("@title:window", "Krita"), i18n("No file name specified"));
1045 return 0;
1046 }
1047
1048 KisFileLayer::ScalingMethod scalingMethod = dlg.scaleToImageResolution();
1049 QString scalingFilter = dlg.scalingFilter();
1050 KisNodeSP node = new KisFileLayer(image, basePath, fileName, scalingMethod, scalingFilter, name, OPACITY_OPAQUE_U8);
1051 addLayerCommon(activeNode, node, true, 0);
1052 return node;
1053 }
1054 return 0;
1055}
QString path() const
The KisFileLayer class loads a particular file as a layer into the layer stack.
KisMainWindow * mainWindow() const
KisDocument * document() const
const char * name(StandardAction id)

References addLayerCommon(), KisViewManager::document(), KisDlgFileLayer::fileName(), KisViewManager::image(), KisDlgFileLayer::layerName(), m_view, KisViewManager::mainWindow(), KoDialog::minimumSizeHint(), KisImage::nextLayerName(), OPACITY_OPAQUE_U8, KisDocument::path(), KisDlgFileLayer::scaleToImageResolution(), and KisDlgFileLayer::scalingFilter().

◆ addGeneratorLayer [1/2]

KisNodeSP KisLayerManager::addGeneratorLayer ( KisNodeSP activeNode)
privateslot

Definition at line 790 of file kis_layer_manager.cc.

791{
792 KisImageWSP image = m_view->image();
793 KisSelectionSP selection = m_view->selection();
794 QColor currentForeground = m_view->canvasResourceProvider()->fgColor().toQColor();
795
797
798 KisGeneratorLayerSP node = addGeneratorLayer(activeNode, QString(), nullptr, selection, &applicator);
799
800 KisDlgGeneratorLayer dlg(image->nextLayerName(i18n("Fill Layer")), m_view, m_view->mainWindow(), node, nullptr, applicator.getStroke());
801 KisFilterConfigurationSP defaultConfig = dlg.configuration();
802 defaultConfig->setProperty("color", currentForeground);
803 dlg.setConfiguration(defaultConfig);
804
805 if (dlg.exec() == QDialog::Accepted) {
806 applicator.applyCommand(new KisNodeRenameCommand(node, node->name(), dlg.layerName()));
807 applicator.end();
808 return node;
809 }
810 else {
811 applicator.cancel();
812 return nullptr;
813 }
814}
KisNodeSP addGeneratorLayer(KisNodeSP activeNode)
The command for setting the node's name.
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
QString name() const

References addGeneratorLayer(), KisProcessingApplicator::applyCommand(), KisProcessingApplicator::cancel(), KisViewManager::canvasResourceProvider(), KisDlgGeneratorLayer::configuration(), KisProcessingApplicator::end(), KisCanvasResourceProvider::fgColor(), KisProcessingApplicator::getStroke(), KisViewManager::image(), kundo2_i18n(), KisDlgGeneratorLayer::layerName(), m_view, KisViewManager::mainWindow(), KisBaseNode::name(), KisImage::nextLayerName(), KisProcessingApplicator::NONE, KisViewManager::selection(), KisDlgGeneratorLayer::setConfiguration(), and KoColor::toQColor().

◆ addGeneratorLayer [2/2]

KisGeneratorLayerSP KisLayerManager::addGeneratorLayer ( KisNodeSP activeNode,
const QString & name,
KisFilterConfigurationSP filter,
KisSelectionSP selection,
KisProcessingApplicator * applicator )
privateslot

Definition at line 781 of file kis_layer_manager.cc.

782{
783 KisImageWSP image = m_view->image();
784 auto layer = new KisGeneratorLayer(image, name, filter, selection);
785 addLayerCommon(activeNode, layer, true, applicator);
786
787 return layer;
788}

References addLayerCommon(), KisViewManager::image(), and m_view.

◆ addGroupLayer

KisNodeSP KisLayerManager::addGroupLayer ( KisNodeSP activeNode)
privateslot

Definition at line 696 of file kis_layer_manager.cc.

697{
698 KisImageWSP image = m_view->image();
699 KisGroupLayerSP group = new KisGroupLayer(image.data(), image->nextLayerName( i18nc("A group of layers", "Group") ), OPACITY_OPAQUE_U8);
700 addLayerCommon(activeNode, group, false, 0);
701 return group;
702}

References addLayerCommon(), KisWeakSharedPtr< T >::data(), KisViewManager::image(), m_view, KisImage::nextLayerName(), and OPACITY_OPAQUE_U8.

◆ addLayerCommon()

void KisLayerManager::addLayerCommon ( KisNodeSP activeNode,
KisNodeSP layer,
bool updateImage = true,
KisProcessingApplicator * applicator = 0 )
private

Definition at line 657 of file kis_layer_manager.cc.

658{
660 KisNodeSP above;
661 adjustLayerPosition(layer, activeNode, parent, above);
662
663 KisGroupLayer *group = dynamic_cast<KisGroupLayer*>(parent.data());
664
665 if (layer->inherits("KisGroupLayer") || layer->inherits("KisPaintLayer")) {
666 const KoColorSpace *colorSpace = group->colorSpace();
667
668 if (layer->inherits("KisGroupLayer")) {
669 KisGroupLayer *newLayer = dynamic_cast<KisGroupLayer*>(layer.data());
670 newLayer->resetCache(colorSpace);
671 } else {
672 KisPaintLayer *newLayer = qobject_cast<KisPaintLayer *>(layer.data());
673 newLayer->paintDevice()->convertTo(colorSpace);
674 }
675 }
676
677 const bool parentForceUpdate = group && !group->projectionIsValid();
678 updateImage |= parentForceUpdate;
679
680 m_commandsAdapter->addNodeAsync(layer, parent, above, updateImage, updateImage, applicator);
681}
void adjustLayerPosition(KisNodeSP node, KisNodeSP activeNode, KisNodeSP &parent, KisNodeSP &above)
void addNodeAsync(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, bool doRedoUpdates=true, bool doUndoUpdates=true, KisProcessingApplicator *applicator=0)
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
bool projectionIsValid() const
const KoColorSpace * colorSpace() const override
void resetCache(const KoColorSpace *colorSpace)
KisPaintDeviceSP paintDevice

References KisNodeCommandsAdapter::addNodeAsync(), adjustLayerPosition(), KisGroupLayer::colorSpace(), KisPaintDevice::convertTo(), KisSharedPtr< T >::data(), m_commandsAdapter, KisPaintLayer::paintDevice, KisGroupLayer::projectionIsValid(), and KisGroupLayer::resetCache().

◆ addPaintLayer

KisLayerSP KisLayerManager::addPaintLayer ( KisNodeSP activeNode)
privateslot

Definition at line 683 of file kis_layer_manager.cc.

684{
685 KisImageWSP image = m_view->image();
686 KisLayerSP layer = new KisPaintLayer(image.data(), image->nextLayerName( i18n("Paint Layer") ), OPACITY_OPAQUE_U8, image->colorSpace());
687
688 KisConfig cfg(true);
689 layer->setPinnedToTimeline(cfg.autoPinLayersToTimeline());
690
691 addLayerCommon(activeNode, layer, false, 0);
692
693 return layer;
694}
const KoColorSpace * colorSpace() const
void setPinnedToTimeline(bool pinned)

References addLayerCommon(), KisConfig::autoPinLayersToTimeline(), KisImage::colorSpace(), KisWeakSharedPtr< T >::data(), KisViewManager::image(), m_view, KisImage::nextLayerName(), OPACITY_OPAQUE_U8, and KisBaseNode::setPinnedToTimeline().

◆ addShapeLayer

KisNodeSP KisLayerManager::addShapeLayer ( KisNodeSP activeNode)
privateslot

Definition at line 722 of file kis_layer_manager.cc.

723{
724 if (!m_view) return 0;
725 if (!m_view->document()) return 0;
726
727 KisImageWSP image = m_view->image();
728 KisShapeLayerSP layer = new KisShapeLayer(m_view->document()->shapeController(), image.data(), image->nextLayerName(i18n("Vector Layer")), OPACITY_OPAQUE_U8);
729
730 addLayerCommon(activeNode, layer, false, 0);
731
732 return layer;
733}
KisShapeController * shapeController

References addLayerCommon(), KisWeakSharedPtr< T >::data(), KisViewManager::document(), KisViewManager::image(), m_view, KisImage::nextLayerName(), OPACITY_OPAQUE_U8, and KisDocument::shapeController.

◆ adjustLayerPosition()

void KisLayerManager::adjustLayerPosition ( KisNodeSP node,
KisNodeSP activeNode,
KisNodeSP & parent,
KisNodeSP & above )
private

Definition at line 628 of file kis_layer_manager.cc.

629{
630 Q_ASSERT(activeNode);
631
632 parent = activeNode;
633 above = parent->lastChild();
634
635 if (parent->inherits("KisGroupLayer") && parent->collapsed()) {
636 above = parent;
637 parent = parent->parent();
638 return;
639 }
640
641 while (parent &&
642 (!parent->allowAsChild(node) || !parent->isEditable(false))) {
643
644 above = parent;
645 parent = parent->parent();
646 }
647
648 if (!parent) {
649 warnKrita << "KisLayerManager::adjustLayerPosition:"
650 << "No node accepted newly created node";
651
652 parent = m_view->image()->root();
653 above = parent->lastChild();
654 }
655}
#define warnKrita
Definition kis_debug.h:87

References KisViewManager::image(), m_view, KisNodeFacade::root, and warnKrita.

◆ changeCloneSource

void KisLayerManager::changeCloneSource ( )
privateslot

Definition at line 398 of file kis_layer_manager.cc.

399{
400 QList<KisNodeSP> selectedNodes = m_view->nodeManager()->selectedNodes();
401 if (selectedNodes.isEmpty()) {
402 return;
403 }
404
405 QList<KisCloneLayerSP> cloneLayers;
406 KisNodeSP node;
407 Q_FOREACH (node, selectedNodes) {
408 KisCloneLayerSP cloneLayer(qobject_cast<KisCloneLayer *>(node.data()));
409 if (cloneLayer) {
410 cloneLayers << cloneLayer;
411 }
412 }
413
414 if (cloneLayers.isEmpty()) {
415 return;
416 }
417
418 if (!m_view->nodeManager()->canModifyLayers(implicitCastList<KisNodeSP>(cloneLayers))) return;
419
421 dialog->setCaption(i18n("Change Clone Layer"));
422 dialog->resize(dialog->minimumSizeHint());
423 dialog->setAttribute(Qt::WA_DeleteOnClose);
424 Qt::WindowFlags flags = dialog->windowFlags();
425 dialog->setWindowFlags(flags | Qt::Tool | Qt::Dialog);
426 dialog->show();
427 dialog->activateWindow();
428}
KisNodeList selectedNodes()
bool canModifyLayers(KisNodeList nodes, bool showWarning=true)
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.

References KisNodeManager::canModifyLayers(), KisSharedPtr< T >::data(), m_view, KisViewManager::nodeManager(), and KisNodeManager::selectedNodes().

◆ convertGroupToAnimated

void KisLayerManager::convertGroupToAnimated ( )
privateslot

Definition at line 508 of file kis_layer_manager.cc.

509{
510 KisGroupLayerSP targetGroup = dynamic_cast<KisGroupLayer*>(activeLayer().data());
511 if (targetGroup.isNull()) {
512 // Try containing group, if it exists...
514 if (!parent->parent()) return; // watch out for the root node!
515 targetGroup = dynamic_cast<KisGroupLayer*>(parent.data());
516 }
517
518 if (targetGroup.isNull()) return;
519 if (!m_view->nodeManager()->canModifyLayer(targetGroup)) return;
520
521 KisPaintLayerSP animatedLayer = new KisPaintLayer(m_view->image(), targetGroup->name(), OPACITY_OPAQUE_U8);
522 animatedLayer->enableAnimation();
523 KisRasterKeyframeChannel *keyframeChannel = dynamic_cast<KisRasterKeyframeChannel*>(
524 animatedLayer->getKeyframeChannel(KisKeyframeChannel::Raster.id(), true));
525 KIS_ASSERT_RECOVER_RETURN(keyframeChannel);
526
527 KisNodeSP childNode = targetGroup->firstChild();
528 int time = 0;
529 while (childNode) {
530 keyframeChannel->importFrame(time, childNode->projection(), NULL);
531 time++;
532
533 childNode = childNode->nextSibling();
534 }
535
536 m_commandsAdapter->beginMacro(kundo2_i18n("Convert Group to Animated Layer"));
537 m_commandsAdapter->addNode(animatedLayer, targetGroup->parent(), targetGroup);
538 m_commandsAdapter->removeNode(targetGroup);
540}
static const KoID Raster
void addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, KisImageLayerAddCommand::Flags flags=KisImageLayerAddCommand::DoRedoUpdates|KisImageLayerAddCommand::DoUndoUpdates)
void beginMacro(const KUndo2MagicString &macroName)
bool canModifyLayer(KisNodeSP node, bool showWarning=true)
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
void importFrame(int time, KisPaintDeviceSP sourceDevice, KUndo2Command *parentCommand)
bool isNull() const
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
virtual KisPaintDeviceSP projection() const =0
KisKeyframeChannel * getKeyframeChannel(const QString &id, bool create)
void enableAnimation()
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References activeLayer(), KisNodeCommandsAdapter::addNode(), KisNodeCommandsAdapter::beginMacro(), KisNodeManager::canModifyLayer(), KisSharedPtr< T >::data(), KisBaseNode::enableAnimation(), KisNodeCommandsAdapter::endMacro(), KisNode::firstChild(), KisBaseNode::getKeyframeChannel(), KisViewManager::image(), KisRasterKeyframeChannel::importFrame(), KisSharedPtr< T >::isNull(), KIS_ASSERT_RECOVER_RETURN, kundo2_i18n(), m_commandsAdapter, m_view, KisBaseNode::name(), KisNode::nextSibling(), KisViewManager::nodeManager(), OPACITY_OPAQUE_U8, KisNode::parent, KisBaseNode::projection(), KisKeyframeChannel::Raster, and KisNodeCommandsAdapter::removeNode().

◆ convertLayerToFileLayer

void KisLayerManager::convertLayerToFileLayer ( KisNodeSP source)
privateslot

Definition at line 542 of file kis_layer_manager.cc.

543{
544 KisImageSP image = m_view->image();
545 if (!image) return;
546
547 // this precondition must be checked at higher level
548 KIS_SAFE_ASSERT_RECOVER_RETURN(source->isEditable(false));
549
551
552 KoDialog dlg;
553 QWidget *page = new QWidget(&dlg);
554 dlg.setMainWidget(page);
555 QBoxLayout *layout = new QVBoxLayout(page);
556 dlg.setWindowTitle(i18n("Save layers to..."));
557 QLabel *lbl = new QLabel(i18n("Choose the location where the layer will be saved to. The new file layer will then reference this location."));
558 lbl->setWordWrap(true);
559 layout->addWidget(lbl);
560 KisFileNameRequester *urlRequester = new KisFileNameRequester(page);
561 urlRequester->setMode(KoFileDialog::SaveFile);
562 urlRequester->setMimeTypeFilters(listMimeFilter);
563 urlRequester->setFileName(m_view->document()->path());
564 if (!m_view->document()->path().isEmpty()) {
565 QFileInfo location = QFileInfo(m_view->document()->path());
566 location.setFile(location.dir(), location.completeBaseName() + "_" + source->name() + ".png");
567 urlRequester->setFileName(location.absoluteFilePath());
568 }
569 else {
570 const QFileInfo location = QFileInfo(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
571 const QString proposedFileName = QDir(location.absoluteFilePath()).absoluteFilePath(source->name() + ".png");
572 urlRequester->setFileName(proposedFileName);
573 }
574
575 layout->addWidget(urlRequester);
576 if (!dlg.exec()) return;
577
578 QString path = urlRequester->fileName();
579
580 if (path.isEmpty()) return;
581
582 QFileInfo f(path);
583
584 QString mimeType= KisMimeDatabase::mimeTypeForFile(f.fileName());
585 if (mimeType.isEmpty()) {
586 mimeType = "image/png";
587 }
588 QScopedPointer<KisDocument> doc(KisPart::instance()->createDocument());
589
590 QRect bounds = source->exactBounds();
591 if (bounds.isEmpty()) {
592 bounds = image->bounds();
593 }
594 KisImageSP dst = new KisImage(doc->createUndoStore(),
595 image->width(),
596 image->height(),
598 source->name());
599 dst->setResolution(image->xRes(), image->yRes());
600 doc->setFileBatchMode(false);
601 doc->setCurrentImage(dst);
602 KisNodeSP node = source->clone();
603 dst->addNode(node);
604 dst->initialRefreshGraph();
605 dst->cropImage(bounds);
606 dst->waitForDone();
607
608 bool r = doc->exportDocumentSync(path, mimeType.toLatin1());
609 if (!r) {
610
611 qWarning() << "Converting layer to file layer. path:"<< path << "gave errors" << doc->errorMessage();
612 } else {
613 QString basePath = QFileInfo(m_view->document()->path()).absolutePath();
614 QString relativePath = QDir(basePath).relativeFilePath(path);
615 KisFileLayer *fileLayer = new KisFileLayer(image, basePath, relativePath, KisFileLayer::None, "Bicubic", source->name(), OPACITY_OPAQUE_U8);
616 fileLayer->setX(bounds.x());
617 fileLayer->setY(bounds.y());
618 KisNodeSP dstParent = source->parent();
619 KisNodeSP dstAboveThis = source->prevSibling();
620 m_commandsAdapter->beginMacro(kundo2_i18n("Convert to a file layer"));
622 m_commandsAdapter->addNode(fileLayer, dstParent, dstAboveThis);
624 }
625 doc->closePath(false);
626}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
void setMimeTypeFilters(const QStringList &filterList, QString defaultFilter=QString())
void setMode(KoFileDialog::DialogType mode)
void setFileName(const QString &path)
KisPaintDeviceSP projection() const
qint32 width() const
void cropImage(const QRect &newRect)
start asynchronous operation on cropping the image
Definition kis_image.cc:870
void initialRefreshGraph()
double xRes() const
double yRes() const
qint32 height() const
QRect bounds() const override
void setResolution(double xres, double yres)
static QStringList supportedMimeTypes(Direction direction)
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
virtual const KoColorSpace * compositionSourceColorSpace() const
static KisPart * instance()
Definition KisPart.cpp:131
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define bounds(x, a, b)
KisDocument * createDocument(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)
void setX(qint32 x) override
Definition kis_layer.cc:986
void setY(qint32 y) override
Definition kis_layer.cc:992
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)

References KisNodeCommandsAdapter::addNode(), KisNodeFacade::addNode(), KisNodeCommandsAdapter::beginMacro(), KisImage::bounds(), bounds, KisPaintDevice::compositionSourceColorSpace(), createDocument(), KisImage::cropImage(), KisViewManager::document(), KisNodeCommandsAdapter::endMacro(), KisImportExportManager::Export, KisFileNameRequester::fileName(), KisImage::height(), KisViewManager::image(), KisImage::initialRefreshGraph(), KisPart::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN, kundo2_i18n(), m_commandsAdapter, m_view, KisMimeDatabase::mimeTypeForFile(), KisFileLayer::None, OPACITY_OPAQUE_U8, KisDocument::path(), KisImage::projection(), KisNodeCommandsAdapter::removeNode(), KoFileDialog::SaveFile, KisFileNameRequester::setFileName(), KoDialog::setMainWidget(), KisFileNameRequester::setMimeTypeFilters(), KisFileNameRequester::setMode(), KisImage::setResolution(), KisLayer::setX(), KisLayer::setY(), source(), KisImportExportManager::supportedMimeTypes(), KisImage::waitForDone(), KisImage::width(), KisImage::xRes(), and KisImage::yRes().

◆ convertNodeToPaintLayer

void KisLayerManager::convertNodeToPaintLayer ( KisNodeSP source)
privateslot

Definition at line 491 of file kis_layer_manager.cc.

492{
493 KisImageWSP image = m_view->image();
494 if (!image) return;
495
496 // this precondition must be checked at higher level
497 KIS_SAFE_ASSERT_RECOVER_RETURN(source->isEditable(false));
498
499 KisLayer *srcLayer = qobject_cast<KisLayer*>(source.data());
500 if (srcLayer && (srcLayer->inherits("KisGroupLayer") || srcLayer->layerStyle() || srcLayer->childCount() > 0)) {
501 image->flattenLayer(srcLayer);
502 return;
503 }
504
506}
void flattenLayer(KisLayerSP layer)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
std::future< KisNodeSP > convertToPaintLayer(KisImageSP image, KisNodeSP src)
KisPSDLayerStyleSP layerStyle
Definition kis_layer.cc:171
quint32 childCount() const
Definition kis_node.cpp:414

References KisNode::childCount(), KisLayerUtils::convertToPaintLayer(), KisImage::flattenLayer(), KisViewManager::image(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisLayer::layerStyle, m_view, source(), and void().

◆ copyLayerStyle

void KisLayerManager::copyLayerStyle ( )
privateslot

Definition at line 430 of file kis_layer_manager.cc.

431{
432 KisImageSP image = m_view->image();
433 if (!image) return;
434
435 KisLayerSP layer = activeLayer();
436 if (!layer) return;
437
439 if (!layerStyle) return;
440
443 QString psdxml = serializer.formPsdXmlDocument().toString();
444
445 if (!psdxml.isEmpty()) {
446 QMimeData *mimeData = new QMimeData;
447
448 mimeData->setText(psdxml);
449 mimeData->setData("application/x-krita-layer-style", psdxml.toUtf8());
450
451 QGuiApplication::clipboard()->setMimeData(mimeData);
452 }
453}
void setStyles(const QVector< KisPSDLayerStyleSP > &styles)

References activeLayer(), KisAslLayerStyleSerializer::formPsdXmlDocument(), KisViewManager::image(), KisLayer::layerStyle, layerStyle(), m_view, and KisAslLayerStyleSerializer::setStyles().

◆ flattenImage

void KisLayerManager::flattenImage ( )
privateslot

Definition at line 816 of file kis_layer_manager.cc.

817{
818 KisImageSP image = m_view->image();
819
820 if (!m_view->blockUntilOperationsFinished(image)) return;
821
822 if (image) {
823 bool doIt = true;
824
825 if (image->nHiddenLayers() > 0) {
826 int answer = QMessageBox::warning(m_view->mainWindow(),
827 i18nc("@title:window", "Flatten Image"),
828 i18n("The image contains hidden layers that will be lost. Do you want to flatten the image?"),
829 QMessageBox::Yes | QMessageBox::No,
830 QMessageBox::No);
831
832 if (answer != QMessageBox::Yes) {
833 doIt = false;
834 }
835 }
836
837 if (doIt) {
838 image->flatten(m_view->activeNode());
839 }
840 }
841}
void flatten(KisNodeSP activeNode)
qint32 nHiddenLayers() const
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
KisNodeSP activeNode()

References KisViewManager::activeNode(), KisViewManager::blockUntilOperationsFinished(), KisImage::flatten(), KisViewManager::image(), m_view, KisViewManager::mainWindow(), and KisImage::nHiddenLayers().

◆ flattenLayer

void KisLayerManager::flattenLayer ( )
privateslot

Definition at line 955 of file kis_layer_manager.cc.

956{
957 KisImageSP image = m_view->image();
958 if (!image) return;
959
960 KisLayerSP layer = activeLayer();
961 if (!layer) return;
962
963 if (!m_view->blockUntilOperationsFinished(image)) return;
964 if (!m_view->nodeManager()->canModifyLayer(layer)) return;
965
967 m_view->updateGUI();
968}
void convertNodeToPaintLayer(KisNodeSP source)

References activeLayer(), KisViewManager::blockUntilOperationsFinished(), KisNodeManager::canModifyLayer(), convertNodeToPaintLayer(), KisViewManager::image(), m_view, KisViewManager::nodeManager(), and KisViewManager::updateGUI().

◆ imageResizeToActiveLayer

void KisLayerManager::imageResizeToActiveLayer ( )
privateslot

Definition at line 208 of file kis_layer_manager.cc.

209{
210 KisLayerSP layer;
211 KisImageWSP image = m_view->image();
212
213 if (image && (layer = activeLayer())) {
214 QRect cropRect = layer->projection()->nonDefaultPixelArea();
215 if (!cropRect.isEmpty()) {
216 image->cropImage(cropRect);
217 } else {
219 i18nc("floating message in layer manager",
220 "Layer is empty "),
221 QIcon(), 2000, KisFloatingMessage::Low);
222 }
223 }
224}
QRect nonDefaultPixelArea() const
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:826

References activeLayer(), KisImage::cropImage(), KisViewManager::image(), KisFloatingMessage::Low, m_view, KisPaintDevice::nonDefaultPixelArea(), KisLayer::projection(), and KisViewManager::showFloatingMessage().

◆ layerProperties

void KisLayerManager::layerProperties ( )
privateslot

Definition at line 242 of file kis_layer_manager.cc.

243{
244 if (!m_view) return;
245 if (!m_view->document()) return;
246
247 // For non-modal dialogs, only allow one instance of the dialog to exist.
248 // Modal dialogs won't set this.
250
251 KisLayerSP layer = activeLayer();
252 if (!layer) return;
253
254 const QList<KisNodeSP> selectedNodes = m_view->nodeManager()->selectedNodes();
255 const bool multipleLayersSelected = selectedNodes.size() > 1;
256
257 if (!m_view->nodeManager()->canModifyLayers(selectedNodes)) return;
258
259 KisAdjustmentLayerSP adjustmentLayer = KisAdjustmentLayerSP(dynamic_cast<KisAdjustmentLayer*>(layer.data()));
260 KisGeneratorLayerSP generatorLayer = KisGeneratorLayerSP(dynamic_cast<KisGeneratorLayer*>(layer.data()));
261 KisFileLayerSP fileLayer = KisFileLayerSP(dynamic_cast<KisFileLayer*>(layer.data()));
262
263 if (adjustmentLayer && !multipleLayersSelected) {
264 KisPaintDeviceSP dev = adjustmentLayer->projection();
265
266 KisDlgAdjLayerProps dlg(adjustmentLayer, adjustmentLayer.data(), dev, m_view, adjustmentLayer->filter().data(), adjustmentLayer->name(), i18n("Filter Layer Properties"), m_view->mainWindow(), "dlgadjlayerprops");
267 dlg.resize(dlg.minimumSizeHint());
268
269 KisFilterConfigurationSP configBefore(adjustmentLayer->filter());
270 KIS_ASSERT_RECOVER_RETURN(configBefore);
271 QString xmlBefore = configBefore->toXML();
272
273 if (dlg.exec() == QDialog::Accepted) {
274 KUndo2Command *cmd = nullptr;
275
276 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
277 Q_ASSERT(configAfter);
278 QString xmlAfter = configAfter->toXML();
279
280 if(xmlBefore != xmlAfter) {
282 new KisChangeFilterCmd(adjustmentLayer,
283 configBefore->cloneWithResourcesSnapshot(),
284 configAfter->cloneWithResourcesSnapshot()));
285 }
286
287 if (adjustmentLayer->name() != dlg.layerName()) {
289 new KisNodeRenameCommand(adjustmentLayer,
290 adjustmentLayer->name(),
291 dlg.layerName()));
292 }
293
294 if (cmd) {
296 }
297 }
298 else {
299 KisFilterConfigurationSP configAfter(dlg.filterConfiguration());
300 Q_ASSERT(configAfter);
301 QString xmlAfter = configAfter->toXML();
302
303 if(xmlBefore != xmlAfter) {
304 adjustmentLayer->setFilter(configBefore->cloneWithResourcesSnapshot());
305 adjustmentLayer->setDirty();
306 }
307 }
308 }
309 else if (fileLayer && !multipleLayersSelected){
310 QString basePath = QFileInfo(m_view->document()->path()).absolutePath();
311 QString fileNameOld = fileLayer->fileName();
312 KisFileLayer::ScalingMethod scalingMethodOld = fileLayer->scalingMethod();
313 QString scalingFilterOld = fileLayer->scalingFilter();
314 KisDlgFileLayer dlg(basePath, fileLayer->name(), m_view->mainWindow());
315 dlg.setCaption(i18n("File Layer Properties"));
316 dlg.setFileName(fileNameOld);
317 dlg.setScalingMethod(scalingMethodOld);
318 dlg.setScalingFilter(scalingFilterOld);
319
320 if (dlg.exec() == QDialog::Accepted) {
321 const QString fileNameNew = dlg.fileName();
322 KisFileLayer::ScalingMethod scalingMethodNew = dlg.scaleToImageResolution();
323 QString scalingFilterNew = dlg.scalingFilter();
324
325 if(fileNameNew.isEmpty()){
326 QMessageBox::critical(m_view->mainWindow(), i18nc("@title:window", "Krita"), i18n("No file name specified"));
327 return;
328 }
329
330 KUndo2Command *cmd = nullptr;
331
332 if (fileNameOld != fileNameNew || scalingMethodOld != scalingMethodNew
333 || scalingFilterOld != scalingFilterNew) {
334
336 new KisChangeFileLayerCmd(fileLayer,
337 basePath,
338 fileNameOld,
339 scalingMethodOld,
340 scalingFilterOld,
341 basePath,
342 fileNameNew,
343 scalingMethodNew,
344 scalingFilterNew));
345 }
346
347 if (fileLayer->name() != dlg.layerName()) {
349 new KisNodeRenameCommand(fileLayer, fileLayer->name(), dlg.layerName()));
350 }
351
352 if (cmd) {
354 }
355 }
356 } else {
357 QDialog* dlg = nullptr;
358
359 if (generatorLayer && !multipleLayersSelected) {
360 KisFilterConfigurationSP configBefore(generatorLayer->filter());
361 Q_ASSERT(configBefore);
362
363 auto* genDlg = new KisDlgGeneratorLayer(generatorLayer->name(), m_view, m_view->canvas(), generatorLayer, configBefore, KisStrokeId());
364 genDlg->setWindowTitle(i18n("Fill Layer Properties"));
365 genDlg->setConfiguration(configBefore.data());
366
367 dlg = genDlg;
368 }
369
370 // Handle these layer(s) as normal painting layer, vector layer, or group layer
371 if (!dlg) {
372 dlg = new KisDlgLayerProperties(selectedNodes, m_view, m_view->canvas());
373 }
374
375 dlg->resize(dlg->minimumSizeHint());
376 dlg->setAttribute(Qt::WA_DeleteOnClose);
377
378 const Qt::WindowFlags flags = dlg->windowFlags();
379#ifdef Q_OS_ANDROID
380 // a Qt::Tool window seems incapable of receiving keyboard focus
381 dlg->setWindowFlags(flags | Qt::Dialog);
382#else
383 dlg->setWindowFlags(flags | Qt::Tool | Qt::Dialog);
384#endif
385 connect(dlg, SIGNAL(destroyed()), this, SLOT(layerPropertiesDialogClosed()));
387
388 dlg->show();
389 dlg->activateWindow();
390 }
391}
ScalingMethod scalingMethod() const
QString fileName() const
QString scalingFilter() const
virtual KisFilterConfigurationSP filter() const
virtual void addCommand(KUndo2Command *cmd)=0
KisUndoAdapter * undoAdapter()
The undo adapter is used to add commands to the undo stack.
QWidget * canvas() const
Return the actual widget that is displaying the current image.
KisSharedPtr< KisFileLayer > KisFileLayerSP
Definition kis_types.h:145
KisSharedPtr< KisAdjustmentLayer > KisAdjustmentLayerSP
Definition kis_types.h:131
KisSharedPtr< KisGeneratorLayer > KisGeneratorLayerSP
Definition kis_types.h:134
KUndo2Command * composeCommands(KUndo2Command *parent, KUndo2Command *cmd)

References activeLayer(), KisUndoAdapter::addCommand(), KisNodeManager::canModifyLayers(), KisViewManager::canvas(), KisCommandUtils::composeCommands(), KisSharedPtr< T >::data(), KisViewManager::document(), KisDlgFileLayer::fileName(), KisFileLayer::fileName(), KisNodeFilterInterface::filter(), KisDlgAdjLayerProps::filterConfiguration(), KIS_ASSERT_RECOVER_RETURN, KisDlgAdjLayerProps::layerName(), KisDlgFileLayer::layerName(), layerPropertiesDialogClosed(), m_layerPropertiesDialogActive, m_view, KisViewManager::mainWindow(), KoDialog::minimumSizeHint(), KisBaseNode::name(), KisViewManager::nodeManager(), KisDocument::path(), KisDlgFileLayer::scaleToImageResolution(), KisDlgFileLayer::scalingFilter(), KisFileLayer::scalingFilter(), KisFileLayer::scalingMethod(), KisNodeManager::selectedNodes(), KoDialog::setCaption(), KisDlgFileLayer::setFileName(), KisDlgFileLayer::setScalingFilter(), KisDlgFileLayer::setScalingMethod(), and KisViewManager::undoAdapter().

◆ layerPropertiesDialogClosed

void KisLayerManager::layerPropertiesDialogClosed ( )
privateslot

Definition at line 393 of file kis_layer_manager.cc.

394{
396}

References m_layerPropertiesDialogActive.

◆ layerStyle

void KisLayerManager::layerStyle ( )
privateslot

Definition at line 1065 of file kis_layer_manager.cc.

1066{
1067 KisImageWSP image = m_view->image();
1068 if (!image) return;
1069
1070 KisLayerSP layer = activeLayer();
1071 if (!layer) return;
1072
1073 if (!m_view->blockUntilOperationsFinished(image)) return;
1074 if (!m_view->nodeManager()->canModifyLayer(layer)) return;
1075
1076 KoCanvasResourcesInterfaceSP canvasResourcesInterface = m_view->canvasBase()->resourceManager()->canvasResourcesInterface();
1077
1078 KisPSDLayerStyleSP oldStyle;
1079 if (layer->layerStyle()) {
1080 oldStyle = layer->layerStyle()->clone().dynamicCast<KisPSDLayerStyle>();
1081
1082 } else {
1084 ->cloneWithResourcesSnapshot(KisGlobalResourcesInterface::instance(),
1085 canvasResourcesInterface);
1086 }
1087
1088 KisPSDLayerStyleSP newStyle = oldStyle->clone().dynamicCast<KisPSDLayerStyle>();
1089 // We want to also change the UUID, else it might be considered the same style after save and won't load correctly
1090 newStyle->setUuid(QUuid::createUuid());
1091
1093
1094 std::function<void ()> updateCall(std::bind(updateLayerStyles, layer, &dlg, canvasResourcesInterface));
1095 SignalToFunctionProxy proxy(updateCall);
1096 connect(&dlg, SIGNAL(configChanged()), &proxy, SLOT(start()));
1097
1098 if (dlg.exec() == QDialog::Accepted) {
1099 KisPSDLayerStyleSP newStyle =
1100 dlg.style()->cloneWithResourcesSnapshot(KisGlobalResourcesInterface::instance(),
1101 canvasResourcesInterface);
1102
1103 KUndo2CommandSP command = toQShared(
1104 new KisSetLayerStyleCommand(layer, oldStyle, newStyle));
1105
1106 image->postExecutionUndoAdapter()->addCommand(command);
1107 }
1108}
static KisResourcesInterfaceSP instance()
KisPostExecutionUndoAdapter * postExecutionUndoAdapter() const override
KisCanvas2 * canvasBase() const
Return the canvas base class.
QPointer< KoCanvasResourceProvider > resourceManager
void updateLayerStyles(KisLayerSP layer, KisDlgLayerStyle *dlg, KoCanvasResourcesInterfaceSP canvasResourcesInterface)
QSharedPointer< T > toQShared(T *ptr)
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.

References activeLayer(), KisPostExecutionUndoAdapter::addCommand(), KisViewManager::blockUntilOperationsFinished(), KisNodeManager::canModifyLayer(), KisViewManager::canvasBase(), KisViewManager::canvasResourceProvider(), KisViewManager::image(), KisGlobalResourcesInterface::instance(), KisLayer::layerStyle, m_view, KisViewManager::nodeManager(), KisImage::postExecutionUndoAdapter(), KoCanvasBase::resourceManager, KisDlgLayerStyle::style(), toQShared(), updateLayerStyles(), and void().

◆ layersUpdated

void KisLayerManager::layersUpdated ( )
privateslot

Definition at line 970 of file kis_layer_manager.cc.

971{
972 KisLayerSP layer = activeLayer();
973 if (!layer) return;
974
975 m_view->updateGUI();
976}

References activeLayer(), m_view, and KisViewManager::updateGUI().

◆ mergeLayer

void KisLayerManager::mergeLayer ( )
privateslot

Definition at line 882 of file kis_layer_manager.cc.

883{
884 KisImageSP image = m_view->image();
885 if (!image) return;
886
887 KisLayerSP layer = activeLayer();
888 if (!layer) return;
889
890 if (!m_view->blockUntilOperationsFinished(image)) return;
891
892 QList<KisNodeSP> selectedNodes = m_view->nodeManager()->selectedNodes();
893
894 // check if all the layers are a part of a locked group
895 bool hasEditableLayer = false;
896 Q_FOREACH (KisNodeSP node, selectedNodes) {
897 if (node->isEditable(false)) {
898 hasEditableLayer = true;
899 break;
900 }
901 }
902
903 if (!hasEditableLayer) {
905 i18ncp("floating message in layer manager",
906 "Layer is locked", "Layers are locked", selectedNodes.size()),
907 QIcon(), 2000, KisFloatingMessage::Low);
908 return;
909 }
910
911 if (selectedNodes.size() > 1) {
912 image->mergeMultipleLayers(selectedNodes, m_view->activeNode());
913 }
914
915 else if (tryMergeSelectionMasks(m_view->activeNode(), image)) {
916 // already done!
917 } else if (tryFlattenGroupLayer(m_view->activeNode(), image)) {
918 // already done!
919 } else {
920
921 if (!layer->prevSibling()) return;
922 KisLayer *prevLayer = qobject_cast<KisLayer*>(layer->prevSibling().data());
923 if (!prevLayer) return;
924
925 if (prevLayer->userLocked()) {
927 i18nc("floating message in layer manager when previous layer is locked",
928 "Layer is locked"),
929 QIcon(), 2000, KisFloatingMessage::Low);
930 } else {
931 const KisMetaData::MergeStrategy* strategy = nullptr;
932
933 if (layer->metaData()->isEmpty() && prevLayer->metaData()->isEmpty()) {
935 }
936 else {
938 }
939
940 if (!strategy) return;
941
942 if (!layer->isAnimated() && prevLayer->isAnimated()) {
944 i18nc("floating message in layer manager when trying to merge a non-animated layer into an animated one",
945 "Non-animated layer is merged into the current frame. To merge it into the whole clip, create at least one frame"),
946 QIcon(), 5000, KisFloatingMessage::Medium);
947 }
948 image->mergeDown(layer, strategy);
949 }
950 }
951
952 m_view->updateGUI();
953}
void mergeMultipleLayers(QList< KisNodeSP > mergedLayers, KisNodeSP putAfter)
void mergeDown(KisLayerSP l, const KisMetaData::MergeStrategy *strategy)
static const KisMetaData::MergeStrategy * showDialog(QWidget *parent)
T get(const QString &id) const
bool tryMergeSelectionMasks(KisNodeSP currentNode, KisImageSP image)
bool tryFlattenGroupLayer(KisNodeSP currentNode, KisImageSP image)
bool isEditable(bool checkVisibility=true) const
bool userLocked() const
bool isAnimated() const
KisMetaData::Store * metaData()
KisNodeSP prevSibling() const
Definition kis_node.cpp:402

References activeLayer(), KisViewManager::activeNode(), KisViewManager::blockUntilOperationsFinished(), KisSharedPtr< T >::data(), KoGenericRegistry< T >::get(), KisViewManager::image(), KisMetaData::MergeStrategyRegistry::instance(), KisBaseNode::isAnimated(), KisBaseNode::isEditable(), KisMetaData::Store::isEmpty(), KisFloatingMessage::Low, m_view, KisViewManager::mainWindow(), KisFloatingMessage::Medium, KisImage::mergeDown(), KisImage::mergeMultipleLayers(), KisLayer::metaData(), KisViewManager::nodeManager(), KisNode::prevSibling(), KisNodeManager::selectedNodes(), KisMetaDataMergeStrategyChooserWidget::showDialog(), KisViewManager::showFloatingMessage(), tryFlattenGroupLayer(), tryMergeSelectionMasks(), KisViewManager::updateGUI(), and KisBaseNode::userLocked().

◆ pasteLayerStyle

void KisLayerManager::pasteLayerStyle ( )
privateslot

Definition at line 455 of file kis_layer_manager.cc.

456{
457 KisImageSP image = m_view->image();
458 if (!image) return;
459
460 KisLayerSP layer = activeLayer();
461 if (!layer) return;
462
463 QString aslXml;
464
465 if (KisClipboard::instance()->hasLayerStyles()) {
466 aslXml = QString::fromUtf8(QGuiApplication::clipboard()->mimeData()->data("application/x-krita-layer-style"));
467 } else {
468 aslXml = QGuiApplication::clipboard()->text();
469 }
470
471 if (aslXml.isEmpty()) return;
472
473 QDomDocument aslDoc;
474 if (!aslDoc.setContent(aslXml)) return;
475
477 serializer.registerPSDPattern(aslDoc);
478 serializer.readFromPSDXML(aslDoc);
479
480 if (serializer.styles().size() != 1) return;
481
482 KisPSDLayerStyleSP newStyle = serializer.styles().first()->cloneWithResourcesSnapshot(
484 m_view->canvasBase()->resourceManager()->canvasResourcesInterface());
485 KUndo2Command *cmd = new KisSetLayerStyleCommand(layer, layer->layerStyle(), newStyle);
486
488 image->waitForDone();
489}
QVector< KisPSDLayerStyleSP > styles() const
void readFromPSDXML(const QDomDocument &doc)
void registerPSDPattern(const QDomDocument &doc)
static KisClipboard * instance()
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...

References activeLayer(), KisViewManager::canvasBase(), KisViewManager::image(), KisGlobalResourcesInterface::instance(), KisClipboard::instance(), KisLayer::layerStyle, m_view, KisAslLayerStyleSerializer::readFromPSDXML(), KisAslLayerStyleSerializer::registerPSDPattern(), KoCanvasBase::resourceManager, KisProcessingApplicator::runSingleCommandStroke(), KisAslLayerStyleSerializer::styles(), and KisImage::waitForDone().

◆ purgeUnusedImageData

void KisLayerManager::purgeUnusedImageData ( )
privateslot

Definition at line 234 of file kis_layer_manager.cc.

235{
236 KisImageWSP image = m_view->image();
237 if (image) {
238 image->purgeUnusedData(false);
239 }
240}
void purgeUnusedData(bool isCancellable)
purge all pixels that have default pixel to free up memory
Definition kis_image.cc:875

References KisViewManager::image(), m_view, and KisImage::purgeUnusedData().

◆ saveGroupLayers

void KisLayerManager::saveGroupLayers ( )
privateslot

Definition at line 978 of file kis_layer_manager.cc.

979{
981
982 KoDialog dlg;
983 QWidget *page = new QWidget(&dlg);
984 dlg.setMainWidget(page);
985 QBoxLayout *layout = new QVBoxLayout(page);
986
987 KisFileNameRequester *urlRequester = new KisFileNameRequester(page);
988 urlRequester->setMode(KoFileDialog::SaveFile);
989 urlRequester->setStartDir(QFileInfo(m_view->document()->path()).absolutePath());
990 urlRequester->setMimeTypeFilters(listMimeFilter);
991 urlRequester->setFileName(m_view->document()->path());
992 layout->addWidget(urlRequester);
993
994 QCheckBox *chkInvisible = new QCheckBox(i18n("Convert Invisible Groups"), page);
995 chkInvisible->setChecked(false);
996 layout->addWidget(chkInvisible);
997 QCheckBox *chkDepth = new QCheckBox(i18n("Export Only Toplevel Groups"), page);
998 chkDepth->setChecked(true);
999 layout->addWidget(chkDepth);
1000
1001 if (!dlg.exec()) return;
1002
1003 QString path = urlRequester->fileName();
1004
1005 if (path.isEmpty()) return;
1006
1007 QFileInfo f(path);
1008
1009 QString mimeType= KisMimeDatabase::mimeTypeForFile(f.fileName(), false);
1010 if (mimeType.isEmpty()) {
1011 mimeType = "image/png";
1012 }
1013 QString extension = KisMimeDatabase::suffixesForMimeType(mimeType).first();
1014 QString basename = f.completeBaseName();
1015
1016 KisImageSP image = m_view->image();
1017 if (!image) return;
1018
1019 KisSaveGroupVisitor v(image, chkInvisible->isChecked(), chkDepth->isChecked(), f.absolutePath(), basename, extension, mimeType);
1020 image->rootLayer()->accept(v);
1021
1022}
qreal v
void setStartDir(const QString &path)
KisGroupLayerSP rootLayer() const
static QStringList suffixesForMimeType(const QString &mimeType)
The KisSaveGroupVisitor class saves the groups in a Krita image to separate images.
bool accept(KisNodeVisitor &v) override

References KisGroupLayer::accept(), KisViewManager::document(), KisImportExportManager::Export, KisFileNameRequester::fileName(), KisViewManager::image(), m_view, KisMimeDatabase::mimeTypeForFile(), KisDocument::path(), KisImage::rootLayer(), KoFileDialog::SaveFile, KisFileNameRequester::setFileName(), KoDialog::setMainWidget(), KisFileNameRequester::setMimeTypeFilters(), KisFileNameRequester::setMode(), KisFileNameRequester::setStartDir(), KisMimeDatabase::suffixesForMimeType(), KisImportExportManager::supportedMimeTypes(), and v.

◆ setup()

void KisLayerManager::setup ( KisActionManager * actionManager)
private

Definition at line 149 of file kis_layer_manager.cc.

150{
151 m_imageFlatten = actionManager->createAction("flatten_image");
152 connect(m_imageFlatten, SIGNAL(triggered()), this, SLOT(flattenImage()));
153
154 m_imageMergeLayer = actionManager->createAction("merge_layer");
155 connect(m_imageMergeLayer, SIGNAL(triggered()), this, SLOT(mergeLayer()));
156
157 m_flattenLayer = actionManager->createAction("flatten_layer");
158 connect(m_flattenLayer, SIGNAL(triggered()), this, SLOT(flattenLayer()));
159
160 m_groupLayersSave = actionManager->createAction("save_groups_as_images");
161 connect(m_groupLayersSave, SIGNAL(triggered()), this, SLOT(saveGroupLayers()));
162
163 m_convertGroupAnimated = actionManager->createAction("convert_group_to_animated");
164 connect(m_convertGroupAnimated, SIGNAL(triggered()), this, SLOT(convertGroupToAnimated()));
165
166 m_imageResizeToLayer = actionManager->createAction("resizeimagetolayer");
167 connect(m_imageResizeToLayer, SIGNAL(triggered()), this, SLOT(imageResizeToActiveLayer()));
168
169 KisAction *action = actionManager->createAction("trim_to_image");
170 connect(action, SIGNAL(triggered()), this, SLOT(trimToImage()));
171
172 action = actionManager->createAction("purge_unused_image_data");
173 connect(action, SIGNAL(triggered()), this, SLOT(purgeUnusedImageData()));
174
175 m_layerStyle = actionManager->createAction("layer_style");
176 connect(m_layerStyle, SIGNAL(triggered()), this, SLOT(layerStyle()));
177
178 m_copyLayerStyle = actionManager->createAction("copy_layer_style");
179 connect(m_copyLayerStyle, SIGNAL(triggered()), this, SLOT(copyLayerStyle()));
180
181 m_pasteLayerStyle = actionManager->createAction("paste_layer_style");
182 connect(m_pasteLayerStyle, SIGNAL(triggered()), this, SLOT(pasteLayerStyle()));
183}
KisAction * createAction(const QString &name)
KisAction * m_imageResizeToLayer
KisAction * m_copyLayerStyle
KisAction * m_layerStyle
KisAction * m_flattenLayer
KisAction * m_convertGroupAnimated
KisAction * m_imageFlatten
KisAction * m_pasteLayerStyle
KisAction * m_imageMergeLayer
KisAction * m_groupLayersSave

References convertGroupToAnimated(), copyLayerStyle(), KisActionManager::createAction(), flattenImage(), flattenLayer(), imageResizeToActiveLayer(), layerStyle(), m_convertGroupAnimated, m_copyLayerStyle, m_flattenLayer, m_groupLayersSave, m_imageFlatten, m_imageMergeLayer, m_imageResizeToLayer, m_layerStyle, m_pasteLayerStyle, mergeLayer(), pasteLayerStyle(), purgeUnusedImageData(), saveGroupLayers(), and trimToImage().

◆ setView()

void KisLayerManager::setView ( QPointer< KisView > view)

Definition at line 117 of file kis_layer_manager.cc.

118{
119 m_imageView = view;
120}

References m_imageView.

◆ trimToImage

void KisLayerManager::trimToImage ( )
privateslot

Definition at line 226 of file kis_layer_manager.cc.

227{
228 KisImageWSP image = m_view->image();
229 if (image) {
230 image->cropImage(image->bounds());
231 }
232}

References KisImage::bounds(), KisImage::cropImage(), KisViewManager::image(), and m_view.

◆ updateGUI()

void KisLayerManager::updateGUI ( )
private

Definition at line 185 of file kis_layer_manager.cc.

186{
187 KisImageSP image = m_view->image();
188 KisLayerSP layer = activeLayer();
189
190 const bool isGroupLayer = layer && layer->inherits("KisGroupLayer");
191
192 QString mergeLayerText;
193 if (m_view->nodeManager()->selectedNodes().size() > 1) {
194 mergeLayerText = i18nc("@action:inmenu", "Merge Selected Layers");
195 } else if (isGroupLayer) {
196 mergeLayerText = i18nc("@action:inmenu", "Merge Group");
197 } else {
198 mergeLayerText = i18nc("@action:inmenu", "Merge with Layer Below");
199 }
200 m_imageMergeLayer->setText(mergeLayerText);
201
202 m_flattenLayer->setVisible(!isGroupLayer);
203
204 if (m_view->statusBar())
205 m_view->statusBar()->setProfile(image);
206}
void setProfile(KisImageWSP image)
KisStatusBar * statusBar() const
Return the wrapper class around the statusbar.

References activeLayer(), KisViewManager::image(), m_flattenLayer, m_imageMergeLayer, m_view, KisViewManager::nodeManager(), KisNodeManager::selectedNodes(), KisStatusBar::setProfile(), and KisViewManager::statusBar().

Friends And Related Symbol Documentation

◆ KisNodeManager

friend class KisNodeManager
friend

Definition at line 44 of file kis_layer_manager.h.

Member Data Documentation

◆ m_commandsAdapter

KisNodeCommandsAdapter* KisLayerManager::m_commandsAdapter
private

Definition at line 123 of file kis_layer_manager.h.

◆ m_convertGroupAnimated

KisAction* KisLayerManager::m_convertGroupAnimated {0}
private

Definition at line 119 of file kis_layer_manager.h.

119{0};

◆ m_copyLayerStyle

KisAction* KisLayerManager::m_copyLayerStyle {0}
private

Definition at line 126 of file kis_layer_manager.h.

126{0};

◆ m_flattenLayer

KisAction* KisLayerManager::m_flattenLayer {0}
private

Definition at line 121 of file kis_layer_manager.h.

121{0};

◆ m_groupLayersSave

KisAction* KisLayerManager::m_groupLayersSave {0}
private

Definition at line 118 of file kis_layer_manager.h.

118{0};

◆ m_imageFlatten

KisAction* KisLayerManager::m_imageFlatten {0}
private

Definition at line 116 of file kis_layer_manager.h.

116{0};

◆ m_imageMergeLayer

KisAction* KisLayerManager::m_imageMergeLayer {0}
private

Definition at line 117 of file kis_layer_manager.h.

117{0};

◆ m_imageResizeToLayer

KisAction* KisLayerManager::m_imageResizeToLayer {0}
private

Definition at line 120 of file kis_layer_manager.h.

120{0};

◆ m_imageView

QPointer<KisView> KisLayerManager::m_imageView {0}
private

Definition at line 114 of file kis_layer_manager.h.

114{0};

◆ m_layerPropertiesDialogActive

bool KisLayerManager::m_layerPropertiesDialogActive {false}
private

Definition at line 129 of file kis_layer_manager.h.

129{false};

◆ m_layerStyle

KisAction* KisLayerManager::m_layerStyle {0}
private

Definition at line 125 of file kis_layer_manager.h.

125{0};

◆ m_pasteLayerStyle

KisAction* KisLayerManager::m_pasteLayerStyle {0}
private

Definition at line 127 of file kis_layer_manager.h.

127{0};

◆ m_rasterizeLayer

KisAction* KisLayerManager::m_rasterizeLayer {0}
private

Definition at line 122 of file kis_layer_manager.h.

122{0};

◆ m_view

KisViewManager* KisLayerManager::m_view
private

Definition at line 113 of file kis_layer_manager.h.


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