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 @@ @@ -197,6 +197,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,83 @@ 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()); + } + + 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");