[calligra] krita/ui: Ask user for a file when a File Layer doesn't exist

Dmitry Kazakov dimula73 at gmail.com
Mon May 5 13:44:08 UTC 2014


Git commit 4b96de279603d93edf8d9a76cd433898c21a201a by Dmitry Kazakov.
Committed on 05/05/2014 at 13:43.
Pushed by dkazakov into branch 'master'.

Ask user for a file when a File Layer doesn't exist

TODO: we need to be able to check whether we are running inside
      of a calligraconverter or in a gui mode. Firing up message boxes
      might not be the best idea for a calligraconverter :(

BUG:333326
CCMAIL:kimageshop at kde.org

M  +1    -1    krita/ui/kis_doc2.cc
M  +7    -0    krita/ui/kis_file_layer.cpp
M  +37   -1    krita/ui/kra/kis_kra_loader.cpp

http://commits.kde.org/calligra/4b96de279603d93edf8d9a76cd433898c21a201a

diff --git a/krita/ui/kis_doc2.cc b/krita/ui/kis_doc2.cc
index 1f3e332..ee9fea6 100644
--- a/krita/ui/kis_doc2.cc
+++ b/krita/ui/kis_doc2.cc
@@ -251,7 +251,7 @@ QDomDocument KisDoc2::saveXML()
 
     root.appendChild(m_d->kraSaver->saveXML(doc, m_d->image));
     if (!m_d->kraSaver->errorMessages().isEmpty()) {
-        setErrorMessage(m_d->kraLoader->errorMessages().join(".\n"));
+        setErrorMessage(m_d->kraSaver->errorMessages().join(".\n"));
     }
 
     return doc;
diff --git a/krita/ui/kis_file_layer.cpp b/krita/ui/kis_file_layer.cpp
index 5b86e4e..5eb7170 100644
--- a/krita/ui/kis_file_layer.cpp
+++ b/krita/ui/kis_file_layer.cpp
@@ -34,6 +34,13 @@ KisFileLayer::KisFileLayer(KisImageWSP image, const QString &basePath, const QSt
     , m_filename(filename)
     , m_scalingMethod(scaleToImageResolution)
 {
+    /**
+     * Set default paint device for a layer. It will be used is case
+     * the file does not exist anymore. Or course, this can happen only
+     * in the failing execution path.
+     */
+    m_image = new KisPaintDevice(image->colorSpace());
+
     connect(&m_loader, SIGNAL(loadingFinished()), SLOT(slotLoadingFinished()));
     m_loader.setPath(path());
     m_loader.reloadImage();
diff --git a/krita/ui/kra/kis_kra_loader.cpp b/krita/ui/kra/kis_kra_loader.cpp
index 0027b7b..874e4f0 100644
--- a/krita/ui/kra/kis_kra_loader.cpp
+++ b/krita/ui/kra/kis_kra_loader.cpp
@@ -19,12 +19,17 @@
 
 #include "kra/kis_kra_loader.h"
 
+#include <QApplication>
 #include <QStringList>
 
+#include <kmessagebox.h>
+
 #include <KoStore.h>
 #include <KoColorSpaceRegistry.h>
 #include <KoColorProfile.h>
 #include <KoDocumentInfo.h>
+#include <KoFileDialog.h>
+#include <KoFilterManager.h>
 
 #include <filter/kis_filter.h>
 #include <filter/kis_filter_registry.h>
@@ -585,7 +590,38 @@ KisNodeSP KisKraLoader::loadFileLayer(const KoXmlElement& element, KisImageWSP i
         documentPath = m_d->document->url().toLocalFile();
     }
     QFileInfo info(documentPath);
-    KisLayer *layer = new KisFileLayer(image, info.absolutePath(), filename, (KisFileLayer::ScalingMethod)scalingMethod, name, opacity);
+    QString basePath = info.absolutePath();
+
+    QString fullPath = basePath + QDir::separator() + filename;
+
+    if (!QFileInfo(fullPath).exists()) {
+        QString msg = i18nc(
+            "@info",
+            "The file associated to a file layer with the name \"%1\" is not found.<nl/><nl/>"
+            "Expected path:<nl/>"
+            "%2<nl/><nl/>"
+            "Do you want to locate it manually?", name, fullPath);
+
+        int result = KMessageBox::warningYesNo(0, msg,
+                                               i18n("File not found"));
+
+        if (result == KMessageBox::Yes) {
+
+            KoFileDialog dialog(0, KoFileDialog::OpenFile, "OpenDocument");
+            dialog.setMimeTypeFilters(KoFilterManager::mimeFilter("application/x-krita", KoFilterManager::Import));
+            dialog.setDefaultDir(basePath);
+            QString url = dialog.url();
+
+            if (!QFileInfo(basePath).exists()) {
+                filename = url;
+            } else {
+                QDir d(basePath);
+                filename = d.relativeFilePath(url);
+            }
+        }
+    }
+
+    KisLayer *layer = new KisFileLayer(image, basePath, filename, (KisFileLayer::ScalingMethod)scalingMethod, name, opacity);
     Q_CHECK_PTR(layer);
 
     return layer;


More information about the kimageshop mailing list