File indexing completed on 2024-05-12 15:59:05

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "FileLayer.h"
0007 #include <kis_file_layer.h>
0008 #include <kis_image.h>
0009 #include <QFileInfo>
0010 #include <QDir>
0011 
0012 FileLayer::FileLayer(KisImageSP image, const QString name, const QString baseName, const QString fileName, const QString scalingMethod, QObject *parent)
0013     : Node(image, new KisFileLayer(image, name, OPACITY_OPAQUE_U8), parent)
0014 {
0015     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0016     KIS_ASSERT(file);
0017     KisFileLayer::ScalingMethod sm = KisFileLayer::None;
0018     if (scalingMethod=="ToImageSize") {
0019         sm= KisFileLayer::ToImageSize;
0020     } else if (scalingMethod=="ToImagePPI") {
0021         sm= KisFileLayer::ToImagePPI;
0022     }
0023     file->setScalingMethod(sm);
0024 
0025     const QString &basePath = QFileInfo(baseName).absolutePath();
0026     const QString &absoluteFilePath = QFileInfo(fileName).absoluteFilePath();
0027     file->setFileName(basePath, getFileNameFromAbsolute(basePath, absoluteFilePath));
0028 }
0029 
0030 FileLayer::FileLayer(KisFileLayerSP layer, QObject *parent)
0031     : Node(layer->image(), layer, parent)
0032 {
0033 
0034 }
0035 
0036 FileLayer::~FileLayer()
0037 {
0038 
0039 }
0040 
0041 QString FileLayer::type() const
0042 {
0043     return "filelayer";
0044 }
0045 
0046 void FileLayer::setProperties(QString fileName, QString scalingMethod)
0047 {
0048     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0049     KIS_ASSERT(file);
0050     KisFileLayer::ScalingMethod sm = KisFileLayer::None;
0051     if (scalingMethod.toLower() == "toimagesize") {
0052         sm= KisFileLayer::ToImageSize;
0053     } else if (scalingMethod.toLower() == "toimageppi") {
0054         sm= KisFileLayer::ToImagePPI;
0055     }
0056     file->setScalingMethod(sm);
0057 
0058     const QString basePath = QFileInfo(file->path()).absolutePath();
0059     const QString absoluteFilePath = QFileInfo(fileName).absoluteFilePath();
0060     file->setFileName(basePath, getFileNameFromAbsolute(basePath, absoluteFilePath));
0061 }
0062 
0063 void FileLayer::resetCache()
0064 {
0065     KisFileLayer *file = dynamic_cast<KisFileLayer*>(this->node().data());
0066     KIS_ASSERT_RECOVER_RETURN(file);
0067     file->resetCache();
0068 }
0069 
0070 QString FileLayer::path() const
0071 {
0072     const KisFileLayer *file = qobject_cast<const KisFileLayer*>(this->node());
0073     KIS_ASSERT(file);
0074     return file->path();
0075 }
0076 
0077 QString FileLayer::scalingMethod() const
0078 {
0079     const KisFileLayer *file = qobject_cast<const KisFileLayer*>(this->node());
0080     KIS_ASSERT_RECOVER_RETURN_VALUE(file, "None");
0081     KisFileLayer::ScalingMethod sm = file->scalingMethod();
0082     QString method = "None";
0083 
0084     if (sm==KisFileLayer::ToImageSize) {
0085         method = "ToImageSize";
0086     } else if (sm==KisFileLayer::ToImagePPI) {
0087         method = "ToImagePPI";
0088     }
0089     return method;
0090 }
0091 
0092 QString FileLayer::getFileNameFromAbsolute(const QString &basePath, QString filePath)
0093 {
0094     KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(QFileInfo(filePath).isAbsolute(), filePath);
0095 
0096     // try to resolve symlink
0097     {
0098         const QFileInfo fi(filePath);
0099         if (fi.isSymLink()) {
0100             filePath = fi.symLinkTarget();
0101         }
0102     }
0103 
0104     if (!basePath.isEmpty()) {
0105         QDir directory(basePath);
0106         filePath = directory.relativeFilePath(filePath);
0107     }
0108 
0109     return filePath;
0110 }
0111 
0112