diff --git a/krita/krita.action b/krita/krita.action
--- a/krita/krita.action
+++ b/krita/krita.action
@@ -2610,6 +2610,18 @@
false
+
+ fileLayer
+ to &File Layer
+
+ Saves out the layers into a new image and then references that image.
+ Convert to File Layer
+ 100000
+ 0
+
+ false
+
+
I&mport Layer...
diff --git a/krita/krita4.xmlgui b/krita/krita4.xmlgui
--- a/krita/krita4.xmlgui
+++ b/krita/krita4.xmlgui
@@ -2,7 +2,7 @@
diff --git a/libs/ui/kis_layer_manager.h b/libs/ui/kis_layer_manager.h
--- a/libs/ui/kis_layer_manager.h
+++ b/libs/ui/kis_layer_manager.h
@@ -91,6 +91,8 @@
void convertNodeToPaintLayer(KisNodeSP source);
void convertGroupToAnimated();
+ void convertLayerToFileLayer();
+
KisLayerSP addLayer(KisNodeSP activeNode);
void addGroupLayer(KisNodeSP activeNode);
@@ -123,6 +125,7 @@
KisAction *m_imageResizeToLayer;
KisAction *m_flattenLayer;
KisAction *m_rasterizeLayer;
+ KisAction *m_convertLayerFileLayer;
KisNodeCommandsAdapter* m_commandsAdapter;
KisAction *m_layerStyle;
diff --git a/libs/ui/kis_layer_manager.cc b/libs/ui/kis_layer_manager.cc
--- a/libs/ui/kis_layer_manager.cc
+++ b/libs/ui/kis_layer_manager.cc
@@ -179,6 +179,9 @@
m_convertGroupAnimated = actionManager->createAction("convert_group_to_animated");
connect(m_convertGroupAnimated, SIGNAL(triggered()), this, SLOT(convertGroupToAnimated()));
+ m_convertLayerFileLayer = actionManager->createAction("convert_layer_to_file_layer");
+ connect(m_convertLayerFileLayer, SIGNAL(triggered()), this, SLOT(convertLayerToFileLayer()));
+
m_imageResizeToLayer = actionManager->createAction("resizeimagetolayer");
connect(m_imageResizeToLayer, SIGNAL(triggered()), this, SLOT(imageResizeToActiveLayer()));
@@ -435,6 +438,87 @@
m_commandsAdapter->endMacro();
}
+void KisLayerManager::convertLayerToFileLayer()
+{
+ KisImageSP image = m_view->image();
+ if (!image) return;
+
+ QStringList listMimeFilter = KisImportExportManager::mimeFilter(KisImportExportManager::Export);
+
+ KoDialog dlg;
+ QWidget *page = new QWidget(&dlg);
+ dlg.setMainWidget(page);
+ QBoxLayout *layout = new QVBoxLayout(page);
+ dlg.setWindowTitle(i18n("Save layers to..."));
+ QLabel *lbl = new QLabel(i18n("Choose the location where the layer will be saved to. The new file layer will then reference this location."));
+ lbl->setWordWrap(true);
+ layout->addWidget(lbl);
+ KisFileNameRequester *urlRequester = new KisFileNameRequester(page);
+ urlRequester->setMode(KoFileDialog::SaveFile);
+ urlRequester->setMimeTypeFilters(listMimeFilter);
+ urlRequester->setFileName(m_view->document()->url().toLocalFile());
+ if (m_view->document()->url().isLocalFile()) {
+ urlRequester->setStartDir(QFileInfo(m_view->document()->url().toLocalFile()).absolutePath());
+ QFileInfo location = QFileInfo(m_view->document()->url().toLocalFile()).baseName();
+ location.setFile(location.dir(), location.baseName()+"_"+activeLayer()->name()+".kra");
+ urlRequester->setFileName(location.absoluteFilePath());
+ } else {
+ QFileInfo location = QFileInfo(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
+ urlRequester->setStartDir(location.absolutePath());
+ urlRequester->setFileName(activeLayer()->name()+".kra");
+ }
+
+ layout->addWidget(urlRequester);
+ if (!dlg.exec()) return;
+
+ QString path = urlRequester->fileName();
+
+ if (path.isEmpty()) return;
+
+ QFileInfo f(path);
+
+ QString mimeType= KisMimeDatabase::mimeTypeForFile(f.fileName());
+ if (mimeType.isEmpty()) {
+ mimeType = "image/png";
+ }
+
+ KisNodeSP layer = activeLayer();
+ QScopedPointer doc(KisPart::instance()->createDocument());
+
+ QRect bounds = activeLayer()->exactBounds();
+
+ KisImageSP dst = new KisImage(doc->createUndoStore(),
+ image->width(),
+ image->height(),
+ image->projection()->compositionSourceColorSpace(),
+ layer->name());
+ dst->setResolution(image->xRes(), image->yRes());
+ doc->setFileBatchMode(false);
+ doc->setCurrentImage(dst);
+ KisNodeSP node = layer->clone();
+ dst->addNode(node);
+ dst->initialRefreshGraph();
+ dst->cropImage(bounds);
+ dst->waitForDone();
+
+ bool r = doc->exportDocumentSync(QUrl::fromLocalFile(path), mimeType.toLatin1());
+ if (!r) {
+ qDebug()<< "Path:"<errorMessage();
+ } else {
+ QString basePath = QFileInfo(m_view->document()->url().toLocalFile()).absolutePath();
+ QString relativePath = QDir(basePath).relativeFilePath(path);
+ KisFileLayer *fileLayer = new KisFileLayer(image, basePath, relativePath, KisFileLayer::None, layer->name(), OPACITY_OPAQUE_U8);
+ fileLayer->setX(bounds.x());
+ fileLayer->setY(bounds.y());
+ m_commandsAdapter->beginMacro(kundo2_i18n("Convert to a file layer"));
+ m_commandsAdapter->addNode(fileLayer, layer->parent(), layer);
+ m_commandsAdapter->removeNode(layer);
+ m_commandsAdapter->endMacro();
+ }
+ doc->closeUrl(false);
+}
+
void KisLayerManager::adjustLayerPosition(KisNodeSP node, KisNodeSP activeNode, KisNodeSP &parent, KisNodeSP &above)
{
Q_ASSERT(activeNode);
diff --git a/libs/ui/kis_node_manager.cpp b/libs/ui/kis_node_manager.cpp
--- a/libs/ui/kis_node_manager.cpp
+++ b/libs/ui/kis_node_manager.cpp
@@ -346,6 +346,8 @@
CONVERT_NODE_ACTION("convert_to_animated", "animated");
+ CONVERT_NODE_ACTION_2("convert_layer_to_file_layer", "KisFileLayer", QStringList()<< "KisFileLayer" << "KisCloneLayer");
+
connect(&m_d->nodeConversionSignalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(convertNode(const QString &)));
diff --git a/plugins/dockers/defaultdockers/kis_layer_box.cpp b/plugins/dockers/defaultdockers/kis_layer_box.cpp
--- a/plugins/dockers/defaultdockers/kis_layer_box.cpp
+++ b/plugins/dockers/defaultdockers/kis_layer_box.cpp
@@ -621,6 +621,7 @@
addActionToMenu(convertToMenu, "convert_to_transparency_mask");
addActionToMenu(convertToMenu, "convert_to_filter_mask");
addActionToMenu(convertToMenu, "convert_to_selection_mask");
+ addActionToMenu(convertToMenu, "convert_layer_to_file_layer");
QMenu *splitAlphaMenu = menu.addMenu(i18n("S&plit Alpha"));
addActionToMenu(splitAlphaMenu, "split_alpha_into_mask");