[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-kimageshop
Subject:    [krita] /: [FEATURE] Add "convert to file layer" command to file layers.
From:       Wolthera_van_Hövell_tot_Westerflier <null () kde ! org>
Date:       2017-10-30 14:42:10
Message-ID: E1e9BGU-0000NH-2j () code ! kde ! org
[Download RAW message or body]

Git commit bb3aaece7c2e541269994e62cdd4777e32f383f2 by Wolthera van Hövell tot \
Westerflier. Committed on 30/10/2017 at 13:40.
Pushed by woltherav into branch 'master'.

[FEATURE] Add "convert to file layer" command to file layers.

This adds an action that can be triggered on any non referencing layer(so not file or \
clone layers).

This action will request a file name, and then save the layer(if a group layer, with \
everything in it) into a seperate file. It will then replace the layer in the old \
with with a file layer referencing the new file.

The idea behind this one is that if people's layer stacks become too complicated,
they can save out a section of it to a file layer, reducing the complexity of the \
document.

CCMAIL:Kimageshop@kde.org
Differential Revision: https://phabricator.kde.org/D8360

M  +12   -0    krita/krita.action
M  +2    -1    krita/krita4.xmlgui
M  +80   -0    libs/ui/kis_layer_manager.cc
M  +2    -0    libs/ui/kis_layer_manager.h
M  +4    -1    libs/ui/kis_node_manager.cpp
M  +1    -0    libs/widgets/kis_file_name_requester.cpp
M  +1    -0    plugins/dockers/defaultdockers/kis_layer_box.cpp

https://commits.kde.org/krita/bb3aaece7c2e541269994e62cdd4777e32f383f2

diff --git a/krita/krita.action b/krita/krita.action
index 3c302c1e66d..cbc3dfbe8c2 100644
--- a/krita/krita.action
+++ b/krita/krita.action
@@ -2610,6 +2610,18 @@
       <isCheckable>false</isCheckable>
       <statusTip></statusTip>
     </Action>
+    <Action name="convert_layer_to_file_layer">
+      <icon>fileLayer</icon>
+      <text>to &amp;File Layer</text>
+      <whatsThis></whatsThis>
+      <toolTip>Saves out the layers into a new image and then references that \
image.</toolTip> +      <iconText>Convert to File Layer</iconText>
+      <activationFlags>100000</activationFlags>
+      <activationConditions>0</activationConditions>
+      <shortcut></shortcut>
+      <isCheckable>false</isCheckable>
+      <statusTip></statusTip>
+    </Action>
     <Action name="import_layer_from_file">
       <icon></icon>
       <text>I&amp;mport Layer...</text>
diff --git a/krita/krita4.xmlgui b/krita/krita4.xmlgui
index 996bdb08aef..9b0513d01ce 100644
--- a/krita/krita4.xmlgui
+++ b/krita/krita4.xmlgui
@@ -2,7 +2,7 @@
 <kpartgui xmlns="http://www.kde.org/standards/kxmlgui/1.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 name="Krita"
-version="122"
+version="123"
 xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0  \
http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd">  <MenuBar>
     <Menu name="file">
@@ -197,6 +197,7 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0  \
http://www.kde.org  <Action name="convert_to_transparency_mask"/>
         <Action name="convert_to_filter_mask"/>
         <Action name="convert_to_selection_mask"/>
+        <Action name="convert_layer_to_file_layer"/>
         <Action name="convert_group_to_animated"/>
         <Action name="layercolorspaceconversion"/>
       </Menu>
diff --git a/libs/ui/kis_layer_manager.cc b/libs/ui/kis_layer_manager.cc
index 994e73c0101..d3c4cde16d4 100644
--- a/libs/ui/kis_layer_manager.cc
+++ b/libs/ui/kis_layer_manager.cc
@@ -435,6 +435,86 @@ void KisLayerManager::convertGroupToAnimated()
     m_commandsAdapter->endMacro();
 }
 
+void KisLayerManager::convertLayerToFileLayer(KisNodeSP source)
+{
+    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()) {
+        QFileInfo location = \
QFileInfo(m_view->document()->url().toLocalFile()).baseName(); +        \
location.setFile(location.dir(), location.baseName()+"_"+ source->name()+".kra"); +   \
urlRequester->setFileName(location.absoluteFilePath()); +    } else {
+        const QFileInfo location = \
QFileInfo(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); +        \
const QString proposedFileName = \
QDir(location.absoluteFilePath()).absoluteFilePath(source->name() + ".kra"); +        \
urlRequester->setFileName(proposedFileName); +    }
+
+    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";
+    }
+    QScopedPointer<KisDocument> doc(KisPart::instance()->createDocument());
+
+    QRect bounds = source->exactBounds();
+
+    KisImageSP dst = new KisImage(doc->createUndoStore(),
+                                  image->width(),
+                                  image->height(),
+                                  \
image->projection()->compositionSourceColorSpace(), +                                 \
source->name()); +    dst->setResolution(image->xRes(), image->yRes());
+    doc->setFileBatchMode(false);
+    doc->setCurrentImage(dst);
+    KisNodeSP node = source->clone();
+    dst->addNode(node);
+    dst->initialRefreshGraph();
+    dst->cropImage(bounds);
+    dst->waitForDone();
+
+    bool r = doc->exportDocumentSync(QUrl::fromLocalFile(path), \
mimeType.toLatin1()); +    if (!r) {
+        qDebug()<< "Path:"<<path;
+        qWarning() << doc->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, \
source->name(), OPACITY_OPAQUE_U8); +        fileLayer->setX(bounds.x());
+        fileLayer->setY(bounds.y());
+        KisNodeSP dstParent = source->parent();
+        KisNodeSP dstAboveThis = source->prevSibling();
+        m_commandsAdapter->beginMacro(kundo2_i18n("Convert to a file layer"));
+        m_commandsAdapter->removeNode(source);
+        m_commandsAdapter->addNode(fileLayer, dstParent, dstAboveThis);
+        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_layer_manager.h b/libs/ui/kis_layer_manager.h
index 15b8b3ef375..17f9d9cdaf9 100644
--- a/libs/ui/kis_layer_manager.h
+++ b/libs/ui/kis_layer_manager.h
@@ -91,6 +91,8 @@ private Q_SLOTS:
     void convertNodeToPaintLayer(KisNodeSP source);
     void convertGroupToAnimated();
 
+    void convertLayerToFileLayer(KisNodeSP source);
+
     KisLayerSP addLayer(KisNodeSP activeNode);
     void addGroupLayer(KisNodeSP activeNode);
 
diff --git a/libs/ui/kis_node_manager.cpp b/libs/ui/kis_node_manager.cpp
index e055b70e5d8..0f70ccc11cf 100644
--- a/libs/ui/kis_node_manager.cpp
+++ b/libs/ui/kis_node_manager.cpp
@@ -346,6 +346,8 @@ void KisNodeManager::setup(KActionCollection * actionCollection, \
KisActionManage  
     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 &)));
 
@@ -589,7 +591,8 @@ void KisNodeManager::convertNode(const QString &nodeType)
 
         m_d->commandsAdapter.removeNode(activeNode);
         m_d->commandsAdapter.endMacro();
-
+    } else if (nodeType == "KisFileLayer") {
+            m_d->layerManager.convertLayerToFileLayer(activeNode);
     } else {
         warnKrita << "Unsupported node conversion type:" << nodeType;
     }
diff --git a/libs/widgets/kis_file_name_requester.cpp \
b/libs/widgets/kis_file_name_requester.cpp index 966cc469995..3942e80a1f3 100644
--- a/libs/widgets/kis_file_name_requester.cpp
+++ b/libs/widgets/kis_file_name_requester.cpp
@@ -49,6 +49,7 @@ void KisFileNameRequester::setStartDir(const QString &path)
 void KisFileNameRequester::setFileName(const QString &path)
 {
     m_ui->txtFileName->setText(path);
+    m_basePath = path;
     emit fileSelected(path);
 }
 
diff --git a/plugins/dockers/defaultdockers/kis_layer_box.cpp \
b/plugins/dockers/defaultdockers/kis_layer_box.cpp index e0664604ac8..57fd8b7ad84 \
                100644
--- a/plugins/dockers/defaultdockers/kis_layer_box.cpp
+++ b/plugins/dockers/defaultdockers/kis_layer_box.cpp
@@ -621,6 +621,7 @@ void KisLayerBox::slotContextMenuRequested(const QPoint &pos, \
                const QModelIndex
                 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");


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic